Cherry通过合并提交选择了一系列提交

anb*_*ber 1 git cherry-pick git-cherry-pick

我需要挑选一系列提交,但是失败了,因为在这个范围内,我合并了一些分支。是否可以做到没有冲突?

tor*_*rek 6

是否可以做到没有冲突?

这取决于转换为变更集的提交中的内容,以及您自己当前提交中的内容。我也不担心这是真正的问题。

...失败,因为在此范围内我已经合并[提交]

大概是指git cherry-pick在到达合并提交后就抱怨没有指定-m参数。如果确实指定了一个-m参数(git cherry-pick -m 1 ...),则Git会抱怨您确实-m为那些合并的提交指定了一个参数。这确实是一个难题:您必须在指定的-m 1同时也要省略-m 1

解决此问题的直接方法是零碎地选择:选择第一个但有很多非合并提交(以正确的顺序,并且没有-m参数),然后选择任何合并提交(使用正确的-m参数,以正确的顺序),几乎总是-m 1),然后是紧随其后的所有非合并提交,然后是任何合并提交,依此类推。

但是,请考虑每个git cherry-pick实际执行的操作: 它包括将“他们所做的”与“您所做的”合并,其中“他们所做的”是父提交与子提交之间的区别,而“您所做的”是父提交与当前提交之间的差异。此处的父项和子项是我们赋予git merge命令的参数的父项和子项。如果该参数指定了合并提交,则我们还必须指定哪个父级(不再仅仅父级),因此需要-m标记。但是选择合并意味着我们应该采取合并另一方引入的所有更改

这意味着在很多情况下,您在选择樱桃时都希望跳过所有合并提交。

例如,假设我们有一个图,如下所示:

...--A--B--C--D---E--I   <-- feature-A
      \  \       /
       \  F--G--H
        \
         J--K--L   <-- feature-B (HEAD)
Run Code Online (Sandbox Code Playgroud)

我们当前的提交是commit L。我们想获得的,对于一些特殊的原因,相当于樱桃采摘提交F通过H,作为任何一个大的承诺或三个小提交,我们添加顶上L,赠送:

...--A--B--C--D---E--I   <-- feature-A
      \  \       /
       \  F--G--H
        \
         J--K--L--FGH'   <-- feature-B (HEAD)
Run Code Online (Sandbox Code Playgroud)

其中FGH'的三个提交序列(F'-G'-H')或与其他三个提交具有相同功能的单个提交。

我们可以通过使用得到这个git cherry-pick和指导的Git复制的提交FGH。请注意,根本不需要-m标志,因为这些都不是合并提交。如果我们不使用-n提交来限制每个人的选择,然后git commit在最后做自己的选择,我们将得到一次大的FGH'提交。(如果我们让git cherry-pick做个人提交的,当然,我们得F'G'然后H'。)

或者,我们可以改为使用merge commit进行选择E。合并提交E两个父母,分别是DH。如果看一下D和之间的比较E,我们将看到的更改是通过F-G-H序列导入的所有更改。因此,我们很可能作为一次提交获得F-G-H序列的副本。如果我们只想要一个提交,那可能是个好方法。它只是一个,git cherry-pick而不是三个,因此当然更容易。

但是,有一个警告:自动排除E通过C-D序列已达到的任何更改。例如,假设从变化CD类似于从变化BF,使D 包括一切在F。然后之间的差DE仅仅是从差之和F,以G和从GH。(换句话说,Bvs H显示了F-G-H序列中发生的事情,但是Bvs D 包含了发生的所有事情F。因此,Dvs E有效地隐藏F更改,因为它们已经存在D。)因此,挑选合并将使我们获得一个具有GH合并但缺乏的提交F这可能是你想要的。可能不是您想要的。此操作没有单一的通用公式。您必须检查有问题的提交并思考问题,而不是在此处盲目地应用某些过程。

但是,无论如何,您现在都具有考虑问题并选择解决方案所需的工具。