分支模型

说点儿啥

在项目代码开发中,往往是使用具有版本管理的开发工具管理代码,比如git,而版本管理中重要的一个功能,就是分支功能,在开发过程中,往往会产生各种分支,而每出现一个分支,就意味着开发成本的增加,所以怎么管理这些分支,就需要好好考虑了

首先,master

假设当前有一个git仓库,有一个分支,叫master,如果为了降低分支开发成本的话,那么最省成本的是只用一个分支,比如叫master,需要开发的功能不断地往这上面提交就可以了,如下所示

avatar

当项目需要发布的时候,选择对应节点发布就可以了

这应该是最简单的分支模型了

然后,release

实际上,在公司里面,一个项目或者仓库,往往都是多人参与的,这个时候就有一个问题,每个人以及每个功能的开发进度不一致,有的人开发快,可能已经将下一个阶段的代码开发完成,有的人开发慢,可能还在修复上一个功能引入的bug,这个时候,如果只有一个分支,就很难找到一个commit,满足发布的需求,如下所示,

avatar

红色的提交/内容是当前发布不需要的内容,绿色的提交是当前发布需要的内容,这样就找不到可以发布的代码节点

聪明的人就知道,这个时候需要额外一个分支了,如下图所示

avatar

在靠前的节点,创建一个release分支,专门用于本次发布,然后将剩下的需要发布的内容,移植到当前的release分支上,这样就可以满足发布需求了

继续,hotfix

某日,正在master分支上开发新的功能,但是,突然,测试人员过来反馈一个V1.0版本的重大bug,需要你立刻响应,进行修复,这个时候,master分支可能已经演进到很后面的阶段了,只能在release分支上临时创建一个新的hotfix分支,用于修复测试,如下所示

avatar

在hotfix上提交后,验证测试完成后再移植到release分支上

这个时候就有人会问,为啥不能直接向release分支上提交,“你看,master分支都可以直接提交”,实际上,也是可以这么做的,但是为了保证release分支的质量,即release分支上的节点尽可能都是质量可靠的,所以需要创建hotfix分支,进行预先验证和测试

当然,这些修复的内容,也是需要回归主线master分支上的,避免后续的发布出现问题

番外,feature

当一个人往master分支上提交时,很舒服,因为不会像多人那样产生提交冲突,比如工程师A新建了一个文件叫def.py,工程师也新建了一个文件叫def.py,那么master分支上这个def.py到底应该是那个内容呢,这就是冲突,更准确地说,是文本冲突

与文本冲突相对比的另一种冲突,是内容冲突,即在文本上,不存在冲突,比如工程师A在def.py第一行定义变量var = 1,而工程师B在def.py第十行也定义变量var = 2,那么在合并俩者的修改时,是不会报文本冲突的,但是,由于工程师A在开发的时候,不知道工程师B在第十行将变量var改成了2,就会一直按照var = 1的逻辑继续编写代码,这样在运行过程中,就会出现超出预期的异常

当每天都有来自不同的工程师,大量向master分支提交的时候,就可能出现很多的文本冲突,从而造浪费工程师大量精力在解冲突上,于是乎,就可以基于master分支,让每个工程师创建属于自己的feature分支,如下所示

avatar

这样,工程师就可以在自己的分支上开发,验证测试完善后,再合入master分支,在合入master分支的时候,一次性解决所有的冲突,从而节省了开发成本。

注意,随着时间推移,master分支的内容和工程师自己的feature分支内容,可能差距会越来越大,毕竟,master分支往往每天都会有很多提交合入,等到feature合入的时候,可能会有海量的冲突,为了避免到时候冲突太多,建议feature分支的周期不要维护太长,在一个短的周期内,比如2天以内,就完成修改然后合入master。如果feature分支开发周期较长,比如一周,那么就建议每天晚上定时将master最新的代码同步到feature分支,从而避免合入时的海量冲突。

总结

在大型项目中,比如Android项目,往往需要几十上百个仓库联合在一起,从而编译出项目产物,而不同的仓库,并不是全部都能按照计划完美无bug地进行,也不可能让每个仓库的所有开发人员在每次发布的时候,全体停下来,全身心投入本次发布,(当然,有些重大发布还是需要的),有些仓库可能超过计划进度完成,有些仓库可能落后计划进度,这都是很常见的情况。

这个时候,就会在项目的计划节点,让相关仓库创建出专门用于本次发布的分支,然后将本次需要的功能都移植到release分支,然后编译测试,等bug收敛后,正式将release的内容发布并创建TAG版本号。

所以创建release分支,即是方便聚合本次发布的功能代码,也是方便在发布过程中,提交修复代码,发布是需要一定时间的,比如持续一周

另一种分支模型

在小型项目中,比如小的前后端网站,往往开发人员不是很多,并且代码提交量不算很多的情况下,往往都可以按时完成开发任务,这个时候,就可以直接将代码进行发布,如下所示

avatar

因为代码都是按照计划进行的,所以不存在本次发布不需要的代码,从而可以直接移植到master分支,

其实这里的dev分支就是相当于之前的master分支,master分支相当于release分支

这种分支模型下,可以直观地在master分支上看到过往的各个版本历程,因为都是从master分支上发布的。