git revert和 reset的区别
明白,这个是 Git 操作里非常核心的概念,很多人一开始容易混淆。我给你整理一个清晰对比表,再讲具体应用场景。
🧠 一、核心区别
| 特性 | git revert |
git reset |
|---|---|---|
| 功能 | 创建一个新的 commit来撤销之前的 commit | 直接移动 HEAD,改变分支指向 |
| 历史是否改写 | ❌ 不改写历史,保留所有 commit | ✅ 改写历史(危险) |
| 适用场景 | 已经 push 的 commit,需要撤销但保留历史 | 本地回退、重置分支或彻底覆盖远程 |
| 远程安全性 | 安全,可以直接 push | 不安全,push 需要 -f 或 --force-with-lease |
| 对工作目录影响 | 可以选择保留或修改(默认保留工作区以生成 revert commit) | 可以用 --soft/--mixed/--hard 决定保留或丢弃工作区 |
🧠 二、用法对比
1️⃣ git revert — 创建“反向 commit”
git revert <commit_id>
- 会生成一个新的 commit
- 内容是撤销
<commit_id>的修改 - 历史不会改变
- 适合已 push 的 commit 或团队协作
特殊情况:merge commit
git revert -m 1 <merge_commit_id>
-m 1指定主分支- 必须,否则 Git 不知道要保留哪边的改动
2️⃣ git reset — 移动 HEAD / 改写历史
# 回退到某 commit,但保留工作目录
git reset --soft <commit_id>
# 回退到某 commit,保留修改,但 unstaged
git reset --mixed <commit_id> # 默认
# 回退到某 commit,工作目录和 staging 区全部重置
git reset --hard <commit_id>
- 改变分支历史
- 如果 push,需要
-f - 适合本地回退、撤销大量提交、回到历史版本
🧠 三、举例说明
假设历史:
A → B → C → D (HEAD)
1️⃣ 使用 revert C
git revert C
结果:
A → B → C → D → C' (HEAD)
- 新生成一个 commit C',撤销 C
- 历史完整,不会破坏其他人的操作
2️⃣ 使用 reset --hard B
git reset --hard B
结果:
A → B (HEAD)
- C、D 被删除(本地不可见)
- 如果 push,需要
git push -f - 危险,但可以彻底回到历史版本
🧠 四、总结
| 场景 | 选择 |
|---|---|
| 已经 push,想撤销某次 commit,但保留历史 | git revert |
| 本地回退,或者彻底覆盖远程 | git reset --hard |
| 想保留工作区修改 | reset --soft / revert |

浙公网安备 33010602011771号