【后悔药】2. Git Reset 到底怎么用?Soft、Mixed、Hard 一次讲清

预计阅读时间:5 分钟

刚 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 不是“撤回提交”这么简单,它会让你的工作区回到指定版本。

如果你还没备份、没确认、没理解当前状态,不建议随手用它。

一张图看懂三者区别

Git reset 三种模式对比图

可以简单记成:

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 点就够了:

  1. commit 之后还没 push,是最容易补救的阶段。
  2. soft 保留代码和 add,mixed 保留代码但取消 add。
  3. hard 会连代码改动一起回退,不要随手用。

本文由 楸木 原创,转载请注明出处。

相关推荐

发现更多