Git Cherry-pick vs Merge Workflow

时间:2009-08-06 21:50:26

标签: git merge cherry-pick

假设我是回购的维护者,并且我想从贡献者那里获取更改,那么有一些可能的工作流程:

  1. cherry-pick每次从远程提交(按顺序)。在这种情况下,git将提交记录为与远程分支无关。
  2. merge分支,提取所有更改,并添加新的“冲突”提交(如果需要)。
  3. I merge每次从远程分支单独提交(再次按顺序),允许为每次提交记录冲突,而不是将所有冲突组合为一个。
  4. 为了完整起见,您可以执行rebase(与cherry-pick选项相同?),但我的理解是这可能会导致贡献者混淆。也许这会消除选项1。
  5. 在案例2和3中,git记录了提交的分支历史记录,与1不同。

    使用所描述的cherry-pickmerge方法之间的专家和关系是什么?我的理解是方法2是常态,但我觉得解决大问题提交单个“冲突”合并,并不是最干净的解决方案。

3 个答案:

答案 0 :(得分:277)

rebase(和cherry-pick)和merge都有其优点和缺点。我在这里争论merge,但值得理解。 (在这里查看备选的,有争议的answer枚举案例,其中rebase是首选。)

merge优先于cherry-pickrebase,原因有两个。

  1. 鲁棒性。提交的SHA1标识符不仅标识它本身,还标识之前的所有其他提交相关。这可以保证给定SHA1的存储库状态在所有克隆中都是相同的。理论上(某些人)没有机会完成看起来像是同样的变化但实际上正在破坏或劫持您的存储库。你可以挑选个别的变化,它们可能是相同的,但你无法保证。 (作为次要的次要问题,如果其他人在同一次提交中再次挑选,那么新的樱桃选择将提供额外的空间,因为即使您的工作副本最终相同,它们也将出现在历史记录中。)< / LI>
  2. 易于使用。人们倾向于相当容易地理解merge工作流程。 rebase往往被认为更先进。最好同时理解这两者,但是那些不想成为版本控制专家的人(根据我的经验,他们包括许多同事,他们非常擅长他们的工作,但又不想花费额外的时间)更容易时间只是合并。
  3. 即使合并繁重的工作流rebasecherry-pick仍然适用于特定情况:

    1. merge的一个缺点是历史混乱。 rebase阻止了一系列的提交在您的历史记录中分散,就像您定期合并其他人的更改一样。事实上,这是我使用它的主要目的。您希望非常小心,永远不会与您与其他存储库共享的rebase代码。一旦提交push,其他人可能已在其上承诺,并且重新定位最多会导致上面讨论的重复类型。在最坏的情况下,你最终可能会遇到一个非常混乱的存储库和细微的错误,这将花费你很长时间才能找到它。
    2. cherry-pick可用于从您基本上决定放弃的主题分支中抽取一小部分更改,但意识到有几个有用的部分。
    3. 至于将多个变化合并为一个:它只是简单得多。一旦你开始拥有很多变更集,就可以非常繁琐地完成各个变更集的合并。 git(以及Mercurial和Bazaar中)的合并解析非常好。在大多数情况下,即使长分支合并也不会遇到重大问题。我通常会同时合并所有内容,只有如果我收到大量冲突,我会备份并重新运行合并零碎。即便如此,我还是以大块的方式做到这一点。作为一个非常真实的例子,我有一位同事进行了3个月的合并更改,并在250000行代码库中获得了9000个冲突。我们要做的是修复一次合并一个月的价值:冲突不会线性构建,并且分段执行会导致少于9000个冲突。它仍然需要做很多工作,但并不像尝试一次提交一样多。

答案 1 :(得分:92)

在我看来,应该为需要的罕见情况保留挑选,例如,如果你直接在'master'分支(主干,主开发分支)上做了一些修复,然后意识到应该也应用它'maint'。您应该在合并或rebase(或“git pull --rebase”)上建立工作流。

请记住,从Git(具有不同的SHA-1标识符)的角度来看,挑选或重新提交的提交不同,因此它与远程存储库中的提交不同。 (Rebase通常可以处理这个,因为它检查补丁ID,即更改,而不是提交ID)。

同样在git中,您可以同时合并多个分支:所谓的章鱼合并。请注意,章鱼合并必须成功而不会发生冲突。不过它可能有用。

HTH。

答案 2 :(得分:-8)

Rebase和Cherry-pick是您保持干净提交历史记录的唯一方法。 避免使用合并并避免创建合并冲突。如果你正在使用gerrit,必要时将一个项目设置为Merge,将一个项目设置为cherry-pick模式并尝试自己。