我们目前的分支管理模式
版本发布:
- 正式版本和预发环境发布都是基于
release 分支。 - 线上问题修复是基于当前
release 分支创建新的hotfix 分支。
开发阶段:
- 开发分支是基于
develop 分支,迭代开始会将上个版本release 分支合并到develop 分支。 - 个人分支是基于
develop创建新的个人分支。
提测阶段:
- 测试环境基于
develop 分支,bug 修改完成后由个人分支合入develop 分支发布。 - 预发环境基于
release 分支,bug 修改完成后由个人分支合入 develop 分支再合入release 分支发布。
比较主流的 Git 分支简介
master- 主分支 最稳定版本的分支,正式发布的版本都是基于master;develop- 开发分支 更新和变动最频繁的分支,正常开发过程的分支都是基于develop;release- 预发分支 一个版本全部功能开发完成后 ,提交测试和bug修复的分支;feature- 功能分支 包含每个开发人员开发的功能点,feature开发完成后合入develop;hotfix- 正式版本中进行问题修复的分支。
最近项目开发中分支管理遇到的问题
-
提测阶段 预发发版的问题
由于
jenkis脚本限制,预发分支必须是release-*开头,中、所以无法直接使用develop分支发版,而且后续迭代开发也是基于develop分支,所以预发问题回归阶段的bugfix同时必须合入develop 和 release分支,此时,有两种代码合入方式:a:个人分支
dev-xx -> develop -> release优点:会带上其他人的commit,并一同发布预发,减少发版次数
缺点:无法控制他人代码质量或者代码目前是否可以发布预发,可能导致新引入问题和版本问题
b:个人分支
dev-xx -> develop dev-xx -> release优点:当前预发发布版本可控
缺点:可能增加发版次数
-
线上问题修复时创建
hotfix 分支的问题hotfix可能基于release 分支或者其他的hotfix 分支,如果要修复线上问题,则会有以下问题。a. 繁琐
- 分支创建时需要向上一个发版人确定或者在
jenkis发版记录找; - 发版完成后需要将代码合入
develop,否则下个迭代功能上线以后会丢失此次的问题修复代码;
b. 容易引入问题
-
如果没有确定正确的线上分支或者确定了错误的分支,则线上会重复出现历史问题;
-
如果发版完成后代码没有合入
develop,则下一迭代发版后线上也会重复出现历史问;(高频问题点)
- 分支创建时需要向上一个发版人确定或者在
-
并行迭代时的分支管理问题
真实场景描述:
工作台
v1.6 迭代开发过程,我们有正常的开发分支develop,且基于develop创建新的个人开发分支develop-x1、develop-x2等。在v1.6结束阶段,由于企业微信迭代优先级问题,全员投入企业微信 v1.0迭代开发,此时由于v1.6未上线,且企业微信迭代和v1.6无法同时上线,所以创建新的develop-wxwork分支,此时正常的develop 分支则是停用状态。后续企业微信上线阶段,则衍生
release-ww-v1.0分支完成发版,同时由于预发测试和正式版本差异,预发则基于release-ww-v1.0分支创建release-ww-stage-test分支,后续线上hotfix则是基于release-ww-v1.0。在企业微信上线成功后,则是开始
v1.7 迭代开发,且v1.7基于v1.6,此时部分v1.7功能合入到develop,但在v1.7 迭代开发中途,由于优先级问题则是开展V1和V2迭代,且V1和V2是基于目前线上版本release-ww-v1.0开发,并且先于v1.7 迭代开发,且V1 、V2迭代功能无关联并不同时上线,所以,则产生两个新的开发分支develop-v1 和 develop-v2进行。此时,迭代开发、测试发版、线上问题修复的分支管理已经比较混乱,难以维护。
解决方案思考
-
上线流程优化 - 正式和测试发布使用
master 分支,预发问题验证则是基于release,每次迭代分支总是基于master创建develop,线上问题修复基于master创建个人hotfix 分支,验证完毕后合入master发布。优点:
a. 线上问题修复总是基于
master,不存在不明确当前线上版本和hotfix代码丢失问题;b.
hotfix不需要多次合入其他分支;c. 并行开发
develop 分支总是基于master,不需要确定当前版本,且冲突较少;缺点:
a. 如果发版异常,即时回退比较麻烦,需要在
master 分支撤回异常commit,再发布;b. 需要变更目前的开发上线发版流程和修改
jenkis脚本;
-
上线流程优化 - 正式发版和预发发版还是使用目前流程,使用当前迭代
release 分支发版,但是每次线上发版完成后必须将代码合入master,线上问题修复、后续迭代开发、基于线上版本的并行迭代开发都基于master 分支创建新分支。优点:
a. 不需要变更当前流程和修改脚本,只需要维护好
master 分支;b. 新迭代开发分支创建、
hotfix 分支创建方便,都是基于master;c. 线上发版需要回退时迅速,只需要回退到上次的
release 分支即可。缺点:
a. 每次完成线上发版以后,代码必须合入
master;b. 如果线上发版后代码忘记合入
master,则下次发版会发生线上代码丢失导致历史问题重现。补充:
可用
jenkis脚本配置代码上线以后自动合入master的功能,这样会很大程度避免线上代码丢失的问题。
- 测试流程优化 - 目前测试和预发测试阶段,由于同时存在
release 和 develop,个人分支需要同时合入两者。如果提测和预发测试都是基于release 分支修改,此时停用develop,那么只需要合入release即可,下个迭代develop可以再基于master 和 release创建。