问题 在Git中使用基于干线的基于Vs功能的工作流有哪些优缺点? [关闭]


我非常喜欢Git中基于功能的工作流的想法:使用功能分支来支持并行开发。

在基于特征的工作流程中,我将在一个功能分支(off master)中开发我的任务,并且我会经常从master修改以避免潜在的冲突。如果是协作,我会将功能分支推/拉到遥控器。 当准备好集成到master时,我打开一个从我的功能分支到master的pull-request,以便对象检查pull请求并自动评估是否知道pull-request(我的功能分支合并为master)通过构建和单元测试。如果拉取请求为“绿色”,则我的功能分支将自动合并到主控。

我发现上述工作流程很好。然而,在一些互联网帖子中,他们提倡“基于干线的开发”(例如, 12)。

就我而言,基于主干的开发不鼓励开发成单独的功能分支,但所有开发人员都发展成为主。这个模型鼓励开发人员每天将(Martin Fowler的CI实践)整合到主人以避免冲突(相反,我要做的是在主人身上重新设置我的功能分支)。

我想知道这个模型对基于特征的模型有哪些优势。我对基于主干的模型有几个疑问:

  1. 如何进行代码审查?在基于特征的模型中很容易:进入特征分支。在基于主干的模型中,由于所有提交都是在master中发布的,我如何才能对它们进行审核?事实上,如果我在合并到master中时解决冲突,那么这个提交是否会被审查(我不喜欢这样)?

  2. 两位开发人员将如何在同一功能上进行协作?在里面     基于特征的模型,两者都可以在特征分支上工作。在里面     基于主干的模型,所有开发人员都将合作“全部     功能“(不知何故)。对吗?

  3. 我相信,基于主干的模型是“创建的”,以避免长期特征分支在将其合并到主线时潜在的冲突地狱的问题。但是,如果功能分支是短暂的,并且如果它们经常从主线重新定位,那么问题是什么呢?

  4. 总的来说,哪些好处可以携带基于干线的相比     基于功能的工作流程?

谢谢 :-)


10122
2018-02-09 11:30


起源

该 barro.github.io/2016/02/... 博客文章几乎完全没有意义。它只是表明作者根本不理解Git Flow。 Git Flow非常好,非常灵活。阅读我刚才写的那篇文章的评论,以了解博客作者在他的文章中所犯的一些错误。 - Vampire
我发现你对帖子的所有评论都是合理的。我无法让仙人掌模型在我脑海中起作用。我没有/根本没有得到它。另外,为什么他们不合并发布分支到掌握?...我同意你的看法 - GitFlow对我来说似乎很灵活,但我猜大多数反对它的人会做出一些不完全正确的假设。谢谢你的帖子! - letimome
此外,另一篇文章抱怨的意大利面当然不好看,但在进行合并之前只是做一个rebase,你有一个几乎是线性的历史,但你仍然可以看到哪些提交最初构成一个特征。 - Vampire
完全同意 :-) - letimome


答案:


供你参考 1 已经讨论了有关代码审查的一些观点。这个答案主要基于我在工作中的经验 格里特 工具和基于主干的工作流程。

  1. 如何进行代码审查?在基于特征的模型中很容易:进入特征分支。在基于主干的模型中,由于所有提交都是在master中发布的,我如何才能对它们进行审核?事实上,如果我在合并到master中时解决冲突,那么这个提交是否会被审查(我不喜欢这样)?

理想情况下,基于主干的工作流中的代码审查应该在提交集成到master之前完成。手动,开发人员会将他们的提交推送到一些临时功能分支,并在批准后,将这些提交重新绑定到master并推送它们(可选地将它们压缩到单个提交中)。

Gerrit使这个过程自动化。在向Gerrit推送提交时,它会创建一个(几乎不可见的)临时分支集合来保持正在审核的提交。审核期间,所做的任何更正都会修改为正在审核的提交内容,并再次推送给Gerrit。一旦获得批准,提交就会以原子方式集成到master中(用户可以选择如rebase,cherry-pick和merge之类的选项)。

