假设有两个分支:
主人:
0--1--2
dev:
0--1--2
因此,我们将dev合并到master,最后得到合并提交4
和两个父提交2
和3
:
0--1----2---4
\--3---/
现在,如果我们放弃了通过git reset --soft head~1
进行的合并提交,则会得到以下日志:
0--1--2
问题是:为什么git决定删除提交3
但不删除2
?
答案 0 :(得分:1)
当您向git请求git reset --soft HEAD~1
时,您(没有其他人)正在要求git将分支指针放在给定的修订版(HEAD〜1)上,在这种情况下,该修订版将结束可能是您合并了修订版2,而修订版2位于修订版3之上,因此在修订版中,第一个父级将是3,这就是HEAD〜1指向修订版3的原因。
如果您向git索取git reset --soft 2
(为修订版2提供修订版ID),您将以0 - 1 - 2
结尾。决定的不是git,而是运行该命令的人。
答案 1 :(得分:1)
在您的示例中有些东西很可疑;我无法复制它。但是,对于git
背景而言,应该足以证明自己发生了什么。来自Git Book:
您还可以在
^
之后指定一个数字-例如,d921970^2
的意思是“d921970
的第二父级。”此语法仅对合并提交有用,该合并提交具有更多多于一位父母。第一个父级是您合并时所在的分支,第二个父级是您在其中合并的分支上的提交
和
另一个主要祖先规范是
~
(波浪号)。这也指的是第一父级,因此HEAD~
和HEAD^
是等效的。当您指定数字时,区别变得明显。HEAD~2
的意思是“第一对父母的第一对父母”或“祖父母”-遍历第一对父母您指定的次数。
因此:
在这种情况下,负责人有两个父母。那么HEAD〜1指向哪一个?
它是指HEAD
的第一个父级,即您合并时所在的分支。单独使用波浪号语法无法访问第二个父级(合并的分支)。