You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何撤销已推送到远程的Git多笔误提交(含合并提交)?

解决方法

针对你遇到的问题,这里提供两种可行方案,兼顾“撤销不需要的feature提交”和“保留bug修复代码”的需求,同时适配你对Visual Studio操作的习惯:

方案一:通过revert撤销合并提交(不修改历史记录,适合团队协作场景)

你之前遇到的-m参数问题,本质是合并提交有两个父分支,Git需要你指定撤销后回到哪一个分支的状态:

  • -m 1代表回到「执行合并操作的分支(当时的develop)在合并前」的状态,也就是撤销所有被合并进来的feature变更
  • -m 2则是回到被合并的feature分支状态,这不是我们需要的

命令行操作步骤:

  1. 找到那个误将多个feature合并到develop的合并提交ID(在Git历史里能看到它是一个带有两个父节点的提交)
  2. 切换到master分支后执行:
    git revert -m 1 <合并提交ID> --no-edit
    
  3. 如果出现代码冲突,手动解决冲突后执行git add .,再执行git commit --no-edit完成撤销
  4. 推送到远程仓库:git push origin master

Visual Studio操作步骤:

  1. 打开Git历史面板,找到那个误合并的提交(合并提交会显示两个父分支)
  2. 右键点击该提交,选择「Revert」
  3. 在弹出的对话框中选择「父分支1」(对应命令行的-m 1),确认后VS会自动生成撤销提交
  4. 若出现冲突,解决后在「Git更改」面板提交变更,再推送到远程

后续需要恢复这些feature提交时,只需再revert这次的撤销提交即可。

方案二:重置master并重新应用bug修复(修改历史记录,需团队配合)

这个方案会让master分支回到合并develop之前的状态,再单独把bug修复的代码摘出来重新应用,历史记录更干净,但需要通知团队成员同步远程分支,避免冲突。

命令行操作步骤:

  1. 找到master在合并develop之前的那个提交ID(记为old_master_commit)
  2. 基于该提交创建临时分支:
    git checkout -b temp_fix <old_master_commit>
    
  3. 找到bug修复的所有提交ID(比如你在bugfix分支上的提交),用cherry-pick把这些提交应用到临时分支:
    # 单个提交
    git cherry-pick <bug_fix_commit_id>
    # 多个连续提交
    git cherry-pick <第一个修复提交ID>..<最后一个修复提交ID>
    
  4. 解决冲突后提交变更,切换回master分支:
    git checkout master
    git reset --hard temp_fix
    
  5. 强制推送到远程仓库:
    git push -f origin master
    

Visual Studio操作步骤:

  1. 在Git历史里找到master合并develop之前的提交,右键选择「Checkout」,再点击「创建新分支」命名为temp_fix
  2. 找到bug修复的提交,右键选择「Cherry-pick」,批量选择所有修复提交后确认
  3. 解决冲突后提交变更,切换回master分支
  4. 右键点击temp_fix分支,选择「Reset master to」→「Hard」
  5. 推送时VS会提示需要强制推送,确认即可

⚠️ 注意:使用这个方案后,团队其他成员需要执行git fetch origin && git reset --hard origin/master同步本地master分支,避免本地历史与远程冲突。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:51:19