两者rebase
(和cherry-pick
)merge
都有其优点和缺点。我在这里争论merge
,但两者都值得理解。(在这里寻找一个替代的、有充分理由的答案,列举了首选的案例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 个冲突。这仍然是很多工作,但不如尝试一次提交一个提交。