更新时间:2023-07-25 GMT+08:00

分支管理

什么是分支?

分支是版本管理工具中最常用的一种管理手段,使用分支可以把项目开发中的几项工作彼此隔离开来使其互不影响,当需要发布版本之前再通过分支合并将其进行整合。

在代码托管服务/Git仓库创建之初都会默认生成一条名为master的分支,一般作为最新版本分支使用,开发者可以随时手动创建自定义分支以应对实际开发中的个性场景。

基于Git分支的经典工作模式

在基于分支的代码管理工作模式中,“Git-Flow”在业界被更多人认可,同时也被广泛应用,如果您的团队目前还没有更好的工作模式,可以先从尝试使用“Git-Flow”开始。

Git-Flow是一种基于Git的代码管理工作模式,它提供了一组分支使用建议,可以帮助团队提高效率、减少代码冲突,其具备以下特性。
  • 并行开发:支持多个特性与bug修复并行开发,因其可以同时在不同分支中进行,所以在代码写作时互不受影响。
  • 团队协作:多人开发过程中,每条分支(可以理解为每个子团队)的开发内容可以被单独记录、合并到项目版本中,当出现问题时还可被精确检出并单独修改而不影响主版本的其它代码。
  • 灵活调整:通过“快速修复(hotfix)” 分支的使用,支持各种紧急修复的情况,而不会对主版本以及各个团队的子项目产生干扰影响。
    表1 Git-Flow工作模式中分支的使用建议

    分支名

    说明

    有效性

    何时被创建

    何时直接在此分支上开发

    何时被其它分支合入

    何时合入到其它分支

    何时结束生命周期

    master

    核心分支,配合标签,用于归档历史版本,要保证其中的版本都是可用的

    长期存在

    项目仓库建立之初

    从不

    • 项目版本封版时,被develop或release分支合入
    • 已发布版本中发现的bug被修复后,被对应的hotfix分支合入

    _

    _

    develop

    开发主分支,用于平时开发的主分支,应永远是功能最新最全的分支

    长期存在

    在master分支被创建之后

    一般不建议

    • 新特性开发完成后,feature分支合入到此分支
    • 当项目启动开发一个新版本时,被上一次历史发布版本(release、或master)合入
    • 当要发布版本时,合入到release分支
    • 当需要归档版本时合入到master分支

    _

    feature_1\2\3...

    新特性开发分支,用于开发某个新特性,可以几条并行存在,每条对应一个或一组新特性

    临时

    • 收到新特性任务时,基于develop分支创建
    • 当正在开发的新特性任务被拆分成出子任务时,基于对应的母feature分支创建

    当被创建出来,开始开发新特性时

    子feature分支开发、测试完成后,会合入到母feature分支

    当该分支上的新特性开发、测试完成时,合入到develop分支

    其对应的特性已经验收(发布、稳定)后

    release

    发布分支,用于检出某个要发布的版本

    长期存在

    项目首次发布前,基于develop分支创建

    从不

    当需要发布一个版本时,被develop分支合入

    • 当完成一次版本发布,将该版本归档时,合入到master分支
    • 当要基于某一个发布版本,开始开发一个新版本时,合入到develop分支,起到初始化版本的作用

    _

    hotfix_bug1\bug2...

    快速修复分支,用于当现网版本发现bug时,拉出来单独用于修复这些bug的分支

    临时

    当master、bug版本中发现问题时,基于对应版本(一般是master分支)创建

    当被建立出来时

    _

    当其对应的bug修复任务完成时,会将其作为修复补丁合入master、develop分支

    其对应的bug修复,已经验收(发布、稳定)后

    另外在使用Git-Flow工作模式时,业界普遍遵循如下规则:

    • 所有开发分支从develop分支拉取。
    • 所有 hotfix 分支从master拉取。
    • 所有在master上的提交都必须要有标签,方便回滚。
    • 只要有合并到master分支的操作,都需要和develop分支合并,保证同步。
    • master和develop分支是主要分支,二者都是唯一的,其它派生分支每个类型可以同时存在多个。

在控制台上新建分支

  1. 进入仓库列表。
  2. 单击仓库名称进入仓库详情。
  3. 切换到“分支”页签,在这里可以看到目前远程仓库中的分支列表
  4. 单击“新建分支”按钮,在弹出的窗口中选择要基于哪个版本(分支或标签)进行创建,填写新分支的名称,并且可关联现有工作项。
  5. 单击“确定”按钮,即可完成分支的新建并返回分支列表。

在控制台中管理分支

