很多 Git 教程都会告诉你:git reset 很危险,慎用。
但真正让我困惑的不是'危险',而是:它到底在 reset 什么?
直到一次误 push 的经历,我才第一次把 git reset 用明白。
一、困惑从哪里开始的
如果你在 Git 里搜索 reset,大概率会看到三种写法:
git reset --soft
git reset --mixed
git reset --hard
- 以及一堆警告:
- ⚠️ 不要在公共分支用
- ⚠️ 小心丢代码
- ⚠️ 会重写历史
- 结果就是:大家记住了'危险',却没真正理解它的行为。
二、理解 reset 的关键:三层世界
真正理解 git reset,必须先接受 Git 的一个事实:
git reset的本质,其实只有一句话:移动分支指针(HEAD),并决定是否同步暂存区和工作区。- 一切复杂性,都是从这里展开的。
Git 并不是只有'代码'和'提交'两层,而是三个世界:
Commit History ← 提交历史(HEAD / branch)
Staging Area ← 暂存区(git add)
Working Tree ← 工作区(你的代码文件)
三、reset 的三种模式,其实是三种'后悔程度'
3.1 git reset --soft:我只是想重来一次提交
git reset --soft HEAD~1
- 效果:
- commit 消失
- 代码还在
- 代码仍然是已 add 状态
- 适合场景:
- 提交信息写错了
- 想把多个 commit squash 成一个
发生的事情:
Commit History ← 回退
Staging Area ← 保留
Working Tree ← 保留
3.2 git reset --mixed:我想重新组织这次提交
git reset HEAD~1
(这是默认模式)
- 效果:
- commit 消失
- 代码还在
- 需要重新
git add
- 适合场景:
- 拆分提交
- 挑选性地 add 文件
发生的事情:
Commit History ← 回退
Staging Area ← 清空
Working Tree ← 保留

