Git 中文手册

git revert 撤销已推送的提交(安全不改写历史)

2026-09-06 约 3 分钟阅读

提交已经 push 到远程、还和同事共享了,想撤销怎么办?git revert 通过新增一个"反向提交"来抵消改动,不改写历史、安全协作。本文讲清用法与场景。

场景:一个提交已经 git push 上去了,团队其他人可能已经拉取。这时你想"撤掉它",如果用 git reset 改写历史,会让协作者 pull 时一团糟。正确做法是 git revert

revert 的核心思想

revert 不是"删掉那个提交",而是新增一个内容恰好相反的提交来抵消它:

历史:
A - B - C(要撤销 C)
revert 后:
A - B - C - C'(内容与 C 相反,等于撤销了 C)

历史永远是往前推进的,别人 pull 安全无冲突风险。

基本用法

# 撤销最近一次提交
git revert HEAD

# 撤销指定的某个提交
git revert 提交哈希

# 撤销后推送到远程
git push

执行时可能弹出编辑器让你填 revert 的提交信息,默认即可,保存退出。

撤销多个提交

# 撤销从 旧哈希 到 HEAD 之间的所有提交
git revert 旧提交哈希..HEAD

# 只撤销指定的两个(不连续)不产生新提交,先处理
git revert -n 提交A 提交B
# 手动处理后一起提交
git commit

遇冲突怎么办

如果后续有提交改了同一处,revert 可能冲突:

# 提示冲突后,打开文件手动解决
git add 冲突文件
git revert --continue     # 完成 revert
# 或想放弃这次 revert
git revert --abort

revert vs reset 决策

git revertgit reset
改写历史❌ 不(新增提交)✅ 移动指针
适合场景已推送/多人共享未推送/本地
协作安全性安全危险(改历史)
历史记录保留原提交+revert原提交被隐藏

经验法则:只要提交已 push 或不确定是否被人拉过,就用 revert,别用 reset。

完整示例

# 团队发现某次改动引入了 bug
git log --oneline
# abc1234 (HEAD) 修复样式
# def5678 添加新功能 ← 这个有问题
# ...

# 撤销 def5678(不影响其他提交)
git revert def5678
# 会提示可能冲突,处理
git push

一句话速记

已推送的提交要撤销用 git revert 哈希,它新增反向提交、不改历史、协作安全。

?

常见问题 FAQ

为什么已推送的提交要用 revert 而不是 reset?
reset 会移动分支指针改写历史,已推送后会导致别人 pull 时冲突、历史被破坏;revert 是新增一个反向提交来抵消改动,历史始终向前、别人 pull 也安全。
revert 会生成新的提交吗?
会。git revert 提交哈希 会创建一个新的提交,其内容正好"反向"抵消目标提交的改动。所以历史会多一条 revert 记录。
想撤销多个连续的提交怎么办?
用 git revert 旧提交哈希..新提交哈希 一次生成多个反向提交,或用 -n 暂不提交逐个处理。注意范围顺序是从旧到新。
revert 一个很早就被后续提交依赖的提交会不会冲突?
可能冲突。因为后续提交可能改动了同一处,revert 时如果冲突需手动解决,再 git revert --continue 继续。冲突不代表不能撤,只是需要处理。