【问题标题】:Git reset HEAD~1 goes to the wrong commitGit reset HEAD~1 提交错误
【发布时间】:2020-12-05 21:24:21
【问题描述】:

我读到了关于提交、父母和祖先的文章。为了获得更多说明,我尝试对其进行试验并创建了一个测试 git repo。我的目标是将 3 个分支合并到主分支中,以了解父母和祖先的不同之处。以下截图是git log美化了。

正如我们在日志中看到的,合并提交44f1883 似乎有三个父级,即4385eae7288d94ee647fe。我不明白为什么它没有98c9d28,因为它也是父级。我认为98c9d28 应该是它的直接父级,所以如果从master 运行git reset HEAD~1,它应该让我进入提交98c9d28,这是我合并之前的状态,但不幸的是,它让我处于4385eae 逻辑上是不正确的(虽然从日志的角度来看是正确的)。

我错过了什么吗?

【问题讨论】:

  • 为了将来参考,在问这样的问题时,您应该记录您使用的 exact 命令及其输出。最初我刚刚对此发表了评论,但我意识到您可能做了什么,因此能够在下面提供我怀疑的正确答案。

标签: git git-merge git-branch git-commit git-log


【解决方案1】:

您看到的是git merge 在收到异常命令时尽最大努力提供帮助。

来自master,你一定说过

git merge branch1 branch2 branch3

这是允许的并执行“章鱼合并”,但这不是合并分支的常用方法 - 通常一次合并一个分支。当你确实使用 octopus merge 时,会有一些限制(冲突一般不会处理好);如您所见,即使它起作用,行为也可能有点奇怪。

如果您查看合并命令的输出,您会看到它使用了快进到branch1,然后从那里对其余分支执行合并。想必这是为了降低章鱼合并的复杂度。

(如果你不熟悉合并的快进行为...基本上 git 看到 master 不包含 branch1 中没有的任何更改,所以与其合并它只是移动 masterbranch1。)

在任何情况下,您可能希望或不希望 git 使用快进,在这种情况下,它可能会特别令人困惑,因为快进会立即与其他合并操作相结合,使得刚刚发生的事情变得不那么明显 - 并且,正如您所说,导致最终图表可能看起来不像您预期​​的那样。

所以你可以将--no-ff 选项添加到你的合并命令中,然后它就不会这样做了。 (有趣的是,在我的测试中,输出仍然表明使用了快进;但最终的图表显示了所有 4 个父级。很可能它仍然使用快捷算法来尝试产生结果,但随后记录提交,就好像它没有。)

但实际上,无论如何我都会对章鱼合并保持警惕。

【讨论】:

  • 是的,我说git merge branch1 branch2 branch3。我接受你的回答
猜你喜欢
  • 2014-08-25
  • 2016-02-24
  • 2021-07-04
  • 2010-09-05
相关资源
最近更新 更多