本文使用的方法基于Vincent Driessen的 A successful Git branching model。
分布式版本控制策略
总体架构
主仓库(origin)中有两个永久分支:master和develop。
master上只保存生产环境可用版本,发布包只从这个分支上打;
develop用来收集可用的开发特性,BVT系统是从这个分支上获取代码做nightly builds。
每个开发者可能发起3种临时分支:feature, release和hotfix, 临时的意思是这3中分支最终都要被合并到某个永久分支(master/develop)中。
下面是详细说明。
-
feature: 用来开发新产品特性的分支。
-
from: develop; back into: develop.
-
命名规范:feature/<特征名>
-
生命周期:需要开发某个特征时,创建一个feature分支,当此特性开发完毕并通过测试,合并回develop后,分支消失, 或者此特征被放弃,分支被删除(或搁置)。
-
习惯上特征分支只由一个开发者完成,所以只存在于该开发者的本地仓库中。
-
-
release: 用来完成发布的分支。
-
from: develop; back into: master and develop.
-
命名规范:release/x.y.z
-
生命周期:当develop中的代码已经达到“发布一个版本”的状态时,创建一个release分支; 创建分支前,确定发布版本号,例如之前是1.1.5,这次是1.2,还是2.0? 根据版本号创建分支,修改对应文件(例如node应用中,package.json的version值)。 一些简单的bug修改也可以在这个分支上完成。 完成所有发布准备后,将此分支合并到develop和master上,然后删除此分支。
-
合并到master分支后,在master上用版本号打tag,别忘了把tag也push到origin上;
-
-
hotfix: 用来修改线上版本bug的分支。
-
from: master; back into: master and develop.
-
命名规范:hotfix/x.y.z
-
生命周期:开始修复bug时创建分支,修复后将分支合并到master和develop上,删除分支。
-
代码修改完成后,在版本信息文件中修改版本号第3组数字,例如将1.1.5改为1.1.6,然后合并分支。
-
各分支间的关系见Vincent Driessen的文章。
git-flow cheatsheet by Daniel Kummer 给出了详细的图示说明已经各操作如何使用git-flow实现。
版本号命名规则
x.y.z格式的版本号中,x代表大版本,当无法保证API兼容时,大版本号加1; y代表小版本,同一个大版本的各个小版本应互相兼容,每增加一个新功能,小版本号加1; z代表修复bug或者其他未新增功能,但仍需记录的变化。
评价
这个分布式的版本系统结构清晰,易于理解和使用。
并且能解决不同现场的特殊需求问题:
如果某个A现场使用v1.0,B现场使用v2.0,现在A报了bug,则只能给A使用高版本(v2.1), 而不能通过在v1.0上打patch的方法解决,因为如果从master的tag v1.0处签出代码,修改bug,得到v1.0p1,还得将修改再合并到v2.0上, 而且v1.0p1将变成一个无法合并的分支,但如果采用升级版本的方式改bug,就要求版本间功能具备连续性, 如果为A现场的v1.0开发了一个特殊的功能X,又不能合并到master里去(因为其他现场不需要这个功能), 升级将导致A无法使用X。所以怎样将各现场的特殊需求与版本控制结合起来仍然是一个未解决的问题。
后续工作
-
在分支上打tag的方法:
git tag -a <tag-name>
; -
在Hg上重现上面的流程;
Hg的工作流程
-
在中心服务器origin上建立一个branch name为develop的分支;
-
假设开发者chad负责在现有版本上增加一个“使用正则表达式的预期-发送”功能,则chad先从origin上clone一份代码到"f:\ghost\tmpFiles\myProj"文件夹中;
-
将这份代码导入到Eclipse中,项目路径为d:\workspace\myProj,注意".hg"文件夹也要导入;
-
删除"f:\ghost\tmpFiles\myProj"中的仓库,打开新的d:\workspace\myProj仓库,新建一个branch命名为"exp-send-regex";
-
Eclipse中开发功能,提交本地版本;
-
当功能稳定后由origin将chad的代码pull到自己的代码库中:
i. 启动chad的hg web server;
i. 在origin上用"pull selected changes from selected URL",将chad上面测试稳定的“使用正则表达式的预期-发送”功能分支拉过来;
i. 合并到develop分支中:在exp-send-regex分支顶端的changeset上右键->merge with local;
其他资料
Version Control for Multiple Agile Teams
Best branching strategy when doing continuous integration
Streamed Lines: Branching Patterns for Parallel Software Development