git删除中间的已push的commit记录
在日常的代码管理中,我们经常会遇到需要修改 Git 历史记录的情况,比如删除中间的某些 commit。使用 git rebase 进行变基操作可以帮助我们轻松实现这一点。
为什么不用reset和revert?
这两种方法在特定的情况下确实很好用。但是我们经常会遇到这种情况:我们在 Git 仓库中提交了多个 commit 后,可能会发现其中某些 commit 是错误的、冗余的,或者包含了不必要的更改。这时,我们需要删除这些中间的 commit。例如:ABCD的提交中,B藏了个雷需要排掉。
这个时候用reset和revert删除中间的 commit 记录就有点不太好用了:
reset的方法会直接把B之后的提交记录C、D都搞没,影响过于宽泛,后续还得把C、D的代码找回来。revert中间的commit是会在比较遥远的地方改变代码不方便查看代码历史,而且在删除多条记录时会比较麻烦(要revert很多次)。
所以,我们需要一个方法,能够无痛,精准的切掉中间commit记录。git rebase 里面的交互式变基正好能够满足我们的需求。
操作示例
1.找到要删除的commit的前一个commit的hash
git命令使用git reflog然后复制对应的commit id

复制前面的0aadee4。
2. 使用git rebase -i [commit id]启动交互式变基。
git rebase -i 0aadee4
进入以下界面:

3. 将要删除的commit行前面的pick改为drop或者直接删除那行。

4. 保存并退出编辑器(按esc,然后输入:wq后按回车键),Git将重新应用剩余的commits
如果有冲突排除冲突即可(冲突的解决贴出来有点繁琐),最后结果如下:

5. 强制推送到远程仓库
这个时候还没结束,我们的操作修改git历史,如果这些commits已经被推送到了远程仓库,需要进行git push --force来强制推送。
使用git revert删除中间已push的commit记录
首先,找到提交 `b` 的哈希值(假设为 `hash_b`)。
然后,运行以下命令:
git revert hash_b
这将创建一个新的提交,撤销提交 `b` 的更改,同时保留提交 `a`、`c` 和 `d`。执行后,你的提交历史将包含一个新的提交,用于反转 `b` 的更改。
总结
git rebase -i 确实是一个能够化腐朽为神奇的命令,但是git revert也能达到同样的效果(尽管没有那么优雅),但是git revert 不涉及git push --force这个比较危险的命令。
- 如果提交已经推送到共享仓库,建议使用 `git revert`。这将创建一个新的提交来撤销指定的提交,保持历史完整。
- 如果提交尚未推送,且你希望完全删除该提交(而不是撤销),可以使用 `git rebase -i`。请注意,这会重写历史,可能影响其他协作开发者。
所以,推荐在改动比较小的情况下用git revert,而不是git rebase -i。

浙公网安备 33010602011771号