Git:重置合并提交

时间:2018-11-19 03:44:22

标签: git

假设有两个分支:

主人:

0--1--2

dev:

0--1--2

因此,我们将dev合并到master,最后得到合并提交4和两个父提交23

0--1----2---4
    \--3---/

现在,如果我们放弃了通过git reset --soft head~1进行的合并提交,则会得到以下日志:

0--1--2

问题是:为什么git决定删除提交3但不删除2

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的第一个父级,即您合并时所在的分支。单独使用波浪号语法无法访问第二个父级(合并的分支)。