首页/开发/Git 与协作速查/revert 合并提交(-m)
合并变基与冲突71 条

revert 合并提交(-m)

撤销合并提交必须指定保留哪个父提交:git revert -m 1 <合并提交> 表示「回到主干侧父提交的样子」,之后再要合并该分支需先撤销这次 revert。

Git 与协作速查开发更新于 2026-10-13

撤销合并提交是什么

撤销一个合并提交必须指定保留哪个父提交:git revert -m 1 <合并提交> 表示以主干侧的父提交为基准生成一条反向提交。它在历史末端新增记录、不修改既有历史,是共享分支上撤销合并的安全做法。

基本信息

语法git revert -m <父编号> <合并提交>
父编号含义1 表示合并时的当前分支侧,2 表示被合并进来的分支侧
先确认顺序git show --no-patch --pretty=%P <合并提交> 查看两个父提交
后续影响被撤销的分支再次合并时,Git 认为这些提交已经处理过
替代方案尚未推送时可改用 git reset --hard,但会改写历史

典型使用场景

  • 上线后发现刚合入的特性引发故障,需要快速回退
  • 误把不该发布的分支合入主干,需要撤销
  • 评审流程出错导致不合规的改动进入主干
  • 需要保留历史审计线索,不能改写已有提交
  • 故障处理中先恢复可用状态,之后再逐步排查根因

常用示例

常用示例
git show --no-patch --pretty=%P <merge_sha>   # 查看两个父提交的顺序
git revert -m 1 <merge_sha>                   # 保留主干侧父提交的视角
git log --oneline -3                          # 确认新增了反向提交
git push origin main                          # 推送撤销结果
git revert <revert_sha>                       # 需要重新合并该分支时,先撤销这次撤销
git merge <原分支>                             # 再执行一次合并即可带回内容

父编号与结果对照

父编号保留哪一侧典型场景
-m 1合并时的当前分支(通常是主干)撤销刚合入主干的特性
-m 2被合并进来的分支一侧撤销方向相反的合并
未指定命令报错并要求给出 -m任何一次合并撤销
撤销合并不会让历史消失:原来的合并提交仍在,只是新增了一条把它的改动反做回去的提交,审计时可以看到完整来龙去脉。
被撤销的分支之后重新合并时,Git 认为这些提交已经处理过而不会带回内容;必须先把这次撤销再撤销,然后重新合并。

易错点

  • 漏掉「撤销的撤销」这一步,表现为重新合并分支后代码没有回来,排查这类问题非常费时
  • 父编号方向写错,撤销的是另一侧内容,结果与预期完全相反,务必先用查看父提交确认顺序
  • 对已推送的合并使用 reset --hard,会导致他人历史与远端分叉,共享分支上应优先选择 revert
  • 撤销后没有同步通知团队:其他人继续在原分支上开发,再次合并时需要额外处理冲突

数据来源与参考

  • Git 官方文档:git-revert(-m)
  • Pro Git 2nd Edition · 2.4 撤消操作
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