特色分支

连续输水·版本控制

标签:

随着Git和Mercurial等分布式版本控制系统的兴起,我看到了更多关于分支和合并策略以及它们如何适应的对话持续集成(CI)。这里有点混乱,特别是在特征分支的实践以及它如何与CI相适应。


简单(独立)功能分支

特征分支的基本思想是,当您开始处理一个特征(或用户故事如果您喜欢这个术语),您可以使用存储库的一个分支来处理这个特性。在DVCS中,你将在你的个人存储库中这样做,但同样的事情也适用于集中的风险投资公司。

我将用一系列图表来说明这一点。我有一个共享的项目主线,蓝色,两个开发人员,紫色和绿色(因为开发商的名字是格林牧师和李子教授)。

我正在使用带标签的彩色框(如p1和p2)来表示分支上的本地提交。分支之间的箭头表示分支之间的合并,盒子是橙色的,以使它们与众不同。在这种情况下,有更新,说几次错误修复,适用于主线(大概是孔雀夫人)。当这些发生时,我们的开发人员将它们合并到他们的工作中。为了给人时间感,我假设我们在这里工作几天,每个开发人员大约每天提交一次本地分支。

为了确保工作正常,他们可以在自己的分支上运行构建和测试。实际上,在本文中,我假定每个提交和合并都在它所在的分支上提供了一个自动化的构建和测试。

特性分支的优点是,每个开发人员都可以使用自己的特性,并与其他地方的变更隔离开来。他们可以以自己的速度从主线引入变化,确保它们不会破坏它们的特性流。此外,它允许团队选择要发布的特性。如果格林牧师花的时间太长,我们只需要李梅教授的改变就可以释放。或者我们可能想推迟李姆教授的特写,也许是因为我们不确定这个特性是否按照我们想要发布的方式工作。在这种情况下,我们只是告诉教授不要将他的更改合并到主线中,直到我们准备好该特性为止。这叫做樱桃采摘,团队决定在发布之前合并哪些特性。

虽然这张照片看起来很吸引人,前面可能会有麻烦。

虽然我们的开发人员可以单独开发他们的特性,在某种程度上,他们的工作必须整合起来。在这种情况下,Plum教授很容易用自己的更改来更新主线。这里没有合并,因为他已经将主线变更合并到自己的分支中(将有一个构建)。然而,格林牧师的事情并不那么简单,他需要将他所有的变化(g1-6)与所有的李子教授(p1-5)结合起来。

(在这一点上,许多dvcss用户可能会觉得我缺少了一些东西,因为这是一个简单的,可能是特征分支的简单视图。稍后我将讨论一个更复杂的计划。)

我做了一个大的合并框,因为这是一个可怕的合并。可能很好,开发人员可能在完全独立的代码基础部分上工作,没有任何交互,在这种情况下,合并将顺利进行。但他们可能正在研究那些相互作用的比特,在这种情况下,这里是碱液龙。

龙可以有多种形式,工具可以帮助解决一些他们当中。最明显的问题是合并源代码和处理开发人员编辑相同文件时的冲突的复杂性。现代的dvcss处理得相当好,确实有点神奇。Git因处理复杂的合并而享有盛誉。如此之多以至于合并的文本问题比以前要好得多——事实上,为了本文的目的,我将尽量减少文本冲突。

我更担心的问题是语义冲突。一个简单的例子是,如果Plum教授改变了一个尊重Green代码调用的方法的名称。188足球比分直播重构工具允许您安全地重命名一个方法,但只在你的代码基础上。所以如果g1-6包含调用foo的新代码,李教授不能在他的代码库中分辨,因为他没有。你只会在大合并中发现。

函数重命名是语义冲突的一个相对明显的例子。实际上,它们可能更微妙。测试是发现它们的关键,但是合并代码越多,就越有可能发生冲突,解决冲突就越困难。这是冲突的风险,尤其是语义冲突,这让大合并变得可怕。

这种对大合并的恐惧也对重构起到了威慑作用。188足球比分直播保持代码整洁是一项持续的工作,要想做好这项工作,每个人都必须密切关注这项工作,并在任何地方发现它。然而,在一个特性分支上进行这种重构是很困难188足球比分直播的,因为这会使可怕的大合并变得更糟。我们看到的结果是,使用特性分支的团队回避重构,而重构会导致更糟糕的代码库。188足球比分直播

实际上,我认为这就是为什么特性分支是一个坏主意的决定性原因。一旦一个团队害怕重构以保持代码的健康,那么他们就陷入了一个没有完美结局的螺旋式下降。


持续集成

持续集成就是为了解决这些问题而设计的。bet188足球通过持续集成,我的图表看起来像这样。

这里有更多的合并,但合并是其中一个更容易做的事情,经常和小,而不是很少和大。因此,如果李姆教授改变了格林牧师所依赖的一些代码,牧师会很早发现的,比如他在P1-2合并的时候。在那一点上,他只需要修改g1-2就可以进行修改,而不是G1-6。

CI能够有效地消除大型合并的问题,但它也是一个重要的沟通机制。在这种情况下,当李梅教授合并了G1并意识到格林牧师正在李梅图书馆积极地建设时,潜在的冲突实际上就会出现。在这一点上,李教授可以去寻找格林牧师,他们可以讨论他们的两个特征是如何相互作用的。这可能是因为李姆教授的特点需要一些变化,而这些变化与格林牧师的变化不太吻合。通过查看它们的两个特性,他们可以想出一个更好的设计,影响到它们的两个工作流。bet188足球对于独立的特性分支,我们的开发人员直到很晚才发现这一点,可能太晚了,做不到太多。通信是软件开发的关键因素之一,而CI最重要的特点之一就是它促进了人与人之间的通信。

