git rebase -i HEAD~N returns 超过 N 次提交

git rebase -i HEAD~N returns more than N commits

这是我的 git 命令:

git rebase -i HEAD~2

我希望看到 2 个最近的提交,但我看到的是:

我还想提一下,虽然我一直在尝试压缩某些提交,但我一直 运行 合并冲突。我感觉这些问题可能是相关的。

我有点 git 菜鸟所以任何帮助将不胜感激。

git log --graph --all --oneline --decorate:

提交链:

合并提交有多个 parent 提交。 ~ 表示提交的 第一次 parent。那是图表的左侧。 ~ 仅跟在第一个 parents 之后。 HEAD~2 要求第一个 grandparent.

~ 是跳过合并分支浏览历史的好方法。

* HEAD
|\
| *
| *
| *
| *
* | HEAD~1
|/
* HEAD~2
|\
| *
| *
|/
* HEAD~3

git rebase -i HEAD~2 实际上是 git rebase -i HEAD~2..HEAD,因此您将获得从 HEAD 可访问的所有提交,不包括从 HEAD~2 可访问的所有提交。这意味着 HEADHEAD~1 以及侧分支中的所有提交。

^用于选择parents。 HEAD^是第一个parent,和HEAD~一样。 HEAD^2 选择第二个 parent,这是分支中的第一个提交。

^~ 可以链接。如果你只想在侧分支上进行两次提交,那就是 git rebase -i HEAD^2~2HEAD^2 选择 HEAD 的第二个 parent。所以HEAD^2~2是HEAD的第二个parent的第一个grandparent。有插图就更简单了。

* HEAD
|\
| * HEAD^2
| * HEAD^2~ also HEAD^2^
| * HEAD^2~2 also HEAD^2^^
| * HEAD^2~3 also HEAD^2^^^
* | HEAD~1 also HEAD^1
|/
* HEAD~2 also HEAD^1~
|\
| *
| *
|/
* HEAD~3

困惑?没关系。与其搞乱这一切,通常更容易变基回到您合并的分支并将额外的提交保留为 pick.

git rebase -i main

有关更多信息,请参阅 gitrevisions