如何撤销Git分支合并操作?含已推送到远程仓库的场景解决方案
Hey there! 咱们一步步来解决你的两个Git撤销合并的问题——这些都是很常见的场景,我会给你讲得明明白白的。
问题1:将分支合并到master后,如何撤销这次合并操作?
具体操作要看你有没有把合并后的master推送到远程仓库:
场景1:还没推送到远程仓库
如果还没执行git push,有两个简单的办法:
- 刚合并完还没做其他操作?直接用
git merge --abort:这个命令会立刻撤销合并,把master分支恢复到合并前的状态,省心又快捷。 - 合并后又做了其他提交?重置到合并前的状态:
- 先运行
git log --oneline找到合并前master最后一个提交的哈希值。 - 然后执行硬重置:
git reset --hard <合并前提交的哈希>
注意:
--hard参数会丢弃合并后所有未提交的本地修改,如果你有未保存的工作,一定要先备份! - 先运行
场景2:已经推送到远程仓库
如果已经把合并后的master推到了远程,这时候需要改写远程的提交历史(操作前一定要和团队成员沟通好!):
- 先把本地master重置到合并前的状态:
git reset --hard <合并前提交的哈希> - 用安全强制推送到远程:
git push origin master --force-with-lease为什么用
--force-with-lease而不是普通的--force?它会先检查远程分支有没有你不知道的新提交,能避免不小心覆盖别人的工作,更安全。 - **重点:通知你的团队!**所有在master分支上工作的成员都需要重置他们的本地分支来同步远程的新状态。
问题2:已推送master到origin/master,要取消localdevelopment的合并,仅保留蓝色提交
根据你的描述,你需要把master彻底恢复到那个蓝色圆点对应的提交状态(也就是合并localdevelopment之前的状态),步骤如下:
- 定位蓝色提交的哈希值:运行
git log --oneline查看提交历史,找到蓝色圆点对应的短哈希(比如a1b2c3)。如果这个提交是合并记录的父节点,也可以用合并记录的哈希加上^来定位(比如合并记录哈希是d4e5f6,就用d4e5f6^)。 - 本地重置到目标提交:执行命令
git reset --hard <蓝色提交的哈希>,这会让本地master完全回到蓝色提交的状态,合并进来的所有localdevelopment提交都会被移除。 - 安全强制推送远程:用
git push origin master --force-with-lease推送到远程仓库。这个命令比直接--force更安全,防止误覆盖他人的修改。 - 同步团队成员的本地分支:一定要通知所有团队成员,因为你改写了远程master的提交历史,他们需要做以下操作来同步:
- 先备份自己的未提交工作(如果有的话)
- 执行
git fetch origin拉取最新的远程状态 - 重置本地master分支:
git reset --hard origin/master
小提醒:如果远程仓库设置了分支保护(比如GitHub的保护分支功能),你需要先获取强制推送的权限或者暂时关闭保护才能执行上述操作。
内容的提问来源于stack exchange,提问作者Prashant Joshi




