版本管理 代码的分支管理策略

laofo · 2008年12月30日 · 23 次阅读

关于代码管理的分支和发布策略,目前我知道的主要有两种模式。 [b] 一种是主干作为新功能开发主线,分支用作发布。[/b] [b] 另一种是分支用作新功能开发,主干作为稳定版的发布。[/b]

前一种分支管理策略被广泛的应用于开源项目。比如 freebsd 的发布就是一个典型的例子。freebsd 的主干永远是 current,也就是包括所有最新特性的不稳定版本。然后随着新特性的逐步稳定,达到一个发布的里程碑以后,从主干分出来一个 stable 分支。freebsd 是每个大版本一个分支。也就是说 4.x,5.x,6,x 各一个分支。每个发布分支上只有 bug 修改和现有功能的完善,而不会再增加新特性。新特性会继续在主干上开发。当稳定分支上发生的修改积累到一定程度以后,就会有一次发布。发布的时候会在稳定分支上再分出来一个 release 分支。以 6.x 为例,就会有 6.0,6.1,6.2…等发布分支。 这种发布方法非常适用于产品线的发布管理。产品是要卖的,以前卖给客户的版本仍需要继续维护,而为了以后的市场,新功能也不断地在增加。这种管理方法对已发布产品的维护工作和下一代产品的开发工作进行了隔离。对于已经发布的产品,只有维护的补丁发布。而新发行的产品不仅包括了所有的 bug 修改,还包括了新功能。 这种方法也不是没有缺点的。首先,必须对主干上的新功能增加进行控制。只能增加下一个发布里面计划集成进去的新特性。而且,已经在主干上集成的新特性中的任何一个,如果达不到里程碑的要求,稳定分支就不能创建,这很有可能影响下一个发布的计划。开源项目可能这方面的压力小一些,但是商业产品开发如果碰到这种情况就危险了。还有一个缺点就是 bug 修改必须在各个分支之间合并。从分支和合并的一些实践经验上看,各个长期存在的分支之间必须要周期性的进行合并,否则很容易引发合并冲突。可是各个 stable 分支以及 release 分支之间恰好是不能进行合并而且还要长期存在的。因此,采用这种分支策略可能碰到的最大问题就是某个分支上的 bug 修改内容往其它分支 merge 的时候出现的冲突。而且一旦发现一个 bug,调查这个 bug 影响哪些分支的工作会随着维护的发布分支的数量而增加。 在非产品开发的外包软件项目里面,这种发布方法的好处体现不出来,而缺点仍然存在。外包项目的特点是客户永远需要 “最新” 的代码,因此对已经发布的某个分支进行维护的情况很少出现(在测试的时候会出现)。而且发布的方法和产品的发布也不一样。产品的发布,只要把发布分支上的代码编译成安装盘就可以了,而外包的发布往往是把上一次发布和这一次发布之间发生变化的代码送给客户。如果每次发布都是一个分支的话,将会出现两个分支上的比较。强大的版本控制工具当然支持这种比较,但是很多版本工具不支持分支之间的比较,而只支持分支内的不同版本之间的比较。因此为了避免发布方法受工具的限制,就要避免出现分支间比较的情况。针对外包开发的特殊情况,只有采用另外一种分支管理策略。

与第一种分支策略正好相反,主干上永远是稳定版本,可以随时发布。bug 的修改和新功能的增加,全部在分支上进行。而且每个 bug 和新功能都有不同的开发分支,完全分离。而对主干上的每一次发布都做一个标签而不是分支。分支上的开发和测试完毕以后才合并到主干。 这种发布方法的好处是每次发布的内容调整起来比较容易。如果某个新功能或者 bug 在下一次发布之前无法完成,就不可能合并到主干,也就不会影响其他变更的发布。另外,每个分支的生命期比较短,唯一长期存在的就是主干,这样每次合并的风险很小。每次发布之前,只要比较主干上的最新版本和上一次发布的版本就能够知道这次发布的文件范围了。 这种发布模式也有缺点。如果某个开发分支因为功能比较复杂,或者应发布计划的要求而长期没有合并到主干上,很可能在最后合并的时候出现冲突。因此必须时刻注意分支离开主干的时间。如果有的分支确实因为特殊的需要必须长期存在,那就必须定期把主干的更新往这个分支上合并。为了减少这种合并发生的次数,并且限定合并的范围,要为每次发布预先建立一个发布分支,然后所有的开发分支根据自己的发布计划向各个发布分支合并。当下一次发布的分支上已经集成了所有的变更并且测试完毕以后,把这个发布分支内容合并到主干,发布主干,然后锁定或者删除这个分支。然后把主干上的所有更新合并到后面几个发布分支里面去。外包项目的发布周期一般都比较短,往往客户验收测试的周期就是发布周期。所以这种方法就够用了。如果发布周期很长,各个发布分支之间还要定期的从前向后合并。这种发布方法还有一个缺点就是测试。不像第一种分支策略,发布的分支就是测试的分支。这种发布模式的测试分支往往是各个发布分支,在正式发布之前才把下一个发布分支上的更新合并到主干,这就引入了合并出错的风险,而主干上的程序是没有经过测试的。幸好从这个发布模式上看,下一个发布分支的合并基础应该和主干上一次发布内容相同,所以引入合并错误的风险很低。还有一种建议就是不设置主干,下一个发布分支就是主干,直接发布下一个发布分支的变更内容,然后把变更合并到再下一个发布分支上去。以此类推。有机会尝试一下。 最后,说说分支合并管理的一些注意点: 1.分支离开主干的时间要尽可能短。长期离开主干的分支需要定期合并。 2.辅助文档是必需的。为了观察分支的创建和合并的过程,至少需要一份类似泳道图的文档标记每一次分支创建和合并的过程。 3.开发分支往主干或者发布分支合并的次数应该尽可能少。一般来讲应该在单体测试结束合并到主干或者发布分支,然后进行结合测试。如果结合测试里发现 bug 不应该在原来的开发分支上继续修改,而应该创建新的分支进行修改。 4.分支创建和合并的 log 必须规范。便于以后查找。基本的 log 信息应该包括从哪个个分支的哪个版本创建分支;把哪个分支的从哪版本到哪个版本范围内的变更合并到了哪个分支的哪个版本,合并后的版本号。这些信息有一些是版本控制工具本身可以很方便查找到的,就可以省略。

