rebase
(和cherry-pick
)和merge
都有它们的优点和缺点。我认为在这里merge
,但它是值得理解。 (在这里寻找一个备用中,公认为answer枚举的情况下rebase
是优选的。)
merge
优于cherry-pick
和rebase
为几个原因。
- 健壮性。提交的SHA1标识符不仅标识它本身,而且还标识与之前的所有其他提交。这为您提供了一个保证,即给定SHA1中的存储库的状态在所有克隆中都是相同的。 (理论上)有人没有机会做出看起来像是一样的变化,但实际上是破坏或劫持你的存储库。你可以挑选个人变化,他们可能是相同的,但你没有保证。 (作为次要问题,如果其他人再次选择同一次提交,那么新的樱桃挑选的提交将占用额外的空间,因为即使您的工作副本完全相同,它们也会出现在历史记录中。)
- 易用性。人们往往很容易理解
merge
工作流程。 rebase
往往被认为更先进。最好是了解这两者,但不想成为版本控制专家的人(根据我的经验,包括许多擅长自己的工作但不想花费额外时间的同事)更容易时间只是合并。
即使合并重的工作流程rebase
和cherry-pick
仍然是有用的特殊情况:
- 一个缺点
merge
是混乱的历史。rebase
可以防止在您的历史中散布大量的提交,就像您定期合并其他人的更改一样。事实上,这是我使用它的主要目的。你想成为非常小心,永远不会rebase
代码,你已与其他存储库共享。一旦某个提交是push
,那么其他人可能会对其进行承诺,而重新绑定最多会导致上面讨论的那种重复。在最糟糕的情况下,最终可能会出现一个非常混乱的存储库和微妙的错误,需要很长时间才能发现。
cherry-pick
可用于从主题分支中抽取出一小部分变化,这些主题分支基本上决定放弃,但意识到有几个有用的部分。
至于宁愿合并许多变化:它只是简单得多。一旦开始拥有大量变更集合,就会变得非常繁琐。 git(以及Mercurial和Bazaar中)的合并解决方案非常好。大部分时间你都不会遇到长期分支融合的重大问题。我通常一次合并所有东西,只有如果我得到大量的冲突,我是否备份并重新运行合并零碎。即使那样,我也是以大块的方式做到这一点。作为一个非常实际的例子,我有一位同事对合并进行了3个月的修改,并且在250000行代码库中遇到了9000次冲突。我们所要解决的问题是,一次合并一个月的价值:冲突不会线性增加,并且这样做会导致远远少于少于9000个冲突。这仍然是很多工作,但不是一次尝试一次就能完成。
实际上,理论上Mallory可能会通过创建具有相同SHA1但不同内容的提交来破坏存储库,但实际上可能不会发生。 :) – Bombe 2009-08-07 06:55:08
哈:)我的意思是“理论上赔率很低,你可以依靠它不发生”,但你说得对,它看起来颠倒。 – quark 2009-08-07 14:45:04
您如何看待“merge --squash”? – cmcginty 2009-09-29 04:02:41