如何清理 git 历史记录,在推送后删除某些提交?

How to cleanup git history removing certain commits after they've been pushed?

我想做什么:

我完成了一项功能。

git add -A; git commit -m "feature A complete"

然后我意识到我错过了一些东西。

git add -A; git commit -m "feature A missed something 1"
git add -A; git commit -m "feature A missed something 2"
git add -A; git commit -m "feature A missed something 3"

现在我的历史是这样的:

A238ad1 feature A missed something 3
3238adX feature A missed something 2
1238ad7 feature A missed something 1
111AAA2 feature A complete

我希望它看起来像这样:

111AAA2 feature A complete

将所有 missed something 提交合并到 feature A complete 提交中。

我知道 git rebase -i HEAD~4 是正确的方法,但它实际上并没有删除错误的提交来清理历史记录。

我注意到在其他一些文章中有一个 git commit --fixup 命令和一个 git rebase -i --autosquash,但我没有让它正常工作。我敢肯定这非常简单,我今天刚玩完。

在这种情况下使用交互式变基

这可以使用

启动
git rebase -i 

后跟您要包含的头数

git rebase -i HEAD~5

其中 HEAD~5 表示最后 5 次提交

然后您可以使用更多选项将您的提交压缩为一个并编辑消息。只是代替 pick 选项写 squash 而不是

所以你看,我将选项 pick 更改为 s,这是 squash 的快捷方式。当我保存并关闭这个文件时,交互式变基将被启动,我指示要压缩的提交将被压缩到 21b4e04 Fixed missing bad practice。压缩后,它会要求您输入新的提交消息。输入您的新消息并点击 enter,您就完成了。