鉴于我依次进行了3次提交
c1
+ print("A")
c2
+ print("B")
c3
+ print("C")
然后我在c1签出一个新分支。
git checkout -b br c1
然后我选择c3。
git cherry-pick c3.
我想要的是文件
print("A")
print("C")
-我只选择c3,而c3只需添加行print(“ C”)
但是事实是我没有冲突,结果是
print("A")
++<<<<<<< HEAD
++=======
+ print("B")
+ print("C")
++>>>>>>> f1383aa... C
我的问题是: 1.为什么会发生冲突? 2.如果我要打印(“ A”)和打印(“ C”)怎么办?
我也尝试过
git diff C^1 .. C > 1.patch
git apply 1.patch
我知道了
zhifan@zhifandeMacBook-Pro ~/g/demo> git apply 1.patch
error: patch failed: 1.py:1
error: 1.py: patch does not apply
答案 0 :(得分:2)
摘樱桃实质上是复制(提交的效果)。您可以按照明显的方式来考虑它-例如,将
这意味着git cherry-pick
在内部实际上是一个完整的git merge
,两个提交合并为您当前的提交-您的HEAD
-而您是樱桃的提交-采摘。此操作的合并基础是您正在挑选的提交的父级。
这样做的原因是,如您所见,如果您的HEAD
提交和您选择的提交都已发生更改,则可能会发生合并冲突。相同”的行。在这种情况下,您的HEAD
提交可能在文件末尾添加了print("A")
行,但无论如何都在其他行之前。同时,您要告诉Git进行选择的提交-提交c3-将print("C")
行添加到同一位置(在文件末尾,或在同一行之前) 。 Git不知道添加的print
的放置位置,因此它声明了冲突并使您选择正确的答案。
解决方案非常简单:在编辑器中打开冲突的文件,并对其进行调整以包含正确的冲突解决方案,然后将其写出并在文件上使用git add
,以便可以运行{{1 }}完成挑选樱桃的过程。或者,如果愿意,可以使用合并工具获取所有三个输入文件(基本,“我们的”或git cherry-pick --continue
,以及“他们的”或c3的版本),然后以这种方式解决冲突。
有关樱桃采摘的更多信息,请参见What does cherry-picking a commit with git mean?