如何压制 Git 仓库中的前两个提交

72 阅读1分钟

我最近需要压制我的一个 Git 仓库的前两个提交。像往常一样,我运行了git rebase -i 命令来做交互式重定位,但我注意到根提交没有出现在提交列表中。

下面是我的 Git 历史记录的样子。

$ git log --graph --oneline
* fe2c946 (HEAD -> main) More changes
* 2702f8b Small tweaks
* ffb98dd Initial commit

当我运行git rebase -i ffb98dd 时,得到的输出是这样的(为简洁起见省略了)。

pick 2702f8b Small tweaks
pick fe2c946 More changes

# Rebase ffb98dd..fe2c946 onto ffb98dd (2 commands)
# ...

如你所见,第二个提交2702f8b 和第三个提交fe2c946 被列出,但最初的提交ffb98dd 却没有。那么,如果根提交没有被列出,你如何将第二个提交压入根提交?

这个问题的解决方案在Git 1.17.12 中被引入。我们现在可以为rebase 命令指定--root 标志,将所有可触及的提交重写到根目录。

$ git rebase -i --root

这使得我们可以重写 Git 历史,直到根提交。现在,输出的第一行包括根提交ffb98dd

pick ffb98dd Initial commit
pick 2702f8b Small tweaks
pick fe2c946 More changes

# Rebase fe2c946 onto 6fafbe0 (3 commands)
# ...

我们可以在第二行使用squash 命令,将ffb98dd2702f8b 合并为一个提交。

pick ffb98dd Initial commit
squash 2702f8b Small tweaks
pick fe2c946 More changes

# Rebase fe2c946 onto 6fafbe0 (3 commands)
# ...

现在,我们需要为新的合并提交选择一条信息。我保留了 "初始提交",因为它仍然是一个准确的描述。命令完成后,Git 历史记录看起来是这样的。

* bfd9495 (HEAD -> main) More changes
* 34901ec Initial commit

就这样,我们开始了在 "Small tweaks "提交中所作的修改2702f8b 已经被折叠到我们的初始提交中。使用--root 选项和rebase 命令,我们能够将前两个提交压缩成一个。