Git新手求助:如何修正GitLab中错误的Squash Commits操作
误压缩Git提交?别慌,两种场景的解决方案来啦
作为Git新手碰到这种情况太正常了,我来给你分两种常见场景说清楚怎么处理:
场景1:还没把错误的压缩提交推送到远程仓库(没执行git push origin mybranch)
这是最容易处理的情况,有两个方向可选:
方向A:彻底撤销这次错误的rebase,重新来
- 先执行
git reflog,你会看到类似这样的日志:
找到rebase开始前的那个commit哈希(比如上面的abc123 HEAD@{0}: rebase -i (finish): returning to refs/heads/mybranch def456 HEAD@{1}: rebase -i (start): checkout HEAD~3 ghi789 HEAD@{2}: commit: 这是你不该压缩的那个提交ghi789,或者用HEAD@{2}) - 执行
git reset --hard ghi789(把哈希换成你找到的那个),这样你的分支就回到了执行git rebase -i HEAD~3之前的状态 - 重新执行
git rebase -i HEAD~3,这次一定要仔细看每个提交的说明,把不该压缩的提交前面的squash(或s)改成pick(或p),只把需要合并的提交设为squash就好
方向B:直接修正已经压缩好的提交,删除错误文件
如果不想重来,只想删掉错误的文件:
- 在工作区直接删除那个不该纳入的错误文件
- 执行
git add .(或者只add被删除的文件) - 执行
git commit --amend,这会打开提交信息编辑器,你可以保留原来的提交信息,直接保存退出就行 - 这样就修正了压缩后的提交,之后正常push就好
场景2:已经把错误的压缩提交推送到远程仓库了(执行过git push origin mybranch)
这个情况要小心,因为远程分支的历史已经被修改了,如果有其他同事在这个分支工作,一定要先跟他们沟通!
- 先按场景1的方法,用
git reflog找到rebase前的commit哈希,执行git reset --hard <哈希值>回到正确的状态 - 重新正确执行
git rebase -i HEAD~3,选对要压缩的提交 - 执行
git push origin mybranch --force-with-lease,这个命令比直接用--force更安全,它会检查远程分支有没有其他人的新提交,避免不小心覆盖别人的工作
注意:如果你的团队禁止修改远程分支历史,那最好的办法是新建一个提交,把错误文件删除,然后提交推送到远程,虽然会多一个提交,但不会影响历史记录。
内容的提问来源于stack exchange,提问作者Jappa




