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

时间:2018-01-18 22:56:08

标签: git cherry-pick git-cherry-pick

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

1 个答案:

答案 0 :(得分:4)

  

有没有冲突可以做到吗?

这取决于提交转换为更改集中的内容,以及您当前提交中的内容。它也不是我会关注的真正问题。

  

...它失败了,因为在这个范围内我有合并[提交]

大概你的意思是git cherry-pick在到达合并提交时抱怨你没有指定-m参数。如果你指定-m参数(git cherry-pick -m 1 ...),Git会抱怨你 为这些提交指定了-m参数是合并。这确实是conundrum:您必须指定-m 1,同时省略-m 1

这个问题的直接解决方案是做一些挑剔的事情:选择第一个但是很多非合并提交(按照正确的顺序并且没有-m参数),然后进行任何合并提交(在正确的顺序使用正确的-m参数,几乎总是-m 1),然后是任何非合并提交,然后是任何合并提交,依此类推。

考虑一下每个git cherry-pick实际的作用:它包括合并"他们做了什么"用"你做了什么",在哪里"他们做了什么"是父提交和子提交之间的区别,"你做了什么"是父提交和当前提交之间的区别。这里的父和子是我们给git merge命令的参数的父和子。如果该参数指定了合并提交,我们还必须指定哪个父级 - 它不再只是 父级 - 因此需要{{1}标志。但是选择合并意味着我们应该采取合并的另一条腿引入的所有更改

这意味着在很多情况下,您需要在采摘樱桃时跳过所有合并提交。

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

-m

我们当前的提交是提交...--A--B--C--D---E--I <-- feature-A \ \ / \ F--G--H \ J--K--L <-- feature-B (HEAD) 。出于某些特殊原因,我们希望获得相当于挑选提交LF的提交,作为我们在{{1}上添加的一个大提交或三个小提交给予:

H

其中L是一个三提交序列(...--A--B--C--D---E--I <-- feature-A \ \ / \ F--G--H \ J--K--L--FGH' <-- feature-B (HEAD) )或一个提交与其他三个提交相同的提交。

我们可以使用FGH'并指示Git复制提交F'-G'-H'git cherry-pickF。请注意,根本不需要G标志,因为这些都不是合并提交。如果我们使用H来禁止提交每个单独的选择,并在最后执行我们自己的-m,那么我们会得到一个大的-n提交。 (如果我们让git commit做个别提交,当然,我们会FGH'然后git cherry-pick然后F'。)

,我们可以使用合并提交G'进行挑选。合并提交H'两个父项,即EE。如果我们查看DH之间的比较,我们将看到的更改是通过D序列导入的所有更改。因此,作为单个提交,我们可能会获得E序列的副本。如果我们只想要一次提交,那么可能就是这样。它只有一个F-G-H而不是三个,所以它当然更容易。

但有一点需要注意:这会自动排除通过F-G-H序列已经达到git cherry-pick的所有更改。例如,假设从EC-D的更改类似于从CD的更改,因此B 包含 F中的所有内容。然后,DF之间的差异只是DE以及FG之间差异的总和。 (换句话说,G vs H显示B序列中发生的事情,但H vs F-G-H 包括 B中发生的所有事情。D vs F有效隐藏 D更改,因为它们已经在{{1}因此,挑选合并将使我们获得一个具有EF组合效果的提交,但缺少D 这可能是你想要的。它可能不是你想要的。此操作没有单一的通用公式。您必须检查有问题的提交并考虑问题,而不是盲目地在此处应用某些过程。

无论如何,您现在拥有了解问题并选择解决方案所需的工具。