转载自:http://hi.baidu.com/chinahubin/blog/item/8e3a74ecea36b1d02e2e2163.html

第一种发布模式里,创建发布分支而不是发布 tag 的目的应该是尽早把要发布的内容从主干上分离出来,这样可以不影响其他不发布的新特性在主干上的开发。 第二种发布模式也可以借鉴这种方法。第二种模式的发布分支建立的很早,现在的做法是在发布前才把发布分支上的内容合并的主干。实际上当下一个发布的发布分支已经比较稳定以后,不用等待发布就可以把发布分支的内容合并到主干上,然后再往后面的各个发布分支合并。如果合并后又发生了变化,可以继续往主干上合并。 这样做的好处可以尽快的把本次发布的内容反映到以后发布的分支里面,尽可能保证以后要发布内容的测试有效性。

转载自:http://thinkernel.bokee.com/4526064.html

在采用主干是稳定版本,分支是特性版本,每个发布建立独立分支的时候,必须把主干上的更新定期的向发布分支上合并,特别是有些主干上的重大变更,必须立刻反映到分支上才能保证分支上版本的测试准确性。 但是一旦主干上的内容反映到分支上以后,在从分支回到主干就成问题了。分支回主干的基本做法是把分支创建的版本到分支合并前的版本差异 merge 到主干上。但是因为一些主干上的变更在分支创建以后曾经合并到分支上了,这些内容也会出现在分支的差异比较结果里面。再把这个差异合并到主干上反倒容易引起冲突。 这个问题很难解决。而且从某种意义上反倒体现出主干是最新版本,分支是发布版本这种做法的优势。

我现在倾向于两种发布方法的结合。首先,不再设立主干,每个发布分支都是各个发布的主干。各个变更的开发分支合并到各自发布计划对应的发布分支上,然后前面的发布分支内容定期向后面的发布分支上合并。

转载自http://thinkernel.bokee.com/4583209.html

对我非常有用的一种思想,谢谢!

我也倾向于两则的结合 一、对于新功能的开发:采用主干是稳定发布,分支是新特性的开发 二、对于产品的发布:采用主干是开发,分支是发布

[color=blue]------------新特性开发或处理 Bug 分支 [color=blue] | [color=blue]|
[color=blue]| [color=lime][color=seagreen]-------------------------------------主干 [稳定] 对于开发主干来说,就是发布分支 [color=seagreen]| [color=blue]| [color=seagreen]| [color=blue]| [color=seagreen]| [color=blue]-------------新特性开发或处理 Bug 分支 [color=seagreen]| 发布 1.0 [color=seagreen] | [b][color=red]===================================主干 [开发] [/b] [color=blue] | [color=blue]| [color=blue] | [color=blue]-------------- [color=blue] 新特性开发或处理 Bug 分支 [color=blue]| [color=blue]-------------- [color=blue] 新特性开发或处理 Bug 分支

不知道这样画大家是否理解

[[i] 本帖最后由 9128 于 2009-8-13 17:29 编辑 ]

讲的很不错,也很具体

9128 于 2009-8-13 17:24 发表
我也倾向于两则的结合 一、对于新功能的开发:采用主干是稳定发布,分支是新特性的开发 二、对于产品的发布:采用主干是开发,分支是发布

------------新特性开发或处理 Bug 分支 | | | -------------------------------------主干 [稳定] 对于开发主干来说,就是发布分支 | | | | | -------------新特性开发或处理 Bug 分支 | 发布 1.0 | ===================================主干 [开发] | | | --------------新特性开发或处理 Bug 分支 | --------------新特性开发或处理 Bug 分支

不知道这样画大家是否理解 [/quote]

有个问题,就是,这样做开发的话,是怎么进行 merge 工作的?谁来做 merge?

先 copy,明天再看~~~~~~~

scmroad 于 2009-10-28 10:03 发表

有个问题,就是,这样做开发的话,是怎么进行 merge 工作的?谁来做 merge? [/quote]

实际上两种 merge 工作都可以由组织级 SCM 来做,但是,在座 merge 之前,必须得到项目经理的版本号确认,以及 SQA 的确定。这样,就能保证,merge 的版本是项目组需要的。

merge 不是什么问题,严格操作,让研发人员从旁协助确认。 最主要的问题是,merge 完的 trunk 需不需要构建一个版本让测试人员确认下功能。

当然需要通过验证来确认功能。否则的话,怎么能验证 merge 进去的代码是完好的,没有影响现在 trunk 上的东西?

需要 登录 后方可回复。