我需要挑选一系列提交,但它失败了,因为在这个范围内我合并了一些分支。 有可能没有冲突吗?
答案 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)
。出于某些特殊原因,我们希望获得相当于挑选提交L
到F
的提交,作为我们在{{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-pick
和F
。请注意,根本不需要G
标志,因为这些都不是合并提交。如果我们使用H
来禁止提交每个单独的选择,并在最后执行我们自己的-m
,那么我们会得到一个大的-n
提交。 (如果我们让git commit
做个别提交,当然,我们会FGH'
然后git cherry-pick
然后F'
。)
或,我们可以使用合并提交G'
进行挑选。合并提交H'
有两个父项,即E
和E
。如果我们查看D
和H
之间的比较,我们将看到的更改是通过D
序列导入的所有更改。因此,作为单个提交,我们可能会获得E
序列的副本。如果我们只想要一次提交,那么可能就是这样。它只有一个F-G-H
而不是三个,所以它当然更容易。
但有一点需要注意:这会自动排除通过F-G-H
序列已经达到git cherry-pick
的所有更改。例如,假设从E
到C-D
的更改类似于从C
到D
的更改,因此B
包含 F
中的所有内容。然后,D
和F
之间的差异只是D
与E
以及F
与G
之间差异的总和。 (换句话说,G
vs H
显示B
序列中发生的事情,但H
vs F-G-H
包括 B
中发生的所有事情。D
vs F
有效隐藏 D
更改,因为它们已经在{{1}因此,挑选合并将使我们获得一个具有E
和F
组合效果的提交,但缺少D
。 这可能是你想要的。它可能不是你想要的。此操作没有单一的通用公式。您必须检查有问题的提交并考虑问题,而不是盲目地在此处应用某些过程。
无论如何,您现在拥有了解问题并选择解决方案所需的工具。