在控制台的分支列表中可以进行如下操作。

  • 分支筛选
    • 所有分支:显示所有分支,“默认分支”将显示在最前面,其余分支按最近提交时间排序,最新提交的分支将更靠前。
    • 活跃分支:显示过去三个月内存在开发活动的分支,按最近提交时间排序,最新提交的分支将更靠前。
    • 过时分支:显示过去三个月内没有任何活动的分支,按最近提交时间排序,最新提交的分支将更靠前。
  • 单击某个“分支名称”,可跳转到该分支的“文件”页签,可查看该分支的内容、历史等信息。
  • 单击某个“最新提交”,可跳转到该分支的最新一次提交记录详情中,可查看本次提交的内容。
  • 单击某个,可定位到“对比”子页签,可以对将此分支与其它分支进行差异对比。
  • 单击某个,可下载该分支的压缩包到本地。
  • 单击某个,可以跳转到“合并请求”页签,可对该分支创建分支合并请求
  • 单击某个,可以按提示操作,将该分支进行删除。

另外在控制台中您还可以对分支进行相关的设置:

关于分支的常用Git命令

  • 新建分支
    git branch <分支名称>           #在本地仓库基于目前的工作区,创建一条分支
    示例如下:
    git branch branch001            #在本地仓库基于目前的工作区,创建一条名为 branch001 的分支

    无回显则为创建成功,如下图为使用了重复名称创建,更换一个名称再创建即可。

  • 切换分支
    切换分支可以理解为将该分支的文件内容检出到当前的工作目录。
    git checkout <分支名称>        #切换到指定分支

    示例如下:

    git checkout  branch002        #切换到名为 branch002 的分支

    下图为切换成功:

  • 新建并直接切换到新建的分支

    有一种快速的操作办法,可以直接新建并切换到新建出来的分支,其用法如下:

    git checkout -b <分支名称>     #在本地仓库基于目前的工作区,创建一条分支,并直接切换到该分支

    示例如下:

    git checkout -b branch002      #在本地仓库基于目前的工作区,创建一条名为 branch002 的分支,并直接切换到该分支

    下图为该命令执行成功:

  • 查看分支

    使用以下命令查看本地仓库的分支、远程仓库的分支,亦或是全部,这组命令只是将分支名称罗列,如果想查看分支内的具体文件,请使用 切换分支

    git branch                              #查看本地仓库分支
    git branch -r                           #查看远程仓库分支
    git branch -a                           #同时查看本地仓库与远程仓库的分支

    如下图,分别依次执行了以上三种命令,Git清晰的将本地仓库与远程仓库中的分支以不同的样式展现(远程仓库分支展现形式 remote/远程仓库别名/分支名)。

  • 合并分支

    当一条分支上的开发任务完成了,有时需要将其合并到另一条分支,以做功能归档,合并分支可以理解为将另一条分支最新的修改同步到当前所处分支,其用法如下:

    git merge <要合并过来的分支的名称>        #将一条分支合并到当前的分支中
    分支合并前一般要先切换到被合入的分支,下面以将branch002 合入到master分支为例进行演示:
    git checkout master                       #切换到master分支
    git merge branch002                       #将名为 branch002 的分支合入到master分支

    如下图是上面命令的执行效果,可以看到合并成功,合并了一个文件的变化,其变化是新增了3行内容。

    有时在合并时会提示出现了文件修改冲突(如下图“fileOnBranch002.txt”这个文件在合并时冲突了)。

    解决方法是打开这个冲突的文件,手动编辑以将有冲突的代码(如下图)进行取舍,解决后保存,再进行一次 add 和 commit 操作以将其结果存储进本地仓库。

    这与本地仓库提交到远程仓库时产生文件冲突的解决方法是类似的,您可以参考解决代码提交的冲突以了解其工作原理。

    在实际开发中,如果团队使用了合理的合作模式,可以基本杜绝这种情况的产生。

  • 删除本地分支
    git branch -d <分支名>           

    示例如下:

    git branch -d branch002          #删除本地仓库中,名为 branch002 的分支,下图为执行成功

  • 删除远程仓库分支
    git push <远程仓库地址或别名> -d <分支名>               

    示例如下:

    git push HTTPSOrigin -d branch002        #从别名为HTTPSOrigin 的远程仓库中删除名为branch002 的分支,下图为删除成功

  • 将本地新建的分支推送到远程仓库
    git push <远程仓库地址或别名> <分支名>

    示例如下:

    git push HTTPSOrigin branch002        #将本地名为 branch002 的分支,推送到别名为HTTPSOrigin的远程仓库,下图为推送成功       

如果推送失败请检查连通性:

请检查建立的SSH密钥配对关系,必要时重新生成密钥并到代码托管控制台进行配置,请参考SSH密钥