Git Cherry-Pick和冲突

72

这里有两个不同的git分支。一个分支正在进行开发(Branch1)。

另一个分支正在进行一些概念验证工作(Branch2)。现在,我想从Branch1中挑选变更,使Branch2保持最新状态。

现在,在挑选了4或5个变更后,我遇到了一些合并冲突,并且无法继续进行其他挑选。

那么,我需要在进行下一个挑选之前解决所有冲突吗?还是我可以推迟冲突解决,直到将所有变更都挑选完毕(然后一次性解决所有冲突)?

此外,在这种情况下,建议使用cherry-pick还是分支合并?


2
避免这些“cherry-pick”冲突的一种可能方法是按提交日期的顺序进行“cherry-pick”,即从最早提交的代码开始。 - Saurav Sahu
3个回答

79

继续之前:

  • 安装适当的合并工具。在Linux上,我强烈建议您使用meld:

    sudo apt-get install meld
    
  • 配置您的合并工具:

    git config --global merge.tool meld
    

然后,按以下方式迭代:

git cherry-pick ....
git mergetool
git cherry-pick --continue

45

在进行下一次 cherry-pick 前,我需要解决所有冲突吗?

是的,至少在标准 git 设置下是这样。当存在冲突时,您不能 cherry-pick。

此外,通常情况下,冲突越多,解决起来就越困难,因此最好逐个解决它们。

话虽如此,您可以一次 cherry-pick 多个提交,这将实现您所要求的内容。例如,参见如何 cherry-pick 多个提交。如果一些提交撤销了先前的提交,则这很有用。然后,您将希望一次性 cherry-pick 所有提交,这样您就不必为稍后的提交所否定的更改解决冲突。

此外,在这种情况下建议使用 cherry-pick 还是分支合并?

通常,如果您想使特性分支保持与主开发同步,只需将 master -> 特性分支合并即可。其主要优点是稍后将特性分支 -> 主分支合并会更加轻松。

只有在必须从主分支中排除某些更改的情况下,cherry-picking 才会有用。不过,这仍然很痛苦,因此我建议尽量避免使用。


你知道使用标准的git无法做到这一点是故意设计的选择吗(如果是的话,你知道为什么吗?),还是只是一些意外的笨拙之处? - LSpice
@LSpice:我不清楚这个功能的设计历史,但我认为这是有意为之的。Git通常遵循一个一般约定,即禁止在“未提交更改”的工作区(即有未提交更改的情况下)执行许多操作(例如rebase)。这通常简化了许多命令的设计,并避免了棘手的特殊情况(例如如何处理冲突)。 - sleske

15

除此之外,补充一下@claudio所说的,当使用cherry-pick时,你也可以使用合并策略

因此,你可以像这样使用 git cherry-pick --strategy=recursive -X theirs commit 或者 git cherry-pick --strategy=recursive -X ours commit


你刚刚为我节省了大量时间。谢谢。 - LocustHorde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接