git cherry-pick {commit-hash}有什么作用?

时间:2018-10-22 12:27:35

标签: git git-cherry-pick

鉴于我依次进行了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

1 个答案:

答案 0 :(得分:2)

摘樱桃实质上是复制(提交的效果)。您可以按照明显的方式来考虑它-例如,将 diff与要选择的提交及其父对象进行比较,然后将该diff应用于当前提交。但是,它比单纯的diff-and-apply功能强大,因为它可以访问Git的完整 merge机制

这意味着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?