58

假设正在开发多个分支,B类以及一个增量的“bug fix”分支C类.

现在C类已“完成”并合并到主控形状中。B类仍在开发中,在另一个bug修复分支合并到master之前(可能)不会修复。

合并是个好主意吗C类尽快在新功能分支中?因此,新功能与主人尽可能?还是让新功能在自己的“世界”中开发,在完成后才合并到主功能中更好?

无论如何都会有冲突,所以需要花费时间来解决这些问题。

9
  • 2
    的可能副本将要素分支合并到主线的最佳频率是多少?
    – 蚊虫
    评论 2019年7月22日11:44
  • 6
    @关于将特性分支合并到一条主线的gnat,我想知道在开发特性时将主分支合并回特性是否有助于“尽早解决冲突”。
    – 保罗23
    评论 2019年7月22日11:59
  • 1
    @paul23,我想说这是实际的必要性。 评论 2019年7月22日16:19
  • 6
    老实说,当我开始在代码上使用正确的设计,比如隔离模块和创建定义良好的工作模型时,我的很多版本控制问题都消失了。如果你在合并过程中遇到了太多问题,你可能会在某个地方潜伏另一个更严重的问题。一个好的设计对于避免不必要的冲突非常有用。
    – T.萨尔
    评论 2019年7月23日14:29
  • 4
    你可能想定期从主人那里合并,以保持“足够”的距离,以免以后合并太痛苦。 评论 2019年7月23日15:26

5个答案5

重置为默认值
87

分支的寿命越长,它就越能从主分支中分离出来,并且当它最终完成时,合并的结果就越混乱和复杂。十个小冲突比一个大冲突更容易解决,实际上可能会防止开发人员重复或浪费精力。鉴于此,您应该合并主人进入之内B类定期;每天一次是一个非常常见的建议,但如果分支上有很多活动,您可能希望每天合并多次。

除了使冲突解决更容易外,您还特别提到C类是一个错误修复分支。作为一名开发人员,我希望我的分支拥有所有最新的错误修复程序,以确保我不会重复导致错误的行为,或基于错误数据编写测试。

无论如何会有冲突,所以需要花时间来解决这些问题。

如果您知道会有冲突,您可能希望采用不同的分支策略。尽可能在同一分支上对同一个文件进行多次更改,这样可以减少或消除冲突的数量。重构故事,使其尽可能完全独立,并修改分支以可能覆盖多个故事(分支、特性和故事并不总是可互换的)。

8
  • 34
    合并或rebase,因为重设基通常会生成更干净的提交历史记录。 评论 2019年7月22日20:47
  • 12
    @克莱利斯:Rebasing可能很危险如果“分支涵盖多个故事”被认为是指两个开发人员在同一分支上工作。
    – 梅里顿
    评论 2019年7月23日7:28
  • 13
    @来自官方文档的meriton:不要重新设定存在于存储库之外的提交的版本,人们可能会基于它们进行工作。如果你遵循这一指导方针,你会没事的。如果你不这样做,人们会恨你,你会被朋友和家人鄙视。英雄联盟
    – 阿里茨
    评论 2019年7月23日11:52
  • 6
    @XtremeBiker:Git中的重设基改变了历史。Git在这方面与现实生活一样:为了改变历史,你需要一个阴谋。Git本身的存储库中有一个分支是定期更新的,它是一个高度公开的分支。这之所以有效,是因为存在一个阴谋:每个使用这个分支的人都同意在某些时候改写历史,所以他们会确保自己能够在这些时候将一切合并。 评论 2019年7月23日21:57
  • 1
    @paul23认真考虑将A和B交付给新的共享分支,然后再交付给master。如果它们都是彻底的检修,那么在将组合强加给大师之前,您希望它们一起进行一轮测试。如果您有信心,可以将一个直接交付给主服务器,然后将另一个交付给新更新的分支。您可能希望能够查看第二个特性中的原始代码,以防合并进展不顺利或需要重新设计某些内容。 评论 2019年7月23日22:15
14

假设您的意图是最终将A、B合并回master并维护单个代码基,那么偏离master太远永远不是一个好主意。长时间偏离主程序,特别是当错误修复和其他开发合并到主程序中作为A、B开发时,肯定会导致冲突。

