任务驱动分支的问题

3

我正在考虑从HG切换到Plastic SCM(http://www.plasticscm.com),主要是因为它似乎提供了更好的VS集成,而他们推广“任务驱动分支”,即为每个功能从主干进行分支。这很有道理,但是我有几个问题:

他们建议在完成任务后不要将其合并回主线。这似乎非常不符合直觉,我认为人们在测试后应该立即合并到最新版本,这样就不必在以后进行变基。更不用说,如果任务没有合并回去,而且新版本即将推出,那么就需要合并可能数百个不同的分支,并确保它们在短时间内相互协调(独立测试并不意味着它们会与其他分支一起协调)。所以,这似乎注定要失败,我错了吗?你是否实践这种方法?
假设我对上面的内容错误,考虑以下情况:任务A、B、C。其中B、C依赖于完成A,是先完成A,然后将其合并回主线,再从那里分支出来处理B/C,还是子分支您的初始分支(为A创建的分支)?这是可能的吗?推荐吗?如果同一个人实现A、B、C,那么在我的脑海中似乎稍微清晰一些。如果不是,显然,将其合并回主线是最有意义的。
让我知道你们的想法!
谢谢。
2个回答

2
在我们最近关于分支策略的讨论中,有一个相当好的讨论jgifford25的回答包含了Subversion开发人员称为“敏捷发布策略”的链接,看起来与Plastic公司建议的类似-每个特性一个分支,将合并到发布分支而不是主干。我认为这不是一个好主意,也不认为这是一个好主意。我也不认为这是巧合,在两种情况下,这个想法都是由SCM开发人员推动的-我认为这些家伙有一个“万物皆钉子”的情况,并认为任何过程问题都可以通过更多、更大的SCM来解决。
所以为什么这个想法是错误的?让我们遵循Plastic团队的论点。他们将此过程建立在一个核心思想上:“保持主线干净”。到目前为止还不错。然后他们提出了一个类似于三段论的论证:
1. 如果你将有问题的代码提交到主干,构建就会失败。 2. 失败的构建是不好的。 3. 因此,不要将代码提交到主干。
这个问题在于它完全误解了为什么失败的构建是不好的。失败的构建本身并不是坏事(尽管它们没有帮助,因为它们会阻碍开发),它们之所以不好是因为它们意味着“有人已经提交了有问题的代码”。真正的问题在于有问题的代码,而不是失败的构建——有问题的代码才真正有可能造成损害(丢失用户数据、丢失空间探测器、全球热核战争等等)。
他们的解决方案是让人们在其他地方检查他们的错误代码,以便不会破坏构建。这显然根本没有解决错误代码的实际问题 - 相反,它是一种掩盖错误代码的方式。事实上,我不清楚何时检测到错误 - 是在任务分支最终确定并合并到发布分支时吗?那听起来就像是将困难工作推迟到发布周期的后期,这是一个非常糟糕的想法。
真正的解决方案是根本不要提交错误代码。为了实现这个目标,一个错误的构建实际上是好的,因为它告诉你有错误的代码,让你去修复它。事实上,这正是持续集成的整个重点 - 你早期和经常地合并到一个单一的主干,这是实际发布的原型,所以你尽可能早地检测到你打算发布的问题。这绝对需要“不稳定主干”模型或其同构。 这篇博客文章orangepips的回答提到了Ubuntu关于将过程作为推动这一想法的驱动力的想法。但看看Shuttleworth实际说了什么:
  • 保持主干干净
  • 保持功能流畅
  • 随时发布

这是我在最后一点上的强调,但这是Shuttleworth的最终目标:他希望能够随时发布版本。一个将合并和测试推迟到发布过程中的过程(如Plastic模型)不可能做到这一点。

相反,如果你想看看能够做到这一点的过程是什么样子的,请看看精益团队的做法:一个代码线,持续集成(以小时甚至分钟为尺度,而不是以天或周为尺度),没有破损的代码。

因此,总结一下:不要这样做。只需一个代码行,并尽可能经常将工作代码检入其中。简单明了。
PS:好吧,你可能想创建发布分支来稳定和修复实际的发布版本。理想情况下,你不需要这样做,但你可能需要。
PPS:如果你有一个CI测试套件,在检入之前运行太慢(例如需要一个小时的功能测试),那么你可以使用任何DVCS来拥有两个存储库:一个脏存储库,开发人员合并到其中,以及一个干净存储库,由一个脚本推送,该脚本监视脏存储库的变化,构建和测试新版本,并在通过后推送到干净存储库。然后,你可以从干净存储库中进行按需发布(供QA等使用),而开发人员可以从干净存储库更新以保持当前状态。他们显然必须立即从脏存储库更新才能合并。

0

阅读PR后,听起来他们主张采用一种模型,在这个模型中代码在合并到主干/基线之前进行测试(参见规则#4)。这预设了一套单元测试这些测试覆盖所做的任何更改。对于我参与的大多数项目而言,这套测试不存在,很可能永远不会完全存在。

在我自己使用Subversion的经验中,主干是原始的,但不是发布的来源。相反,主干是版本之间的回溯和前进端口的位置。发布来自版本分支。

从版本分支创建功能分支-有时候。这些分支允许频繁提交可能会出现问题的内容。一旦完成了一个功能分支,它就会合并到版本中;不可避免地,在此集成发生时需要解决问题。最后,一旦构建和验证了一个版本,它就会合并到主干。

所以我认为#1不现实。至于#2,这取决于情况。B和C是否肯定不会改变A?如果是这样,那么将A合并回来,然后为B和C分支。但最有可能的是,我会将A分支成B和C,因为后者很可能会改变前者。然后完成后,将所有三个合并。


我参与的项目都有相当全面的测试覆盖,但我仍然看不出这个模型的用处。 - Tom Anderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接