刚 commit 完,突然发现代码还没整理好。
变量名有点乱,测试也没补,甚至还有几行临时调试代码。
这时候你可能想做一件事:
把刚才那次 commit 撤回来,但代码先留着。
如果这次提交还没有 push 到远程仓库,恭喜你,这是 Git 最好补救的阶段。
这篇我们只讲一个核心问题:
git reset 到底怎么用,
尤其是 --soft、--mixed、--hard 三种模式有什么区别。
Commit 了但还没 Push,先别慌
本地 commit 出错,其实并不可怕。
因为代码还没有进入公共历史,通常不会影响别人。你可以根据自己的需要,把最近一次 commit 撤回来,然后重新整理。
最常用的是:
git reset --soft HEAD~1
这行命令的意思是:
撤回最近一次 commit,但保留代码和 add 状态。
执行后,你会发现:
commit 消失了
代码还在
文件仍然处于已暂存状态
也就是说,你只是取消了“提交”这个动作。
这很适合刚提交完,突然想重新写 commit message,或者想再补一点代码后重新提交。
soft:最温柔的撤回
--soft 是最适合新手理解的模式。
git reset --soft HEAD~1
它会撤回最近一次 commit,但不会动你的代码。
可以把它理解成:
我不想要刚才那次提交记录了,但文件内容都保留。
而且它还会保留 git add 之后的状态。
所以你可以直接重新提交:
git commit -m "更合适的提交说明"
如果只是想撤回 commit、重新组织提交,--soft 通常是最安全的选择。
mixed:撤回 commit,也撤回 add
如果你不想保留暂存区状态,可以用 --mixed。
git reset --mixed HEAD~1
或者直接写:
git reset HEAD~1
因为 mixed 是 reset 的默认模式。
它的效果是:
- commit 被撤回
git add状态被取消- 代码内容仍然保留
也就是说,文件会回到“已修改但未暂存”的状态。
你需要重新选择要提交哪些文件:
git add 文件名
git commit -m "新的提交说明"
如果你刚才 add 了太多文件,想重新挑一遍,mixed 就很适合。
hard:最危险的模式
真正需要小心的是这个:
git reset --hard HEAD~1
它的效果非常直接:
- commit 撤回
- add 状态清空
- 工作区代码也回退
换句话说:
不只是提交没了,代码改动也没了。
这就是很多人执行完 reset --hard 后,突然后背一凉的原因。
--hard 不是“撤回提交”这么简单,它会让你的工作区回到指定版本。
如果你还没备份、没确认、没理解当前状态,不建议随手用它。
一张图看懂三者区别

可以简单记成:
soft = 只撤回 commit
mixed = 撤回 commit + 取消 add
hard = 撤回 commit + 取消 add + 回退代码
越往后,影响越大。
新手应该怎么选?
如果你只是想“刚才那次 commit 不算了”,优先用:
git reset --soft HEAD~1
如果你想重新选择哪些文件进入 commit,用:
git reset HEAD~1
如果你真的想丢弃所有改动,并且非常确定这些代码不要了,才考虑:
git reset --hard HEAD~1
但在执行 --hard 前,至少先看一眼:
git status
确认当前有哪些改动。
总结
这篇记住 3 点就够了:
commit之后还没 push,是最容易补救的阶段。soft保留代码和 add,mixed保留代码但取消 add。hard会连代码改动一起回退,不要随手用。
本文由 楸木 原创,转载请注明出处。