anb*_*ber 1 git cherry-pick git-cherry-pick
我需要挑选一系列提交,但是失败了,因为在这个范围内,我合并了一些分支。是否可以做到没有冲突?
是否可以做到没有冲突?
这取决于转换为变更集的提交中的内容,以及您自己当前提交中的内容。我也不担心这是真正的问题。
...失败,因为在此范围内我已经合并[提交]
大概是指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复制的提交F,G和H。请注意,根本不需要-m标志,因为这些都不是合并提交。如果我们不使用-n提交来限制每个人的选择,然后git commit在最后做自己的选择,我们将得到一次大的FGH'提交。(如果我们让git cherry-pick做个人提交的,当然,我们得F'再G'然后H'。)
或者,我们可以改为使用merge commit进行选择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到H。(换句话说,Bvs H显示了F-G-H序列中发生的事情,但是Bvs D 包含了发生的所有事情F。因此,Dvs E有效地隐藏了F更改,因为它们已经存在D。)因此,挑选合并将使我们获得一个具有G和H合并但缺乏的提交F。 这可能是你想要的。可能不是您想要的。此操作没有单一的通用公式。您必须检查有问题的提交并思考问题,而不是在此处盲目地应用某些过程。
但是,无论如何,您现在都具有考虑问题并选择解决方案所需的工具。
| 归档时间: |
|
| 查看次数: |
1327 次 |
| 最近记录: |