重要的是要注意,大多数时候,像这样的特性分支是一种不同的CI方法。CI的一个原则是,每个人每天都致力于主线。所以除非功能分支只持续不到一天,运行一个功能分支与CI是不同的。我听说人们说他们做CI是因为他们在运行构建,也许使用一个CI服务器,每一个分支上都有承诺。那是连续的建筑,一件好事,但是没有整合,所以不是CI。


混杂整合

早些时候,我用插入语说,还有其他方法来做特征分支。李子教授和格林牧师说,在这个循环的早期一起喝茶。在聊天时,他们发现自己正在研究交互功能。在这一点上,他们可以选择直接整合彼此,这样地。

通过这种方法,他们只会推到终点的主线,像以前一样。但它们经常合并,这样就避免了可怕的合并。这里的要点是,隔离特征分支方案的主要问题是它的隔离。隔离特征分支时,如果你没有意识到这一点,就会有一个严重冲突的风险。那么孤立就是一种幻觉,早晚都会痛得粉碎。

那么,这种更为特殊的整合是CI的一种形式还是完全不同的动物?我觉得这是另一种动物,再次强调,CI的一个关键点是每个人都集成到主线每一天。跨功能分支集成,我会打电话给你的混杂整合(PI)不涉及甚至不需要主线。我认为这种差异很重要。

我认为CI主要是在每次提交时生成一个发布候选。CI系统和部署过程的任务是反驳发布候选的生产准备状态。这个模型依赖于需要有一些表示当前共享的主线,最新的完整图片。

——Dave Farley


混杂集成与持续集成

所以如果不同的是,π比Ci好,或者更现实地说,在什么情况下,pi比ci更好?

用CI,你失去了用风投来挑选樱桃的能力。每个开发者都在接触主线,所以所有的功能都在主线上增长。用CI,主线必须始终保持健康,所以在理论上(通常在实践中),您可以在任何承诺之后安全地释放。拥有一个半成品的特性或者一个你不想发布的特性不会损害软件的其他功能,但如果您不希望它在用户界面中可见,可能需要一些屏蔽。这可以简单到不在UI中包含菜单项来触发该功能。

圆周率可以提供一些中间地带。它允许格林牧师选择何时将李姆教授的变化结合起来。如果Plum教授在p2中做了一些核心API更改,然后,格林牧师可以导入p1-2,但在李子教授的特性发布之前,其他人都可以离开。

对于所有这些选择和选择的一个担忧是,PI使跟踪分支中谁拥有什么变得非常困难。在实践中,看来工具解决了这个问题。dvcss对变化和它们的起源保持了清晰的跟踪,并且可以发现当Plum教授拉动g3时,他已经有g2,但没有b2。我可能犯了手工绘制图表的错误,但是工具确实能很好地跟踪这些事情。

总的来说,然而,我不认为和风投们一起挑樱桃是个好主意。

特征分支是穷人的模块化架构,与构建能够在运行时/部署时轻松交换输入和输出特性的系统不同,它们将自己与通过手动合并提供此机制的源代码管理结合起来。

——Dan Bodart

我更喜欢以这样一种方式设计软bet188足球件,通过配置更改使启用或禁用功能变得容易。两种有用的方法是特征开关分支抽象.这些要求您思考需要模块化的内容以及如何控制这种变化,但我们发现,结果远没有依赖风投那么混乱。

让我对圆周率感到紧张的主要是它对人类交流的影响。在CI中,主线充当通信点。即使梅教授和格林牧师从不说话,他们将在冲突形成的一天内发现新生的冲突。通过pi,他们必须注意到他们正在处理交互代码。一条最新的主线也使人们很容易确定他们正在与每个人集成,他们不必四处寻找,找出谁在做什么——所以在后期整合之前,隐藏一些变化的可能性就越小。

pi源于开源工作,这可能是开源的速度不够密集的一个因素。在一份全职工作中,你每天为一个项目工作几个小时。这使得优先处理功能变得更容易。有了一个开源项目,人们通常会在这里花上一个小时,几天后的下一个小时。一个特性可能需要一个开发人员花费相当长的时间来完成,而其他具有更多时间的开发人员能够更早地将特性置于可发布状态。在这种情况下,采摘樱桃可能更重要。

重要的是要认识到您使用的工具在很大程度上独立于您使用的集成策略。尽管很多人将dvcss与功能分支联系起来,它们可以与CI一起使用。您所需要做的就是将一个存储库上的一个分支标记为主线。如果每个人每天都拉着推着它,然后是一条CI主线。事实上,有了一个训练有素的团队,我通常更喜欢在CI项目中使用DVC,而不是集中使用。如果有一个不那么训练有素的团队,我担心DVC会把人们推向长寿的分支机构,而一个集中的风险投资公司和不愿意分支机构推动他们向频繁的主线承诺。保罗·哈曼特也许是对的:“但我想知道,如果一个团队在转移到分布式之前不应该熟练地进行基于主干的开发。”

翻译: 西班牙的
分享:
如果你觉得这篇文章有用,请分享。我感谢你的反馈和鼓励

在这些标签上找到类似的文章

连续输水 版本控制