Git cherry picking commit-commit是快照还是修补程序?
我有一个问题是关于责任和冲突的 提交的“Pro-Git”书籍是一种快照,而不是补丁/差异 但樱桃树可能会表现得像一块补丁Git cherry picking commit-commit是快照还是修补程序?,git,cherry-pick,Git,Cherry Pick,我有一个问题是关于责任和冲突的 提交的“Pro-Git”书籍是一种快照,而不是补丁/差异 但樱桃树可能会表现得像一块补丁 简言之,示例如下: 创建3次提交,每次编辑文件的第一行(和一行) 将分支重置为首次提交 测试1:尝试选择第三次提交(冲突) 测试2:尝试选择第二次提交(OK) 测试1 #reset the branch to 9d5dd4d ('A' version) git reset --hard HEAD~2 HEAD is now at 9d5dd4d A git log --
简言之,示例如下:
测试1
#reset the branch to 9d5dd4d ('A' version)
git reset --hard HEAD~2
HEAD is now at 9d5dd4d A
git log --oneline
9d5dd4d A
#cherry-pick 'C' version over 'A'
git cherry-pick c90c5c8
error: could not apply c90c5c8... 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'
#the conflict:
cat file
<<<<<<< HEAD
A
=======
C
>>>>>>> c90c5c8... C
请解释测试1失败的原因(如果提交是补丁,而不是快照,我可以想象答案是什么?专业Git书籍是正确的:提交就是快照 不过,您也是正确的:
git cherry pick
应用补丁
这怎么可能?答案是,当你选择一个提交时,你还指定了哪一个父提交要考虑,使用<代码> -M父编号< /> >参数。然后,cherry pick命令针对该父级生成一个diff,以便现在可以应用生成的diff
如果您选择cherry pick非合并提交,则只有一个父级,因此您实际上不会传递
-m
,并且该命令使用(单个)父级来生成差异。但是提交本身仍然是一个快照,是cherry pick
命令查找提交^1
的差异(第一个也是唯一的父级)vscommit
并应用它。在第一次测试中存在合并冲突。因为你在第二次重置,所以成功了。Polywhill,谢谢你的回答,但是:1)不确定为什么你破坏了原始帖子的格式2)在检测到代码块时,testsStack溢出可能有点敏感之前,有一个硬重置@Polywhill先生实际上并没有试图改变任何东西,只是通过点击并排标记将其列为一个编号列表,正如您在修订历史中看到的那样。虽然可以在编辑预览中发现格式问题,但根据经验,我知道这很容易被忽略。对不起,我还是不明白。从您的解释的最后一段开始-在我的test1和test2中,commit^1
&commit
是什么?Git有丰富的语法来处理提交图。您可以通过提交的原始SHA-1(c18b86734113…
etc)来命名提交,但也可以通过跟踪提交图中的路径来命名提交。每个提交记录其父提交,并且^
语法选择特定的父提交。您将在第3章中看到更多关于提交图的信息,例如,在第7章中看到关于修订选择器的信息:Torek,我的问题表述错误,我知道SHA-1,^和~。让我们回到我的三个提交A、B和C。在最后一句话中,您谈到了提交和其父级之间的差异,这是由C-p应用的。所以,我的问题是:在测试1中,这些提交是9d5dd4d(A)和c90c5c8(C),对吗?所以他们的区别是“A\n”和“C\n”,这是我不明白的一点。为什么这个樱桃拣选失败,而差异为“A\n”和“B\n”的test2成功了?啊。不,当您要求cherry pickc90c5c8
git找到它的父对象,即28ad28f
。试试看:git rev parse c90c5c8^
,和git diff c90c5c8^c90c5c8
。一旦提交存在,它就永远不会更改git reset
不会更改任何现有的提交,它只会更改当前分支名称解析为哪个提交(再次使用git rev parse
演示:git rev parse master
将显示其当前原始SHA-1)。Cherry pick将提交与其父级进行比较,因为它是这样定义的。您给git一个或多个提交ID,git会找到每个命名提交的父项(如果合并,则为-m
)并执行一个diff,然后尝试应用该diff。在这种情况下,diff是“将B更改为C”,没有B,因此您会得到您观察到的补丁应用程序错误。(如果要执行其他操作,则不需要cherry pick命令。例如,如果只需要某个文件的特定快照版本,请使用git checkout--
,或git show:
)
#reset the branch to 9d5dd4d ('A' version)
git reset --hard HEAD~2
HEAD is now at 9d5dd4d A
git log --oneline
9d5dd4d A
#cherry-pick 'C' version over 'A'
git cherry-pick c90c5c8
error: could not apply c90c5c8... 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'
#the conflict:
cat file
<<<<<<< HEAD
A
=======
C
>>>>>>> c90c5c8... C
#same for 'B' - succeeds
git reset --hard HEAD
HEAD is now at 9d5dd4d A
git cherry-pick 28ad28f
[master eb27a49] B
1 file changed, 1 insertion(+), 1 deletion(-)