Git 代码分支管理 / 版本管理

2023-11-08

Git 代码分支管理 / 版本管理

在使用 Git 时,基本不可能只有一个分支。

即使只有一个人发开,也会考虑代码的安全而分多个分支。多人协同开发时,可能每个人在不同的分支开发,也可能不同团队在不同的分支开发,还有就是不同的功能在不同的分支开发。

划分分支的方式根据不同的企业和项目而不同,以需求为导向。

一、git 分支管理

1. 状态描述

本文中,在 Github 上托管了项目 GitProject 的代码,在本地 Windows 中创建了本地代码仓库 ~/Desktop/git_project/GitProject 。当前只有一个分支 master ,提交了3次代码,项目中只有一个 git.py 文件。

2. 创建本地分支

一开始,本地只有一个分支 master 。

这时候切到其他分支,会报错,因为分支根本不存在。使用 git branch release 创建一个名字叫 release 的分支,然后使用 git branch 查看,当前新增了一个分支,但是还处于 mster 分支上(绿色)。

使用 git checkout release 切换到 release 上,再使用 git branch 查看,当前已经处于 release 分支上了。

使用 git checkout -b dev1 创建并切换到 dev1 分支上,相当于 git branch dev1 和 git checkout dev1 两条命令。

# 查看当前分支
git branch
# 查看所有分支,包括远程分支
git branch -a
# 切换分支
git checkout release
# 创建并切换分支
git checkout -b dev1

3. 创建远程分支

在本地仓库创建分支后,到远程仓库查看,本地分支还没有同步到远程仓库,因为没有用新创建的分支提交过代码。

在 Github 上点击 Branch 按钮,然后输入要创建的分支名,如 bugfix ,然后点击 Create branch bugfix 按钮创建分支。

创建之后,页面会自动刷新,刷新后,可以看到当前处于新创建的 bugfix 分支上,现在分支数已经变成两个了。

再回到本地,本地看不到在 Github 上新建的分支,使用 git fetch origin 可以获取远程的代码或分支的更新。

执行命令后,重新使用 git branch -a ,可以查看到远程新创建的分支。

4.代码合并

现在在dev1上开发代码,然后提交到远程仓库。

当使用本地分支提交代码后,本地分支会同步到远程仓库。在之前没有使用过dev1分支提交过代码,在远程仓库上没有dev1,现在远程库上可以看到dev1分支,并且有4次提交。

现在选择到master分支,看到master分支的代码还是3次提交,刚才在dev1分支提交的代码不会影响到master分支,是独立的。

现在,比如说在dev1开发一个功能,这个功能在dev1上验证通过了,要合入master,可以使用 git merge 来实现。

# 切换到主分支
git checkout master
# 合并dev1到master
git merge dev1

合并dev1的代码到master后,代码处于仓库区待 push 状态,可以看到,当前本地仓库领先远程代码仓库一次提交,使用 git push origin master 将代码提交到远程仓库。

提交代码后,远程仓库中的master分支也变成了4次提交,代码合并成功。

在合并代码的时候,(或多人在同一个分支上开发),很容易出现代码冲突。

当出现代码冲突,会有很多情况,保留一方的代码放弃另一方的代码,或双方都可以保留,或双方都需要修改,这个过程要找相关的人来一起讨论方案,找能决策的人来决定。

以上就是常见的分支管理操作了。

二、git 版本管理

在使用 git 提交代码时,每次 commit 都会生成唯一的版本号,回退版本,创建分支等操作都可以使用到具体的版本号,来按需找到对应的代码状态。

但是,commit 生成的版本号是一个 hash 值,对于程序员来说,不可能去记忆 hash 值版本号。

当项目开发到了阶段性时刻,这个阶段是项目的一个里程碑,这次提交的代码版本是比较特殊的,需要经常使用这个版本,不可能每次都去找 hash 值的版本号。

git 可以通过 git tag 来给项目打标签,定义版本号,更方便的进行版本管理。

# 给项目打标签,git tag -a 标签名 -m "信息"
git tag -a V0.1.0 -m "GitProject Version 0.1.0"
# 将标签提交到远程仓库,git push origin 标签名
git push origin V0.1.0

现在,给 GitProject 这个项目打第一个标签 V0.1.0,相当于生成第一个版本号。这个版本号的命名规则可以自定义,根据自己的项目来定义。

