Git中执行git reset --merge后如何完成合并撤销?
解决Git合并撤销后的远程同步问题
首先得对应自己的实际情况,分两种核心场景来处理:
场景1:合并后的master还没推送到远程
如果之前你只是在本地完成了合并操作,还没执行过git push origin master把合并后的master推到服务器,那事情特别简单——完全不需要再做任何推送操作。因为远程服务器上的master分支本来就还是合并前的状态,你本地的git reset --merge只是把自己的副本回退到和远程一致的版本而已,直接继续开发就行。
场景2:合并后的master已经推送到远程了
这时候情况要复杂一些,因为远程服务器上已经存在那个你想撤销的合并提交了。你本地用git reset --merge回退后,本地的master分支提交历史已经和远程不一致,普通的git push会被Git拒绝(它默认会阻止你覆盖远程的提交历史)。
这时候再细分两种子情况操作:
- 个人仓库/无人拉取过该合并版本:可以直接强制推送覆盖远程历史,执行命令:
这个命令会让远程的master分支直接回退到你本地reset后的状态,完成服务器端的合并撤销。git push --force origin master - 多人协作仓库/已有同事拉取过该合并版本:强制推送会给团队其他人带来麻烦——他们本地的master分支会和远程产生冲突,甚至丢失未同步的修改。这时候更稳妥的处理方式是:
- 先和团队成员沟通,告知大家你要撤销这次合并,让大家暂时不要基于那个合并版本开发;
- 执行上面的强制推送命令;
- 让同事们先执行
git fetch origin拉取远程最新状态,再用git reset --hard origin/master把本地master同步到远程的最新版本。
额外提醒
你选择用git reset --merge是个很稳妥的决定,它会保留你本地未提交的修改,不像git reset --hard会直接清空未提交的变更。不过如果是多人协作的公共分支,除非万不得已,其实更推荐用git revert生成一个新的撤销提交(而非修改历史),这样不会影响其他协作的人——不过既然你已经用了reset,按上面的步骤处理就没问题。
内容的提问来源于stack exchange,提问作者LJZ




