如何让 git Cherry Pick 使用快进技术

问题描述 投票:0回答:2

通过使用 gitcherry-pick,我一直在尝试将最后一次提交从一个分支合并到另一个分支。但它总是会导致合并冲突,而实际上不应该如此。以下是我一直在做的事情,它总是会导致冲突。

  1. 启动一个新的存储库,并在 master 分支上提交一个新的文件。该文件将包含以下内容 -
MASTER - 1st commit
  1. 签出到名为testing的新分支,并对文件进行以下更改,然后再次提交。
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 git-merge cherry-pick
2个回答
1
投票

两种情况下应用的补丁都不同。
此外,

git merge
具有“快进”功能,如果它确定产生正确合并的一种方法是简单地将分支
A
移动到分支
B
所在的位置,它就会这样做,并且总是会产生这样的结果以无冲突的解决方案。

在您描述的示例中:

  • 恰好
    testing
    领先于
    master
    ,因此可以使用快进来解决合并,不会发生冲突,
  • 碰巧您在
    cherry-pick
    命令中选择的提交创建了一个补丁,该补丁无法按当前提交的方式应用,因此会发生冲突

在您描述的示例中:

    如果您申请了
  • both

    提交,

    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

所以你们一定会发生冲突。


0
投票

正如另一条评论指出的,正常的方法是使用

git merge --ff-only testing
(在
master
上时),但如果你真的想出于某种原因使用cherry-pick,它确实有一个
--ff
开关,所以你可以用
git cherry-pick --ff <testing 1st commit id> <testing 2nd commit id>
代替。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.