更新时间:2024-07-05 GMT+08:00

分支管理

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

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

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

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

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

分支名

Master

Develop

Feature_1\2...

Release

HotFix_1\2...

说明

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

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

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

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

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

有效性

长期存在

长期存在

临时

长期存在

临时

何时被创建

项目仓库建立之初

在master分支被创建之后

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

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

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

何时直接在此分支上开发

从不

一般不建议

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

从不

当被建立出来时

何时被其它分支合入

  • 项目版本封版时,被develop或release分支合入
  • 已发布版本中发现的bug被修复后,被对应的hotfix分支合入
  • 新特性开发完成后,feature分支合入到此分支
  • 当项目启动开发一个新版本时,被上一次历史发布版本(release、或master)合入

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

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

-

何时合入到其它分支

-

  • 当要发布版本时,合入到release分支
  • 当需要归档版本时合入到master分支

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

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

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

何时结束生命周期

-

-

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

-

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

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

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

在控制台上新建分支

  1. 进入仓库列表。
  2. 单击仓库名称进入仓库详情。
  3. 切换到“代码”页签下的“分支”子页签,进入分支列表页面。
  4. 单击“新建”按钮,在弹出的窗口中选择要基于哪个版本(分支或标签)进行创建,填写新分支的名称,并且可关联现有工作项。

    分支名称须满足如下要求:

    • 不支持以“-”“.”“refs/heads/”“refs/remotes/”“/”开头。
    • 不支持空格和[ \ < ~ ^ : ? * ! ( ) ' " | $ & ;等特殊字符。
    • 不支持以“.”“/”“.lock”结尾。
    • 不能有两个连续的点“..”
    • 不能包含序列“@{”

    当仓库中已存在同名称的分支/Tag或者上级分支/Tag时,则该分支不可被创建。

  5. 单击“确定”按钮,即可完成分支的新建。

在控制台中管理分支

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

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

只有开启IP白名单的机器才可以从界面下载源码压缩包。

如果您误删了分支,可提交工单联系技术支持处理。

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

关于分支的常用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的远程仓库,下图为推送成功       

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

  • 确保您的网络可以访问代码托管服务。
    请在Git客户端使用如下测试命令验证网络连通性。
    1
    ssh -vT git@********.com
    

    如果返回内容含有“connect to host **********.com port 22: Connection timed out”,则您的网络被限制,无法访问代码托管服务,请求助您本地所属网络管理员。

  • 请检查建立密钥配对关系,必要时重新生成密钥并到代码托管控制台进行配置,请确认SSH密钥HTTPS密码正确配置。