git revert 和 git reset --soft 都是用来“撤销”提交的命令,但它们的作用机制、影响范围和适用场景完全不同。
✅ 一句话区别
| 命令 | 是否改变历史 | 是否生成新提交 | 适用场景 |
|---|---|---|---|
git revert | ❌ 不改变历史 | ✅ 生成一个新提交(反向提交) | 公共分支,安全撤销 |
git reset --soft | ✅ 改变历史 | ❌ 不生成新提交,只是移动 HEAD | 私有分支,彻底回退 |
🔍 详细对比
1. git revert <commit>
- 原理:创建一个新的提交,这个提交的内容是目标提交的“反向操作”。
- 效果:历史保留,只是“抵消”了某次提交的改动。
- 示例:
git revert abc123会生成一个新的提交,内容是撤销 abc123 的改动。
- 适用场景:
- 已经推送到远端的分支(如
main)。 - 多人协作,避免重写历史。
- 已经推送到远端的分支(如
2. git reset --soft <commit>
- 原理:把 HEAD 指针 移动到指定提交,保留工作区和暂存区的改动。
- 效果:看起来像是“回退”了,但改动还在暂存区,可以重新提交。
- 示例:
git reset --soft abc123之后的提交历史看起来像是 abc123 之后的提交都“消失”了。
- 适用场景:
- 本地分支,还没推送(或确定可以强推)。
- 想重新整理提交历史(如拆分、合并提交)。
🎯 举个例子
假设提交历史如下:
A -> B -> C -> D (HEAD)
- 用
git revert C:A -> B -> C -> D -> C' (C' 是撤销 C 的新提交) - 用
git reset --soft B:A -> B (HEAD) (C 和 D 从历史上“消失”,但改动还在暂存区)
✅ 总结口诀
- revert = “安全撤销”,适合公共分支。
- reset —soft = “回到过去重新来过”,适合本地整理提交。
❗注意
- 如果你用了
reset --soft回退了已经推送的提交,必须强推(git push --force),这会影响他人,慎用。 - 在 Gerrit 或 GitHub PR 流程中,reset 后强推会导致 Review 页面混乱,建议用
revert或commit --amend替代。
更新: 2025-08-08 09:55:38
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/dxfggmgyvqzapdcp