通过使用 gitcherry-pick,我一直在尝试将最后一次提交从一个分支合并到另一个分支。但它总是会导致合并冲突,而实际上不应该如此。以下是我一直在做的事情,它总是会导致冲突。
MASTER - 1st commit
MASTER - 1st commit : TESTING 1st commit
3.) 在文件的同一行上进行进一步更改并再次提交。所以最后,文件内容将如下所示。
MASTER - 1st commit : TESTING 1st commit : TESTING 2nd commit
现在,这将使我们在主分支上留下 1 个提交,在测试上留下 2 个提交。因此,如果我们要签出 master 并执行
git merge testing
,那么由于 master 的最后一次提交和测试的最后一次提交之间存在直接路径,因此 git 将使用快进技术,并且没有任何合并冲突,它将直接合并从测试到掌握的更改。所以我的问题是,为什么当我尝试 git cherry-pick testing
时情况并非如此(即将测试中的最后一次提交合并到 master 中,而 master 又具有指向它的直接路径)。如果我在这里错了,那么请提出建议,正确的方法是什么。
两种情况下应用的补丁都不同。
此外,
git merge
具有“快进”功能,如果它确定产生正确合并的一种方法是简单地将分支A
移动到分支B
所在的位置,它就会这样做,并且总是会产生这样的结果以无冲突的解决方案。
在您描述的示例中:
testing
领先于 master
,因此可以使用快进来解决合并,不会发生冲突,cherry-pick
命令中选择的提交创建了一个补丁,该补丁无法按当前提交的方式应用,因此会发生冲突在您描述的示例中:
提交,
cherry-pick
就不会冲突:
git chery-pick <1st commit> <2nd commit>
这将产生与运行
git merge testing
相同的最终结果:所有 testing
上的更改将添加到 master
之上。
使用cherry-pick 在分支上应用所有提交的更系统的方法是:
# you don't have to name the commits one by one :
# let git compute that for you
git cherry-pick master..testing
<2nd commit>
并排除 <1st commit>
:<2nd commit>
有一个 diff 表示:
# replace the line that says 'MASTER ... 1st commit'
# with a line that says 'MASTER ... 2nd commit'
-MASTER - 1st commit : TESTING 1st commit
+MASTER - 1st commit : TESTING 1st commit : TESTING 2nd commit
您尝试将其应用到该文件内容所在的分支:
# uh oh, no line saying 'MASTER - 1st commit : TESTING 1st commit'
MASTER - 1st commit
所以你们一定会发生冲突。
正如另一条评论指出的,正常的方法是使用
git merge --ff-only testing
(在 master
上时),但如果你真的想出于某种原因使用cherry-pick,它确实有一个 --ff
开关,所以你可以用 git cherry-pick --ff <testing 1st commit id> <testing 2nd commit id>
代替。