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