首页/开发/Git 与协作速查/git revert 反向提交回退
Git 基础与命令88 条

git revert 反向提交回退

用新提交抵消既有改动:不改写历史,适合已推送内容的安全回退;-n 只应用不提交,-m 用于撤销合并提交。

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

git revert 是什么

git revert 通过生成一条新的反向提交来抵消既有改动:原提交仍然留在历史里,新提交把它的改动撤掉。因为是追加而不是改写,所以它适合处理已经推送、他人可能已经拉取的提交。它与 reset 的分工很清楚:reset 改写历史,revert 追加历史。

撤销合并提交要指明父提交

合并提交有两个父提交,撤销时必须用 -m 指定以哪一侧为准:-m 1 表示保留主干侧内容、撤掉被合入分支带来的改动。选错编号会得到与预期相反的树内容,执行前先用 git show --first-parent 看清两侧差异。

基本信息

适用平台Linux / macOS / Windows(Git 2.x)
语法git revert [选项] <提交>…
特点生成反向提交,历史保留完整痕迹
-n / --no-commit只应用反向改动,不自动提交
-m <父编号>撤销合并提交时指定保留哪一侧
适用场景已推送提交的安全回退

典型使用场景

  • 线上回退:某个改动引发故障,用新提交把它的效果撤掉
  • 保留痕迹:审计要求历史不可改写时,用 revert 而不是 reset
  • 撤销合并:用 -m 指定父提交,退回某次特性合入之前
  • 组合调整:用 -n 先把多条回退攒在一起,再手工合成一条提交
  • 再次引入:把此前撤销掉的改动重新放回代码库

常用示例

常用示例
git revert a1b2c3d              # 生成一条反向提交
git revert -n a1b2c3d           # 只应用改动,不自动提交
git revert HEAD                 # 撤销最近一次提交
git revert -m 1 <合并提交>       # 撤销合并,保留主干侧内容
git revert <旧提交>..<新提交>    # 批量回退一个区间
git log --oneline -3            # 核对是否生成了反向提交

revert 与 reset 的分工

维度git revertgit reset
对历史的影响追加新提交移动分支指针
已推送是否安全安全需要强推并改写历史
是否保留痕迹原提交与反向提交都在原提交可能变成悬空
典型用途线上回退、审计合规整理未推送的本地历史
处理合并提交用 -m 指定父提交直接移动指针位置
回退合并提交时要指明保留哪一侧:-m 1 表示以主干侧父提交(合并目标分支)为准,编号选错会得到与预期相反的树内容。
revert 之后再想重新引入同一改动,需要 revert 那条反向提交,历史会绕一圈。动手前先确认这套改动后面是否还需要。

易错点

  • revert 之后想重新引入同一改动,需要再 revert 那条反向提交,历史会多绕一圈
  • 批量回退区间时按新到旧的顺序处理,逐条都可能要解冲突,先确认范围再执行
  • 撤销合并提交忘记加 -m,命令会直接报错提示需要指定父提交编号
  • 把 revert 用在未推送的本地整理场景,会让历史多出无意义的反向提交,此时 reset 更合适

数据来源与参考

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