git revert 不删除任何历史,而是新建一个内容相反的提交来抵消指定提交的改动。正因为不改历史,它是已经 push 给团队之后唯一稳妥的撤销方式。

本文列出 git revert 的常用参数,包括撤销合并提交时必须用的 -m,以及冲突时的续作命令。

ℹ️
关于本系列
本文是《Git 使用教程》按命令拆分的第 14 / 28 篇,全部收录在 Git 栏目。参数表列的是日常高频项,并非穷举;想看某个命令的完整参数,用 git revert -h 看精简列表、git help revert 看完整手册。示例以 Git 2.56.0 为准。

一、命令语法

先看语法骨架,再对照下一节的参数表。<占位> 表示必填值,实际输入时不要带尖括号;[...] 表示可选项,-- 用来分隔选项与路径。

bash语法
git revert [<options>] <commit>...

二、参数逐项详解

下表按用途列出 git revert 的常用参数,每项都注明了「它到底改变了什么」。

参数作用
<commit>...要抵消的一个或多个提交;默认按给定顺序逐个生成反向提交
-n / --no-commit只把反向改动应用到工作区与索引,不自动生成提交,便于攒成一次提交
--no-edit沿用自动生成的 revert 信息,不打开编辑器
-m <n> / --mainline=<n>撤销合并提交时指定保留第几个父提交为主线(通常是 1)
-e / --edit提交前打开编辑器修改信息(默认行为)
-s / --signoff追加 Signed-off-by 行
--continue解决冲突并 add 之后继续完成 revert
--abort放弃整个 revert 序列,回到操作前状态
--skip跳过当前提交,继续处理后面的
--quit退出 revert 序列但保留已经完成的改动与提交
--strategy=<策略>指定合并策略,一般不用手动改

reset 与 revert 怎么选

场景用哪个
提交只在自己本地、还没 pushgit reset,历史保持干净
提交已 push,别人可能拉取过git revert,不改历史
要撤销的是一个合并提交git revert -m 1 <merge-commit>

三、常用示例

撤销一次已公开的提交

bash撤销一次已公开的提交
git log --oneline -5           # 找到要撤的哈希
git revert a1b2c3d
git push origin main

攒成一次提交

bash攒成一次提交
git revert -n a1b2c3d
git revert -n b2c3d4e
git diff --cached --stat
git commit -m "revert: 回退上一批有问题的改动"

撤销合并提交与冲突处理

bash撤销合并提交与冲突处理
git revert -m 1 --no-edit f9e8d7c
# 若出现冲突
git status -s
git add <冲突文件>
git revert --continue
# 或整段放弃
git revert --abort

四、注意事项

⚠️
-m 1 的含义要想清楚
合并提交有多个父提交,revert 必须知道「以哪一边为主线」才能算反向 diff。-m 1 通常指合并时的当前分支。另外,revert 掉一个合并提交后,Git 会认为那段历史已经被抵消,日后想重新合并同一分支需要先 revert 掉这次 revert。
revert 本身也是一次普通提交: 它有哈希、有作者、能 push、也能被再次 revert。所以「回滚上线失败」最稳的姿势就是 git revert + 正常流程推上去,所有人的历史都保持线性。

五、小结

git revert 的参数不多,核心就三条:-n 攒批、-m 处理合并提交、--continue/--abort 处理冲突。它用「多一次提交」换取「历史不被改写」,在协作场景里几乎总是更划算的选择。

本系列共 28 篇,一个命令一篇,完整目录见 Git 栏目。下一篇:git clean 命令参数详解。