将标签 git push 将标签推到远程仓库后,可以在远程仓库看到对应的版本号。

通常,版本号的命名可以参考如下方式:

1.分成三段,中间用点分开,第一段是主版本号,第二段是子版本号,第三段是阶段版本号。阶段版本号更新一般是修复故障时,子版本号更新一般是向下兼容的接口变更时,主版本号更新一般是不兼容的接口变更时。不过,不是必须这样,在实际的项目中,可以灵活自由一点,最开始一般是V0.0.0或V1.0.0。

2.当正常开发有阶段性进展,需要做里程碑标记时,可以在子版本号处加1,加1后,后面的阶段版本号归0,如从V0.0.0变成V0.1.0 。

3.当版本里面有故障等需要修复时,修复后可以在阶段版本号处加1,如从V0.1.0变成V0.1.1 。

4.当有新功能上线时,可以在子版本号处加1,加1后,后面的阶段版本号归0,如从V0.1.1变成V0.2.0 。

5.当项目积累了非常多的修改和新功能,已经发生了很大的变更了,需要升主版本号,则主版本号加1,加1后,后面的子版本号和阶段版本号都归0。如在V0开发了很久,已经到了 V0.15.7,现在版本要升到V1,就是V0.15.7变成V1.0.0 。

如果打的标签不需要保留,可以删除标签。

# 删除本地标签
git tag -d 标签名
# 删除远程标签
git push origin --delete tag 标签名

