You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Git新手求助:如何修正GitLab中错误的Squash Commits操作

误压缩Git提交?别慌,两种场景的解决方案来啦

作为Git新手碰到这种情况太正常了,我来给你分两种常见场景说清楚怎么处理:

场景1:还没把错误的压缩提交推送到远程仓库(没执行git push origin mybranch

这是最容易处理的情况,有两个方向可选:

方向A:彻底撤销这次错误的rebase,重新来

  1. 先执行git reflog,你会看到类似这样的日志:
    abc123 HEAD@{0}: rebase -i (finish): returning to refs/heads/mybranch
    def456 HEAD@{1}: rebase -i (start): checkout HEAD~3
    ghi789 HEAD@{2}: commit: 这是你不该压缩的那个提交
    
    找到rebase开始前的那个commit哈希(比如上面的ghi789,或者用HEAD@{2}
  2. 执行git reset --hard ghi789(把哈希换成你找到的那个),这样你的分支就回到了执行git rebase -i HEAD~3之前的状态
  3. 重新执行git rebase -i HEAD~3,这次一定要仔细看每个提交的说明,把不该压缩的提交前面的squash(或s)改成pick(或p),只把需要合并的提交设为squash就好

方向B:直接修正已经压缩好的提交,删除错误文件

如果不想重来,只想删掉错误的文件:

  1. 在工作区直接删除那个不该纳入的错误文件
  2. 执行git add .(或者只add被删除的文件)
  3. 执行git commit --amend,这会打开提交信息编辑器,你可以保留原来的提交信息,直接保存退出就行
  4. 这样就修正了压缩后的提交,之后正常push就好

场景2:已经把错误的压缩提交推送到远程仓库了(执行过git push origin mybranch

这个情况要小心,因为远程分支的历史已经被修改了,如果有其他同事在这个分支工作,一定要先跟他们沟通!

  1. 先按场景1的方法,用git reflog找到rebase前的commit哈希,执行git reset --hard <哈希值>回到正确的状态
  2. 重新正确执行git rebase -i HEAD~3,选对要压缩的提交
  3. 执行git push origin mybranch --force-with-lease,这个命令比直接用--force更安全,它会检查远程分支有没有其他人的新提交,避免不小心覆盖别人的工作

注意:如果你的团队禁止修改远程分支历史,那最好的办法是新建一个提交,把错误文件删除,然后提交推送到远程,虽然会多一个提交,但不会影响历史记录。

内容的提问来源于stack exchange,提问作者Jappa

火山引擎 最新活动