假设您正在开发具有定期发布的软件产品。关于分支和合并的最佳实践是什么?划分给公众(或您的客户是谁)的定期发布分支,然后继续在主干上进行开发,或者将主干视为稳定版本,将其定期标记为发布,然后在分支中进行实验性工作。人们认为行李箱被认为是“金”还是被认为是“沙盒”?
假设您正在开发具有定期发布的软件产品。关于分支和合并的最佳实践是什么?划分给公众(或您的客户是谁)的定期发布分支,然后继续在主干上进行开发,或者将主干视为稳定版本,将其定期标记为发布,然后在分支中进行实验性工作。人们认为行李箱被认为是“金”还是被认为是“沙盒”?
Answers:
我已经在大型商业应用中尝试了这两种方法。
哪种方法更好的答案很大程度上取决于您的实际情况,但是我将写出到目前为止我的总体经验。
总体上更好的方法(以我的经验):中继线应始终保持稳定。
这是此方法的一些准则和好处:
如果您尝试相反的操作并在中继中进行所有开发,则会遇到以下问题:
如果试图保持分支稳定并且将主干作为开发沙箱,那么您将根本没有所需的灵活性。原因是您无法从中继中选择要在该稳定版本中放入的内容。它将已经全部混入树干中。
我要说的是在主干中进行所有开发的一种情况是,当您开始一个新项目时。根据您的情况,可能还会有其他情况。
顺便说一下,分布式版本控制系统提供了更大的灵活性,我强烈建议切换到hg或git。
我已经使用了这两种技术,我会说在主干上进行开发并在发布时分叉稳定点是最好的方法。
那些反对的人说您将拥有:
- 日常构建中不断出现的构建问题
- 当一个开发人员向项目中的其他所有人提出问题时,生产力损失
可能没有使用连续集成技术。
的确,如果您在一天中不执行几次测试构建,例如每小时大约进行一次,将使自己容易受到这些问题的困扰,这些问题将很快扼杀开发的步伐。
白天进行几次测试构建会迅速折叠到主要代码库的更新中,以便其他人可以使用它,并且如果有人破坏了构建,也可以在白天提醒您,以便他们可以在回家之前进行修复。
正如指出的那样,仅当夜间运行运行回归测试的构建失败时才发现损坏的构建是愚蠢的,并且会很快降低运行速度。
阅读Martin Fowler关于持续集成的论文。我们在Posix sh的大约2,000行中为大型项目(3,000kSLOC)推出了自己的此类系统。
都。
主干用于大多数开发。但是,预计将尽最大努力确保对行李箱的任何登机手续都不会中断。(由自动构建和测试系统部分验证)
版本维护在其自己的目录中,仅对其进行错误修复(然后合并到主干)。
任何将使中继线处于不稳定或不工作状态的新功能都在其自己的单独分支中完成,然后在完成时合并到中继线中。
我喜欢并使用Henrik Kniberg在“多个敏捷团队的版本控制”中描述的方法。Henrik在解释如何在具有多个团队的敏捷环境中处理版本控制方面做得非常出色(在传统环境中也适用于单个团队),对他的措辞毫无意义,所以我只发布“备忘单”(自我解释如下:
我喜欢它因为:
并且,以防万一它不够明确:开发是在“工作分支”中完成的,干线用于DONE(可释放)代码。有关所有详细信息,请检查多个敏捷团队的版本控制。
这取决于您的情况。我们使用Perforce,通常会有几条开发线。主干被认为是“黄金”,并且所有开发都发生在分支机构,只要它们足够稳定可以集成,它们就会合并回到主线。这样就可以拒绝那些无法完成的功能,并且可以随着时间的推移提供可靠的增量功能,以便独立项目/功能可以使用。
合并和追赶引入后备箱的新功能会产生集成成本,但是无论如何您都会遭受这种痛苦。每个人都在主干上共同发展会导致荒唐的西部局势,而分支机构则使您可以扩展规模并选择要采取苦涩整合方案的地步。目前,我们的规模已扩展到十几个项目的一百多个开发人员,每个项目使用相同的核心组件发布多个版本,并且运行良好。
这样做的好处是您可以递归执行此操作:大功能分支可以是其自己的主干,其他分支也可以退出。此外,最终版本会获得一个新分支,为您提供进行稳定维护的地方。
这取决于您的开发工作量。多个并行工作的团队将无法在同一代码(全部)上有效地工作。如果您只有一小群人在工作,而您的主要关注点是削减分支机构,那么您可以继续工作,同时返回分支机构,以对当前有效的生产代码进行错误修复。这是分支的琐碎用途,并且不太麻烦。
如果您有很多并行开发,则需要为每个工作都创建分支,但这还需要更多的纪律:确保分支经过测试并准备好合并。计划合并,因此两个组不会尝试同时合并等。
某些分支的开发已经持续了很长时间,您必须允许从主干到分支的合并,以减少最终合并回主干时的意外情况。
如果您有大量的开发人员,则必须进行试验,并了解在您所处的环境中什么可行。这是来自Microsoft的页面,该页面可能会有些有用:http : //msdn.microsoft.com/zh-cn/library/aa730834(VS.80).aspx
这实际上取决于您的组织/团队对版本的管理程度以及所使用的SCM。
这是我更喜欢的SVN设计:
除了需要自己分支的主要功能以外,所有工作都是通过开发/主体完成的。在针对开发/树干测试工作之后,我们将经过测试的问题合并到Beta /树干中。如有必要,将针对Beta服务器测试代码。当我们准备好进行一些更改时,我们只需将适当的修订合并到发行版/主体中并进行部署。
可以在beta分支或release分支中进行标记,因此我们可以跟踪beta和release的特定版本。
这种设计具有很大的灵活性。如果某些修订未通过Beta中的测试,这也使我们可以轻松地保留beta / trunk中的修订,而将其他修订合并到release / trunk中。
我们使用的方法是Perforce方法,Laura Wingerd的著作中对此进行了详尽的讨论:
http://oreilly.com/catalog/9780596101855/index.html
尽管本书以perforce为中心(Wingerd是Perforce产品经理),但是这些概念可以应用于任何或所有VCS。
perforce方法(和平台)为我们提供了很好的服务。许多公司(谷歌,Intuit和我听说过,Microsoft Windows本身)都使用它。
这本书非常值得一读。
@Brian R. Bondy:请注意,一旦您的团队达到了在项目上并行处理的一定数量的ppl /任务,这不是解决方案。
质量检查部门参与质量检查后,为每个在建分支机构提供一个安装的工作量实在太高了。考虑一下SOA /客户端/服务器/ Web服务/数据库,每个分支都必须提供所有这些。
该解决方案也缺少集成阶段。