这样,可以很方便的对项目进行版本管理了。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git 代码分支管理 / 版本管理 的相关文章

  • Django 模型(model)

    目录 前言 一 Django ORM 什么是ORM ORM 解析过程 ORM 对应关系表 二 数据库配置 Django 如何使用 mysql 数据库 三 定义模型 创建 APP 四 定义模型类 数据库表名 关于主键 属性命名限制 字段类型
  • 二、【React拓展】懒加载 lazy

    文章目录 1 适用点 2 汇总 1 适用点 懒加载往往配合路由一起使用 此处修改的项目是 二 React Router5 路由的基本使用 中的项目 首先从react中引入lazy import lazy from react 修改引入路由组
  • 【Windows API】获取卷标、卷名

    1 卷 gt 卷标 使用FindFirstVolume 和FindNextVolume 函数体系 枚举系统所有卷 Volume 的例子 然后获取卷标 卷类型 这个方式可以枚举出没有驱动器号 卷标 的卷 int TestMode1 HANDL
  • 国信证券笔试题总分120分

    国信证券笔试题总分120分 1 选择题60分 20题 单选 10 每题3分 多选 10 每题3分 2 业务题 每题4分总共20分 2 1 post get请求区别 后退按钮 刷新 无害 数据会被重新提交 浏览器应该告知用户数据会被重新提交
  • 微软DeepSpeed Chat震撼发布,一键RLHF训练千亿级大模型

    一键解锁千亿级ChatGPT 轻松省钱15倍 众所周知 由于OpenAI太不Open 开源社区为了让更多人能用上类ChatGPT模型 相继推出了LLaMa Alpaca Vicuna Databricks Dolly等模型 但由于缺乏一个支
  • PostgreSQL数据库性能监控手段之慢SQL、死锁

    之前接触PostgreSQL数据库甚少 此前经常使用mysql db2 直至入职当前某安全公司后 发现数据库都采用PostgreSQL 由于负责性能测试方向 经常需要诊断数据库方面是否存在性能问题 于是整理了PostgreSQL设置慢SQL
  • 接口调用失败,失败原因:在 ServiceModel 客户端配置部分中,找不到引用协定的默认终结点元素

    我的程序中 已经配置了webserivce了 但是无法再开发环境使用 我想拿到测试环境使用 而webservice又只能在开发环境调用 这个时候 为了解决这种尴尬问题 我只能先将就着用开发时的webservice 在我的web config
  • 18款最佳Bug跟踪管理系统

    对于开发者来说 Bug 往往是他们最头疼的问题 有些 Bug 会隐藏的很深 很难发现 甚至用户已经使用了才出现 这样真是赔了名声又折钱 为了让开发者更早地发现和消灭 Bug 本文收集了 18 款最佳的 Bug 处理应用程序 这些系统有收费也
  • 本地文件上传到linux服务器的几种方法

    本文介绍几种常见的方法 把文件上传到Linux服务器中 飓风科技常见有使用 scp命令 xshell软件里的xftp程序 U盘挂载 服务器自带的lrzsz程序 一 scp使用说明 1 把本机的文件传给目的服务器 1scp get66 pca
  • Linux 安装/卸载 Minio

    安装 创建目录 root t2 local mkdir minio root t2 local cd minio root t2 minio mkdir data 下载 root t2 minio wget https dl min io
  • vue + iview项目构建

    vue js官网 iview vue cli PS vue js有著名的全家桶系列 包含了vue router vuex vue resource 再加上构建工具vue cli 就是一个完整的vue项目的核心构成 使用Vue cli是快速构
  • OAuth2.0 - 刷新令牌

    刷新令牌 Refresh Token 刷新令牌是用于获取访问令牌的凭据 刷新令牌由授权服务器颁发给客户端 用于在当前访问令牌失效或过期时获取新的访问令牌 或者获取具有相同或更窄范围的附加访问令牌 访问令牌可能具有更短的范围 生命周期和少于资
  • Long、Integer、Byte, Double, Float或 Short类型的比较

    开发遇到的一些基础问题 记录一下 场景 比较Long类型的大小 错误用法 或者 正确用法 Long compareTo 解释 Long是一个引用类型 不能通过 进行比较大小 基本数据类型才可以 对于Long Integer Byte Dou
  • 关于java后端Long类型传递雪花ID到前端导致精度不一致和数据不一致问题

    我们数据库使用的是Bigint存放的是雪花ID 我们java实体类使用的是Long类型 我们后端查询的数据库跟我们返回到前端的ID数据不一致 问题 我们数据库存放的是雪花ID java的Long类型可以取值 但是JSON序列号的时候就超过取
  • 深度学习面试:用猫和狗的数据做图像分类,分类的效果不好怎么办?

    首先 我们可以通过训练集和测试集的误差曲线来判断 1 如果训练集精度和测试集精度都不高 则曲线符合欠拟合的表现 1 数据 数据集有较多的标注错误 2 训练模型 可以更换模型 增加训练轮次 减小学习率或使用衰减学习率等方式进行改善 2 如果测
  • 测试工程师须知——自动化测试主要分为哪几类

    近几年随的技术加快前进 人工智能已经悄然无息的来到了我们的身边 可谓是不管是生活 工作等等的一切什么都有人工智能的出现 那对于IT行业或者更详细点的说对于软件测试这一职位是种什么样的变化呢 一 什么自动化测试 什么是自动化测试 这个问题可能
  • stm32f103编写GPIO初始化结构体和初始化函数

    初始化结构体 typedef struct uint16 t GPIO Pin uint16 t GPIO Speed uint16 t GPIO Mode GPIO InitTypeDef 里面有端口 模式和输出模式时的最大速度 再通过两
  • 深入理解Java虚拟机

    什么是Java虚拟机 作为一个Java程序员 我们每天都在写Java代码 我们写的代码都是在一个叫做Java虚拟机的东西上执行的 但是如果要问什么是虚拟机 恐怕很多人就会模棱两可了 在本文中 我会写下我对虚拟机的理解 因为能力所限 可能有些

