git - 为什么这个 cherry-pick 有冲突?

标签 git cherry-pick git-cherry-pick

我知道 git cherry-pick 是一个用于应用指定提交的更改的命令,但我想我只是不太了解它的工作方式。

假设 repo 行为是这样的:

git init

echo a>a
git add .; git commit -am 'master add line a'

git checkout -b dev
echo b>>a
git commit -am 'dev add line b'
echo c>>a
git commit -am 'dev add line c'

git checkout master

git cherry-pick dev

我认为 cherry-pick 命令可以很好地工作并将文件 a 更改为:

a

c

但实际上我收到了以下消息:

error: could not apply 08e8d3e... dev add line c
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

然后我运行:

git diff

输出:

diff --cc a
index 7898192,de98044..0000000
--- a/a
+++ b/a
@@@ -1,1 -1,3 +1,6 @@@
  a
++<<<<<<< HEAD
++=======
+ b
+ c
++>>>>>>> 11fff29... abc

所以我的问题是:为什么会出现像 git-diff 显示的冲突? cherry-pick 在这种情况下的工作细节是什么?

最佳答案

之后再次尝试您的选择:

git config merge.conflictstyle diff3

您将获得更详细的差异:

<<<<<<< HEAD
||||||| parent of 5b2a14c... dev add line c
b
=======
b
c
>>>>>>> 5b2a14c... dev add line c

表明,在应用dev的HEAD(bc)表示的补丁时,Git并不知道a共同祖先;它遵循:

  • cherry-picked 提交的直接父级(表明它在行 'b' 之后添加了一行 'c')
  • 目标提交(它根本不显示 b 行,它可以在其上应用添加的更改 'c')

因此冲突。

Cherry-picking不像 merge (寻找 merge-base )。

Cherry-picking 进行提交并应用它引入的更改

这里引入的变化是:在b之上添加c
并且目标提交根本没有 b,所以对于 Git:

  • 上游(目标)提交已“删除 b”(或者一开始就没有它,这里就是这种情况,但 Git 不知道),
  • 源代码提交有一个 b,在上面添加了 c

就 Git 在尝试应用该补丁时所知道的(这就是 git cherry-pick 所做的一切:应用补丁。它根本不查找 cherry-picked 提交的历史), 即冲突:并发修改。

如果您确定该解决方案应该采用的方式,您可以:

> git cherry-pick -Xtheirs dev
[master 7849e0c] dev add line c
 Date: Wed Aug 17 08:25:48 2016 +0200
 1 file changed, 2 insertions(+)

然后,您会看到 bc 添加到原始提交中,没有任何冲突(因为您指出了如何使用选项 '- Xtheirs' 传递给了 default merge strategy recursive )

关于git - 为什么这个 cherry-pick 有冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38864884/

相关文章:

git - 如何找到添加给定文件的提交?

git remote 两个分支同名大小写不同

git - 挑选正确的方式来向后移植和整合主题分支修复是正确的吗?

version-control - 到 "backport"的工作流程更改为不同的 Mercurial (Hg) 分支?

Git 樱桃选择 : how to regenerate change id?

git - 对于特定提交,Git-merge 和 Git-cherry-pick 之间有什么区别?

git - 谁能解释一下 git cherry-pick <sha> 的作用?

git - 如何让 netbeans 工作 git?

git - Git 新手 : git push origin master = "ssh_exchange_identifiction: Connection closed by remote host. Fatal: The remote end hung up unexpectedly"

git - `--abort` 和 `--quit` 作为 `cherry-pick` 的定序器子命令有什么不同?