Gerrit最适合用于基于主干的工作流中的代码审查,因为它促进了审查提交提交,并且推送的提交仅在通过审核后出现在主服务器中(更正是作为修改完成的,因此“错误”提交永远不会成为主服务器)。

  1. 两位开发人员将如何在同一功能上进行协作?在基于特征的模型中,两者都可以在特征分支上工作。在基于主干的模型中,所有开发人员都将在“所有功能”中进行协作(不知何故)。对?

对。由于所有功能都是在同一分支中开发的,因此所有开发人员都在同一分支上进行提交。代码审查(以及持续集成)将使该分支始终足够稳定(至少对于开发,如果不是用于生产)。

缺点是不同复杂功能的提交在日志中交错 - 添加一些问题跟踪系统的数量有很大帮助。但是,在代码审查之后压缩提交,或者使用Gerrit(强制reivew commit-by-commit,而不是逐个分支),经验表明大多数功能只是一次提交(相当于一个提交中的合并提交)基于特征的工作流程)。

  1. 我相信,基于主干的模型是“创建的”,以避免长期特征分支在将其合并到主线时潜在的冲突地狱的问题。但是,如果功能分支是短暂的,并且如果它们经常从主线重新定位,那么问题是什么呢?

问题在于将一些长寿命的功能分支集成到主服务器中。然后,每个其他长期存在的功能分支都必须同时集成该完成功能的所有更改。如果完成和重新定义的特征分支都进行了一些重构,那就更糟了。

  1. 总体而言,与基于功能的工作流程相比,哪些优势可以带来基于主干的优势?

我见过的最大好处是:

  • 更线性的历史,更容易理解,并使樱桃选择和恢复。
  • 较小的冲突解决方案,主要是在重大重构的情况下。

但是,我想再次建议使用Gerrit(或类似的工具)在基于主干的工作流程中自动执行代码审查流程,而不是使用专为审查拉取请求而设计的工具(基于功能的工作流程)。


8
2018-02-09 12:27



感谢您分享您的体验。关于代码审查,我还没有工作过格里特,但是必须要看一下。我仍然认为,基于特征的开发是一种更好的方法。我发现使用功能分支没有问题(如果不是长寿命),如果预先测试集成,您仍然可以保证主线稳定性。 3.如果在合并之前进行重新定位,和/或如果与快进合并,则也可以(在某种程度上)使用特征分支实现线性历史记录。 - letimome
CI执法怎么样?所有开发者都会每天整合吗根据您的经验,每个开发人员每天要执行多少次提交才能掌握? - letimome
@letimome,Gerrit提供了一个与CI系统集成的事件流。我们使用Jenkins(使用Gerrit Trigger插件)来验证发送给审查的所有代码更改,因此我们甚至在代码实际集成之前就使用集成代码执行自动化测试。某些团队还会在集成代码时自动执行发布步骤。关于提交率,我没有看到任何工作流程都没有限制它(但是我们不经常提交)。与Gerrit不同的是,我们在代码审查批准之前进行了1-5次提交,这些提交从未出现在主日志中。 - André Sassi
关于提交率:正如我所看到的,您对集成(代码审查,构建,测试)的“门”越多,您进行“纯CI实践”的可能性就越小(CI,作为经常提交的做法)主线,一天多次)。最后,它是一个权衡:提交率Vs主线稳定性。 - letimome
如果将一个主要功能拆分为多个提交然后需要发布(由于业务原因或需要立即修复),您将如何处理部分实现的功能,以便您无法在那州? - Jonathan.


和你一样,Debitoor的开发人员对基于主干的开发有一些疑问。为了克服这些问题,他们提出了一种他们称之为Koritsu的创新解决方案。

Kōritsu是日语中的效率词,该方法旨在确保开发人员不会中断或阻止彼此。 Koritsu与短期功能分支非常相似,除了它允许功能分支存活长达一周并自动将每个合并部署到主干。

Debitoor多年来一直在使用Koritsu进行网站和移动开发。对我们来说,它一直运行顺利,没有任何问题。有一件事是肯定的:我们不会回到基于主干的开发

我们的CTO Allan撰写了一篇关于 基于Trunk的开发问题 以及Koristu如何设计来修复它们。这篇文章还包括他为基于Trunk的开发创新解决方案的演讲视频,该解决方案更详细地解释了所有内容。


1
2018-06-30 08:14