如何撤销已推送到远程的Git多笔误提交(含合并提交)?
解决方法
针对你遇到的问题,这里提供两种可行方案,兼顾“撤销不需要的feature提交”和“保留bug修复代码”的需求,同时适配你对Visual Studio操作的习惯:
方案一:通过revert撤销合并提交(不修改历史记录,适合团队协作场景)
你之前遇到的-m参数问题,本质是合并提交有两个父分支,Git需要你指定撤销后回到哪一个分支的状态:
-m 1代表回到「执行合并操作的分支(当时的develop)在合并前」的状态,也就是撤销所有被合并进来的feature变更-m 2则是回到被合并的feature分支状态,这不是我们需要的
命令行操作步骤:
- 找到那个误将多个feature合并到develop的合并提交ID(在Git历史里能看到它是一个带有两个父节点的提交)
- 切换到master分支后执行:
git revert -m 1 <合并提交ID> --no-edit - 如果出现代码冲突,手动解决冲突后执行
git add .,再执行git commit --no-edit完成撤销 - 推送到远程仓库:
git push origin master
Visual Studio操作步骤:
- 打开Git历史面板,找到那个误合并的提交(合并提交会显示两个父分支)
- 右键点击该提交,选择「Revert」
- 在弹出的对话框中选择「父分支1」(对应命令行的
-m 1),确认后VS会自动生成撤销提交 - 若出现冲突,解决后在「Git更改」面板提交变更,再推送到远程
后续需要恢复这些feature提交时,只需再revert这次的撤销提交即可。
方案二:重置master并重新应用bug修复(修改历史记录,需团队配合)
这个方案会让master分支回到合并develop之前的状态,再单独把bug修复的代码摘出来重新应用,历史记录更干净,但需要通知团队成员同步远程分支,避免冲突。
命令行操作步骤:
- 找到master在合并develop之前的那个提交ID(记为
old_master_commit) - 基于该提交创建临时分支:
git checkout -b temp_fix <old_master_commit> - 找到bug修复的所有提交ID(比如你在bugfix分支上的提交),用cherry-pick把这些提交应用到临时分支:
# 单个提交 git cherry-pick <bug_fix_commit_id> # 多个连续提交 git cherry-pick <第一个修复提交ID>..<最后一个修复提交ID> - 解决冲突后提交变更,切换回master分支:
git checkout master git reset --hard temp_fix - 强制推送到远程仓库:
git push -f origin master
Visual Studio操作步骤:
- 在Git历史里找到master合并develop之前的提交,右键选择「Checkout」,再点击「创建新分支」命名为
temp_fix - 找到bug修复的提交,右键选择「Cherry-pick」,批量选择所有修复提交后确认
- 解决冲突后提交变更,切换回master分支
- 右键点击
temp_fix分支,选择「Reset master to」→「Hard」 - 推送时VS会提示需要强制推送,确认即可
⚠️ 注意:使用这个方案后,团队其他成员需要执行git fetch origin && git reset --hard origin/master同步本地master分支,避免本地历史与远程冲突。
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

