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

如何撤销Git中无合并提交的快进合并操作?

如何撤销已推送到远程的快进合并

没问题,这种快进合并后的撤销操作分两种场景来处理,取决于你的远程仓库有没有其他协作者——毕竟推送到远程之后的操作得考虑会不会影响别人:

场景1:远程仓库只有你自己在使用(无其他协作者)

这种情况可以直接“回滚”远程分支到合并前的状态,步骤如下:

  • 先切换到develop分支:
    git checkout develop
    
  • 找到合并前develop分支的提交哈希值。你可以用git reflog查看所有本地Git操作记录,找到合并前的那条记录(比如看起来像abc123 HEAD@{2}: checkout: moving from feature to develop这样的条目,对应的哈希就是合并前develop的状态)。
  • 硬重置develop分支到该提交(注意:这会清除本地develop分支上未提交的修改,执行前请确认没有未保存的工作):
    git reset --hard <合并前的提交哈希>
    
  • 最后强制推送到远程仓库,覆盖远程的develop分支:
    git push origin develop --force
    

场景2:远程仓库有其他协作者(不能强制推送)

如果有其他人在使用远程的develop分支,强制推送会覆盖别人的修改,引发协作问题。这时候要用**反向提交(revert)**的方式来撤销,步骤如下:

  • 切换到develop分支:
    git checkout develop
    
  • 找到合并前develop分支的提交哈希(同样可以用git refloggit log --oneline查找),假设这个哈希是abc123
  • 批量撤销从合并点到当前HEAD的所有提交(也就是feature分支上的所有修改),如果想一次性生成一个撤销提交,可以加上--no-commit参数再手动提交:
    git revert --no-commit abc123..HEAD
    git commit -m "Revert all changes from feature branch (fast-forward merge undo)"
    
    如果你想逐个撤销每个提交(每个撤销对应一个单独的提交),直接去掉--no-commit即可:
    git revert abc123..HEAD
    
  • 最后把这些撤销提交推送到远程:
    git push origin develop
    

额外注意事项

  • 执行操作前一定要用git refloggit log反复确认你要回滚/撤销的是正确的提交,避免误操作。
  • 如果后续还想重新合并feature分支的内容,用revert方式的话,需要先撤销这次的revert提交(也就是执行git revert <刚才生成的revert提交哈希>),或者基于最新的develop分支重新拉取新的feature分支进行开发。
  • 硬重置+强制推送只适合单人使用的仓库,多人协作场景下务必用revert方式!

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

火山引擎 最新活动