git reset --soft仅移动HEAD指针,保留暂存区和工作目录所有更改,适用于修改提交信息、合并多次提交或补充文件,是安全的重置模式。

使用 git reset --soft 可以撤销最近一次(或指定)提交,同时把改动保留在暂存区(staged),代码文件本身也不变。这适合你已经 git commit 但发现提交信息写错、漏加文件,或想把多次小提交合并成一次时使用。
理解 --soft 的作用范围
--soft 只移动 HEAD 指针,不碰暂存区(index),更不修改工作目录(working directory)。也就是说:
- HEAD 回退到上一个提交(比如从
commit C退回到commit B) - 原本被 C 提交的改动,仍完整保留在暂存区(
git status显示为 “Changes to be committed”) - 所有文件内容完全不变,无需重新
git add
常用操作步骤
假设你刚执行了 git commit -m "fix login bug",但想修改提交信息或补充文件:
- 运行
git reset --soft HEAD~1(回退一次提交) - 检查状态:
git status会显示所有改动仍在暂存区 - 若只需改提交信息:直接执行
git commit --amend -m "fix login: handle null token" - 若要补充新改动:先编辑文件 →
git add 文件名→ 再git commit --amend
注意安全边界
--soft 是最安全的 reset 模式,但它只对本地未推送的提交有效:
- 如果已运行
git push,重置后必须强制推送(git push --force-with-lease),且需确保团队成员知晓,避免覆盖他人工作 - 不能用
--soft撤销已合并到主分支的提交(除非协作流程允许重写历史) - 它不适用于“撤销某次提交但保留后续提交”——那需要
git revert或git rebase -i
对比其他 reset 模式
便于你按需选择:
-
--soft:只动 HEAD,暂存区和工作区都不变 -
--mixed(默认):动 HEAD + 清空暂存区(改动变为 “Changes not staged”) -
--hard:动 HEAD + 清空暂存区 + 丢弃工作区改动(慎用!不可逆)


















