Git reset HEAD~1 进入错误提交
Git reset HEAD~1 goes to the wrong commit
我阅读了有关提交、parent 和祖先的信息。为了获得更多说明,我尝试对其进行试验并创建了一个测试 git 存储库。我的目标是将 3 个分支合并到 master 分支中,以了解 parent 和祖先有何不同。下面的截图是git log
美化后的
正如我们在日志中看到的,合并提交 44f1883
似乎有三个 parent,即 4385eae
、7288d94
和 ee647fe
。我不明白为什么它没有 98c9d28
因为它也是 parent。我认为 98c9d28
应该是它的直接 parent 所以如果从 master
,我 运行 git reset HEAD~1
,它应该让我在提交 98c9d28
这是我合并之前的状态,但不幸的是,它让我到达 4385eae
,这在逻辑上是不正确的(尽管从日志的角度来看是正确的)。
我是不是漏掉了什么?
您看到的是 git merge
在收到不寻常的命令时尽力提供帮助。
来自master
,你一定说过
git merge branch1 branch2 branch3
这是允许的并执行“章鱼合并”,但这不是合并分支的常用方法 - 通常一次合并一个分支。当你使用 octopus merge 时,有一些限制(冲突通常不会被很好地处理);即使它有效,如您所见,行为也可能有点奇怪。
如果您查看合并命令的输出,您会发现它使用 fast-forward 到 branch1
,然后从那里对其余分支执行合并。大概这是为了降低章鱼合并的复杂性。
(如果您不熟悉合并的 fast-forward 行为...基本上 git 看到 master
不包含 [=13] 中没有的更改=] 所以不是合并它只是将 master
移动到 branch1
.)
在任何情况下,您可能希望或不希望 git 使用 fast-forward,在这种情况下,它可能会特别令人困惑,因为 fast-forward 会立即与其他合并相结合操作,使刚刚发生的事情不那么明显 - 正如你所说,导致最终图表可能看起来不像你期望的那样。
因此您可以将 --no-ff
选项添加到您的合并命令中,然后它就不会这样做了。 (有趣的是,在我的测试中,输出仍然表明使用了 fast-forward;但最终图表显示了所有 4 个父节点。很可能它仍然使用快捷算法来尝试生成结果,但随后将提交记录为虽然它没有。)
但实际上,无论如何我都会对章鱼合并保持警惕。
我阅读了有关提交、parent 和祖先的信息。为了获得更多说明,我尝试对其进行试验并创建了一个测试 git 存储库。我的目标是将 3 个分支合并到 master 分支中,以了解 parent 和祖先有何不同。下面的截图是git log
美化后的
正如我们在日志中看到的,合并提交 44f1883
似乎有三个 parent,即 4385eae
、7288d94
和 ee647fe
。我不明白为什么它没有 98c9d28
因为它也是 parent。我认为 98c9d28
应该是它的直接 parent 所以如果从 master
,我 运行 git reset HEAD~1
,它应该让我在提交 98c9d28
这是我合并之前的状态,但不幸的是,它让我到达 4385eae
,这在逻辑上是不正确的(尽管从日志的角度来看是正确的)。
我是不是漏掉了什么?
您看到的是 git merge
在收到不寻常的命令时尽力提供帮助。
来自master
,你一定说过
git merge branch1 branch2 branch3
这是允许的并执行“章鱼合并”,但这不是合并分支的常用方法 - 通常一次合并一个分支。当你使用 octopus merge 时,有一些限制(冲突通常不会被很好地处理);即使它有效,如您所见,行为也可能有点奇怪。
如果您查看合并命令的输出,您会发现它使用 fast-forward 到 branch1
,然后从那里对其余分支执行合并。大概这是为了降低章鱼合并的复杂性。
(如果您不熟悉合并的 fast-forward 行为...基本上 git 看到 master
不包含 [=13] 中没有的更改=] 所以不是合并它只是将 master
移动到 branch1
.)
在任何情况下,您可能希望或不希望 git 使用 fast-forward,在这种情况下,它可能会特别令人困惑,因为 fast-forward 会立即与其他合并相结合操作,使刚刚发生的事情不那么明显 - 正如你所说,导致最终图表可能看起来不像你期望的那样。
因此您可以将 --no-ff
选项添加到您的合并命令中,然后它就不会这样做了。 (有趣的是,在我的测试中,输出仍然表明使用了 fast-forward;但最终图表显示了所有 4 个父节点。很可能它仍然使用快捷算法来尝试生成结果,但随后将提交记录为虽然它没有。)
但实际上,无论如何我都会对章鱼合并保持警惕。