我会考虑以下策略

  1. 无论谁对A负责,B都应该密切关注master,并在任何变化中合并。
  2. 更好的是,如果您有构建和测试自动化,请确保A、B合并到master中,并在夜间通过测试。
  3. 根据你对其他答案的评论,A、B似乎需要一段时间才能发展。在这种情况下,您甚至可以考虑让A、B彼此合并,这样最终您就不会在将两者合并回master时遇到很大困难。
  4. 在更高的层次上,想想为什么你需要两条独立的长开发线。你能分解成更小的合并吗?你能进入单独的微服务吗?
6

通常情况下经常比一个巨大的好。

更小、更频繁的拉请求几乎总是更好。

我已经开始主要使用配置标志,这样我就可以尽早完成较小的拉请求,从而可以更容易地合并代码,但不激活该功能。拉请求越小,就越容易检查代码,即使总的拉请求越多。任何类型的大多数人都无法对大规模拉入请求进行有意义的审查。要理解大规模代码更改的所有可能影响,对一个人的心理RAM来说太难了。

创建配置标志需要额外的开销,因此不值得在较小的功能上使用。但无论如何,你的拉请求都会很小。

然而,在某些情况下,可能需要同时发布该功能。即便如此,最好还是向另一个为此目的而创建的分支执行较小的pull请求。

当有人创建了一个大规模的拉请求时,我的大多数同事都会发出呻吟声,在大多数情况下,这是正确的。

还要注意,有时我需要将提交挑选到单独的分支中。如果可以将需要挑选的内容放入单个提交中,则可以更容易地将其移动到其他分支。在这种情况下,实际上很少提交会更好,但如果你仔细挑选的话,这并不是标准的过程。

2
  • 1
    功能标记可能成本高昂(45分钟内4.5亿美元)。这个例子也是鲍勃叔叔提到(但没有任何技术(正如人们所期望的那样)。 评论 2019年7月23日21:53
  • 1
    是的,虽然通常不那么难,但最终还是会有删除它们的开销。人们可能会将其维护更长时间,但随后该标志提供了更多的使用。我同意,如果做得随意或没有跟进,那么事情可能会变坏。尽管当一个大的拉取请求变得难以审核时,情况可能会变得糟糕。另一方面,有些人可能无法在他们正在使用的应用程序中添加配置标志之类的内容。通常,它有助于UAT和功能的推出。 评论 2019年7月23日22:59

在马丁·福勒(Martin Fowler)的《重构》(Refactoring)一书中,他给出的建议是,永远不要让一个分支从主人那里分支超过一天。IIRC,您应该做一个小的更改,测试以确保没有破坏任何内容,然后将其合并回来。

4
  • 2
    B类对应用程序的工作方式进行重大彻底的新检查,但这些检查并没有在一个月内“完成”。然而,在完成之前,它们也是无用的。。。
    – 保罗23
    评论 2019年7月22日12:09
  • 8
    在完成之前,它们可能并不是无用的——它们通过向完整结果迈进一步并减少未来所需的工作而提供价值。使用诸如功能切换、抽象分支或简单地最后完成用户界面部分等技术,应该可以安全地将未完成的工作合并到主控中。 评论 2019年7月22日13:31
  • 1
    这就是为什么在主分支中的任何更改之上重新调整本地基础对于长期开发来说都很方便。将您的工作保持为刚从最新的 评论 2019年7月23日17:00
  • 如果您纯粹是在重构,那么将许多小的(已完成的)更改合并回来是很好的。在开发某个东西时,可能需要更长的时间才能获得良好的、经过测试的工作代码。在这种情况下,您希望它与最新的更改保持同步(将主功能合并到功能中),但在完成之前不要合并回来。 评论 2020年2月24日16:15

对于可能已完成但尚未准备好使用的真正长期存在的更改,另一个选项是将它们放在功能标记之后,以便可以将它们合并到主项中,但不会破坏任何内容。然后,当它们准备好使用时,可以删除特征标志。

  • 1
    功能标志=僵尸代码(直到复活)? 评论 2019年7月23日21:21
  • @PeterMortensen你必须尽快移除旗帜,但这在某些情况下可能有效 评论 2019年7月24日0:17
  • @彼得·莫滕森(PeterMortensen),如果旗帜至少为一个人打开
    – 伊恩
    评论 2019年7月24日10:15

不是你想要的答案吗?浏览已标记的其他问题问你自己的问题.