随机推荐

  • JNI问题

    1 jbyte不能直接替换uint8 t
  • Ubuntu测试使用速腾RS-Lidar-16

    一 获取代码 在想放代码的地方创建文件夹 建议在主目录中 打开终端 输入 mkdir p lidar src cd lidar src git clone https github com RoboSense LiDAR rslidar s
  • mybatis-generator结合freemarker生成简单的service

    首先附上项目的github地址 点击打开链接 第一步 在generatorConfig xml里添加标签 点击进入xml文件对应的dtd文件 在contex那添加需要的标签
  • apisix网关+golang服务 jwt验证

    golang服务使用jwt生成token apisix解析并验证token 1 配置apisix网关jwt 1 在 apisix dashboard 中 新建路由 2 新建路由时开启jwt插件 3 配置jwt插件 algorithm HS2
  • dpdk+ovs安装和编译(一)

    绑定前网卡驱动 root localhost ethtool i enp5s0 driver hinic version firmware version expansion rom version bus info 0000 05 00
  • 学英语的好电影

    1 阿甘正传 FORREST GUMP 主演 Tom Hanks 汤姆 汉克斯 2 电子情书 YOU VE GOT MAIL 主演 Tom Hanks 汤姆 汉克斯 Meg Ryan 梅格 瑞安 3居家男人 THE FAMILY MAN 主
  • 在Vue中将单独一张图片设为背景图并充满整个屏幕

    Vue基础知识 将单独一张图片设为背景图并充满整个屏幕 代码如下 在主div中添加样式 background url xx images 图片名字 jpg 这里的地址是用你项目中图片所在的路径为准 background repeat no
  • 谁拿了最多奖学金

    import java util ArrayList import java util Collections import java util List import java util Scanner public class Main
  • Ubuntu安装配置Samba服务

    一 什么是Samba Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件 由服务器及客户端程序构成 SMB Server Messages Block 信息服务块 是一种在局域网上共享文件和打印机的一种通信协议 它为局域网
  • 如何判断项目有没有用ajax,项目中关于AJAX的使用总结

    一 使用情况 AJAX 是与服务器交换数据并更新部分网页的艺术 在不重新加载整个页面的情况下使用 AJAX的核心 向服务器发送多个请求而无需用户等待来至服务器的响应 二 AJAX的优势 1 异步加载数据 无需切换页面 不需要刷新 2 更佳的
  • 【linux 】添加开机启动项的方法

    目录 linux 添加开机启动项的方法 编辑文件 etc rc local 在 etc init d目录下添加自启动脚本 每次登录自动执行 通过chkconfig命令设置 把脚本注册为系统服务 在crontab中设置 没试过 Linux目录
  • 流程引擎(flowable)之用户任务

    代码示例 查询一个任务并审批 Task task configuration getTaskService createTaskQuery taskAssignee kermit singleResult if StringUtils is
  • Ubuntu18.04软件源修改成国内镜像源

    Ubuntu18 04软件源修改成国内镜像源 修改sources list文件 文件在 etc apt目录下 操作需要root权限 记得加上sudo sudo vim etc apt sources list 添加科大镜像源 在文件最下面加
  • UITabBarController的使用详解及其自定义

    转载自 https www jianshu com p 2f74a5d93faa 简介 UITabBarController 选项卡控制器 与导航控制器一样 也被广泛用于各种ios应用程序 顾名思义 选项卡控制器在屏幕底部显示一系列 选显卡
  • java使用URLconnection下载文件 getContentLength()为-1 的解决办法

    一 起因 APP想要从远程服务器下载一个文件 不想使用网络请求框架 想了解一下原生的实现 于是简单了解了一下URLconnection类的使用 加上参考了网络上的实现 简单实现了文件下载操作 代码如下 long downloadLength
  • angular自定义实现管道

    参考angular官方文档 角 管 angular io 选择 描述 name 要在模板绑定中使用的管道名称 通常使用较小的驼峰大小写 因为名称不能包含连字符 pure 如果为 true 则管道是纯的 这意味着仅当该方法的输入参数时才调用该
  • Visual Studio Code 手动导入 jar包

    前言 为了方便调试 ModBus库包 使用 VSCode 搭建 Java 开发环境 安装过程中的一些问题 JDK 和 JRE 版本不兼容 卸载 原JDK 和 JRE 使用 jdk 8u221 windows x64 安装 安装过程中会让你安
  • Vuforia Virtual Button(虚拟按钮)案例二——按钮事件处理

    一 利用Unity3d进行开发 查看这个脚本 是对虚拟按钮的事件进行监听控制 相应地修改按钮的触发事件可以通过这个类进行 Add the material corresponding to this virtual button to th
  • AI AIgents时代-(四.)应用上手

    HuggingGPT MetaGPT HuggingGPT HuggingGPT是一个多模型调用的 Agent 框架 利用 ChatGPT 作为任务规划器 根据每个模型的描述来选择 HuggingFace 平台上可用的模型 最后根据模型的执
  • Git 代码分支管理 / 版本管理

    Git 代码分支管理 版本管理 在使用 Git 时 基本不可能只有一个分支 即使只有一个人发开 也会考虑代码的安全而分多个分支 多人协同开发时 可能每个人在不同的分支开发 也可能不同团队在不同的分支开发 还有就是不同的功能在不同的分支开发