我最近需要压制我的一个 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 命令,将ffb98dd 和2702f8b 合并为一个提交。
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 命令,我们能够将前两个提交压缩成一个。