繁体   English   中英

git cherry-pick {commit-hash}做什么?

[英]what does git cherry-pick {commit-hash} do?

鉴于我有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只添加行打印(“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

挑选樱桃本质上是复制 (提交的效果)。 你可以用你明显的方式来思考它 - 也就是说,作为难以接受的提交及其父对象,然后将该差异应用于当前提交 然而,它比仅仅差异和应用更强大,因为它可以访问Git的完全合并机制

这意味着git cherry-pick在内部真的是一个完整的git merge ,两个提交被合并为你当前的提交 - 你的HEAD - 以及你正在挑选的提交。 此操作的合并基础是您正在挑选的提交的父级。

这样做的原因是,正如您所看到的,如果您的HEAD提交和您正在挑选的提交已更改“相同”行,则可能会出现合并冲突 在这种情况下,您的HEAD提交添加了行print("A") ,可能在文件的末尾,但无论如何都在其他行之前。 同时,你告诉Git提交樱桃挑选提交c3的提交 - 在同一个地方 (在文件的末尾,或在相同的现有行之前print("C")添加行print("C") )。 Git不知道添加print ,因此它会声明冲突并让选择正确的答案。

解决方案很简单:在编辑器中打开冲突的文件并调整它以包含冲突的正确解决方案,然后将其写出来并在文件上使用git add ,这样就可以运行git cherry-pick --continue来完成樱桃采摘过程。 或者,如果您愿意,可以使用合并工具获取所有三个输入文件(基本,“我们的”或HEAD ,以及“他们的”或c3的版本)并以这种方式解决冲突。

有关樱桃选择的更多信息,请参阅使用git进行的樱桃选择是什么意思?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM