git revert 撤销提交
git revert 通过创建新提交来撤销指定提交的变更,保持历史完整。
什么是 git revert
revert 创建一个新提交,内容是撤销指定提交的变更:
- 不删除原提交
- 不改变历史
- 创建反向提交
- 安全可追溯
revert vs reset
| 特性 | revert | reset |
|---|---|---|
| 历史改变 | 不改变 | 改变历史 |
| 新提交 | 创建 | 不创建 |
| 安全性 | 安全 | 可能丢失 |
| 已推送 | 可以使用 | 不推荐 |
| 适用场景 | 公开历史 | 本地历史 |
基本用法
Bash
# 撤销最近一次提交
git revert HEAD
# 撤销指定提交
git revert <commit-hash>
# 撤销多个提交
git revert <commit1> <commit2>
# 撤销提交范围
git revert <start>..<end>
revert 示例
Bash
# 撤销最近提交
$ git revert HEAD
[main d4e5f6g] Revert "添加新功能"
1 file changed, 5 deletions(-)
# 查看历史
$ git log --oneline
d4e5f6g Revert "添加新功能" # 新的撤销提交
a1b2c3d 添加新功能 # 原提交仍存在
b2c3d4e 修复bug
revert 流程
Bash
原提交:
commit A: 添加 content = "Hello"
revert 后:
commit A: 添加 content = "Hello" (仍存在)
commit B: 删除 content = "Hello" (反向提交)
结果:content 被移除,但历史完整
常用选项
| 选项 | 说明 |
|---|---|
| -n, --no-commit | 撤销但不自动提交 |
| -m, --mainline | 指定撤销合并提交的父提交 |
| -e, --edit | 编辑撤销提交信息 |
撤销合并提交
Bash
# 合并提交有两个父提交,需指定撤销哪个
git revert -m 1 <merge-commit>
# -m 1: 撤销相对于第一个父提交的变更
# -m 2: 撤销相对于第二个父提交的变更
撤销但不提交
Bash
# 撤销变更但不自动提交
git revert -n HEAD
# 查看变更
git status
# 手动提交
git commit -m "手动提交撤销"
处理 revert 冲突
Bash
# revert 时可能产生冲突
$ git revert a1b2c3d
CONFLICT (content): conflict in main.go
# 解决冲突
# 1. 编辑冲突文件
# 2. git add <file>
# 3. git revert --continue
# 或放弃撤销
git revert --abort
revert 使用场景
撤销已推送的错误提交
Bash
# 推送后发现 bug
git revert <commit>
git push
# 安全撤销,不影响他人
临时撤销测试
Bash
# 撤销某提交进行测试
git revert -n <commit>
# 测试验证后决定是否提交
逐步撤销多个提交
Bash
# 撤销最近 3 个提交
git revert HEAD~3..HEAD
# 按顺序撤销,保持历史清晰
revert 提交信息
text
# 默认提交信息
Revert "原提交信息"
This reverts commit <hash>.
# 自定义提交信息
git revert -e HEAD
# 编辑器打开,修改提交信息
revert 注意事项
text
revert 后的提交可能被再次 revert:
A → B → C(revert B)→ D(revert C)
此时 B 的变更会重新出现
建议:
- revert 次数不宜过多
- 理解 revert 的链式影响
对已推送的提交,使用 revert 而非 reset,保持历史完整。
要点总结
- revert 创建反向提交,不删除原提交
- 安全撤销,不改变历史
- 已推送的提交只能用 revert
- 合并提交需用 -m 指定父提交
- 冲突时解决后用 --continue 继续
📝 发现内容有误?点击此处直接编辑