Git Cherry-pick vs合并工作stream程

假设我是一个回购的维护者,并且我想从一个贡献者中引入更改,有几个可能的工作stream程:

  1. 我从远程cherry-pick每个提交(按顺序)。 在这种情况下,git将提交logging为与远程分支无关。
  2. merge了分支,引入所有的变化,并添加一个新的“冲突”提交(如果需要的话)。
  3. 我分别merge远程分支中的每个提交(按顺序),允许为每个提交logging冲突,而不是将所有提交分组在一起。
  4. 为了完整性,你可以做一个rebase (和cherry-pick选项一样吗?),但是我的理解是这会给这个贡献者造成混乱。 也许这消除了选项1。

在这两种情况下,git都会logging提交的分支历史logging,而不是1。

使用描述的cherry-pickmerge方法之间的专业和专业是什么? 我的理解是方法2是规范,但是我觉得用一个单一的“冲突”来解决一个大问题并不是最干净的解决scheme。

rebase (和cherry-pick )和merge都有其优点和缺点。 我在这里争论merge ,但这两者都值得理解。 (在这里寻找一个备用的,有争议的答案,列举优先考虑rebase情况。)

由于几个原因, merge优于cherry-pickrebase

  1. 健壮 。 提交的SHA1标识符不仅表示其本身,还表示与其之前的所有其他提交相关的标识符。 这为您提供了一个保证,即给定SHA1中的存储库的状态在所有克隆中都是相同的。 (理论上)有人做了看起来像是一样的变化,但实际上是破坏或劫持你的存储库的机会。 你可以挑选个人变化,他们可能是相同的,但你没有保证。 (作为次要的次要问题,如果其他人再次select同样的提交,那么新的挑选承诺将占用额外的空间,因为即使工作拷贝结果相同,它们也将出现在历史logging中。)
  2. 易于使用 。 人们倾向于很容易地理解merge工作stream程。 往往被认为是更先进的。 理解这两者是最好的,但不想成为版本控制专家的人(根据我的经验,包括许多擅长自己的工作但不想花费额外时间的同事)更容易时间只是合并。

即使在合并繁重的工作stream程中,重新rebasecherry-pick对于特定情况仍然有用:

  1. merge一个缺点是混乱的历史。 rebase可以防止你的历史中长期的一系列犯下的事情,如果你定期合并在其他人的变化中,就会这样做。 这实际上是我使用它的主要目的。 你想要非常小心的是,永远不要重定义你已经与其他仓库共享的代码。 一旦一个提交被push其他人可能会对此做出承诺,而重新定义最多会导致上面所讨论的那种重复。 在最糟糕的情况下,你可能会遇到一个非常混乱的仓库和微妙的错误,需要很长时间才能发现。
  2. cherry-pick对从你基本上决定放弃的主题分支抽取一小部分变化是有用的,但是意识到有一些有用的部分。

至于宁愿合并许多改变:它只是简单得多。 一旦开始拥有大量变更集合,就会变得非常繁琐。 git(Mercurial和Bazaar)的合并解决scheme非常好。 大部分时间你都不会遇到长时间分支融合的重大问题。 我通常一次合并所有的东西,只有我得到大量的冲突时,我才会重新进行合并。 即使如此,我也是以大块的方式做到这一点。 作为一个非常真实的例子,我有一个同事有3个月的合并的变化,并且在250000行代码库中遇到了9000个冲突。 我们所要解决的问题是,一次合并一个月的价值:冲突不是线性增长,而是一笔一笔地冲销,导致冲突远远less于9000次。 这仍然是很多工作,但不是一次尝试一个承诺。

在我看来,樱桃采摘应该是保留在罕见的情况下,例如,如果你直接在“主”分支(树干,主发展分支)上做一些修改,然后意识到它也应该被应用到“保留”。 您应该基于合并或基于rebase(或“git pull –rebase”)工作stream。

请记住,挑选或重定义的提交与Git(具有不同的SHA-1标识符)的angular度不同于原始提交,因此它与远程存储库中的提交不同。 (Rebase通常可以处理这个,因为它检查修补程序ID即更改,而不是提交ID)。

同样在git中,你可以一次合并很多分支:所谓的章鱼合并 。 请注意,章鱼合并必须成功,没有冲突。 不过,这可能是有用的。

HTH。