Git 中文手册

git reset 三种模式 --soft / mixed / hard 的区别详解

2026-09-06 约 3 分钟阅读

git reset 的 --soft、--mixed、--hard 到底差在哪?本文用一个真实例子讲透三种模式对"提交历史、暂存区、工作区"的影响,帮你选对最安全的那一种。

场景:commit 提交错了、或想回到某个历史版本。git reset 是最强大的回退工具,但三个模式 --soft / --mixed / --hard 让很多人混淆。用一个例子一次讲清。

三个模式到底动了什么

Git 有三个"层面":提交历史(HEAD)暂存区(index)工作区(文件)。三种模式对它们的影响不同:

模式提交历史暂存区工作区安全性
--soft回退保留保留
--mixed(默认)回退退回工作区保留
--hard回退清空丢弃低(丢文件)

一句话:soft 最温柔、mixed 适中、hard 最激进(会删文件)。

用例子理解

假设你提交了 3 次:C3 <- C2 <- C1,当前在 C3。

--soft:提交没了,但改动都在暂存区

git reset --soft HEAD~1
  • HEAD 回到 C2,C3 的提交记录没了
  • 但 C3 的所有改动还在暂存区(绿色状态)
  • 适合:提交得太早/太碎,想重新组织后再 commit

--mixed(默认):改动退回工作区

git reset HEAD~1       # 等价 git reset --mixed HEAD~1
  • HEAD 回 C2,暂存区被清
  • C3 的改动退回工作区(红色未暂存状态)
  • 适合:提交后发现不该提交,想改回普通改动继续编辑
  • 最常用、最安全

--hard:改动全部丢弃

git reset --hard HEAD~1
  • HEAD 回 C2,暂存区和工作区全部重置
  • C3 的改动彻底消失(未提交的无法找回)
  • 适合:确定要彻底放弃某次提交及工作区杂乱改动
  • ⚠️ 最危险,用前务必确认

回退到任意提交

不只是回退一步,可指定任意提交哈希:

git log --oneline          # 找到目标哈希
git reset --hard abc1234   # 回到 abc1234 那个状态
git reset abc1234          # 回到该提交,改动退回工作区

什么时候用哪个(决策速查)

想达到的目的
只想改上次提交信息/合并提交--amend
提交了但想退回暂存状态再改--soft
想反悔暂存,改动留工作区继续编辑--mixed(默认)
想彻底丢弃提交+工作区改动--hard

安全提示

  • 已 push 到远程、多人共用的分支,不要用 reset 改历史,改用 git revert
  • hard 前备份git branch backupgit stash,出问题可回滚。
  • 拿不准用 --mixed,至少文件不丢。

一句话速记

soft 保暂存、mixed 退工作区、hard 全清空;默认 mixed 最安全,hard 慎用。

?

常见问题 FAQ

git reset --hard 会丢代码吗?能找回吗?
会丢弃工作区和暂存区所有未提交改动,无法通过 reflog 完整找回未提交的部分。提交过的东西可用 reflog 找回,但未提交的新改动会永久丢失,务必慎用。
为什么推荐默认使用不带参数的 git reset?
不带参数默认是 --mixed,只把暂存区的改动退回工作区,你的文件内容一个字节都不会丢,最安全,适合"想反悔暂存"的场景。
git reset 和 git checkout -- 文件 有什么区别?
reset 影响整个仓库的 HEAD/暂存/工作区状态;checkout -- 文件 只针对某个文件,用提交内容覆盖工作区。定位不同,reset 常回退提交,checkout 常恢复单文件。
reset 到某个提交后,之后的提交会消失吗?
不会立即消失,它们还在 reflog 里可找回。reset 只是让当前分支指针回到旧提交,那之后的提交变成了"孤儿"但仍存在,可用 reflog 恢复。