首页/开发/Git 与协作速查/git reset --soft 只移动分支指针
Git 基础与命令88 条

git reset --soft 只移动分支指针

撤销提交但保留暂存区与工作区:改动原样停留在暂存状态,适合把多条提交合并为一条或重写提交内容。

Git 与协作速查开发更新于 2026-10-13

reset --soft 是什么

git reset --soft 只移动分支指针(或 HEAD)到指定提交,暂存区与工作区原样保留。结果是:被「撤销」的提交内容并没有消失,而是原封不动地待在暂存区里,随时可以重新提交。它最典型的价值是把最近几条提交合并成一条,或在提交信息写错后回到提交前状态重写。它不动文件,因此比 --hard 安全得多,但仍会改写历史。

基本信息

影响范围只移动 HEAD 与分支指针
暂存区保留,改动仍是已暂存
工作区不受影响
典型场景合并提交、重新组织提交内容
平台任意 Git 客户端

典型使用场景

  • 把最近几条提交合并成一条,信息重写后更清晰
  • 提交后发现说错话或漏文件,回退一步重新组织
  • 暂存内容算错,需要退回提交前状态重新挑选
  • 把一条提交拆成多条,先退回去再用逐块暂存
  • 撤销本地提交但不想丢掉任何代码
  • 改写历史前把改动都保留在暂存区,避免丢内容

常用示例

常用示例
git reset --soft HEAD~1        # 退回上一条提交之前
git status                     # 改动仍在暂存区
git commit -m 'feat: 合并两条提交'
# 连续撤销三条提交而不动内容
git reset --soft HEAD~3
git status

三种重置模式对比

模式分支指针暂存区工作区
--soft移动保留保留
--mixed(默认)移动重置保留
--hard移动重置重置
撤销后直接 commit 可把多条提交并为一条;提交信息按新内容重写,别沿用旧标题。
已推送的提交上执行这种改写,之后推送需要强推并通知协作者,共享分支上尤其要谨慎。

回退后怎么继续

  • git status 确认改动都在暂存区
  • git diff --cached 复核将被提交的内容规模
  • 重新写提交信息,说明新提交覆盖了哪些内容
  • 拆分需求时改用 git reset 后逐块 add -p 暂存
  • 确认无误再提交,必要时用 reflog 找回原提交

易错点

  • 撤销的是提交记录而不是文件改动,误以为改动被删是最常见的误解,实际内容都留在暂存区
  • 在已推送的提交上改写历史后需要强推,未通知协作者会造成历史冲突
  • 把它与 --hard 记混会误删工作区内容,敲命令前先确认自己要保留改动
  • 连续撤销多条提交后若不重新组织内容,容易得到一条范围过大的提交,评审难度反而上升
  • 改写后忘记更新提交信息,主干上会留下与实际内容不符的标题

数据来源与参考

  • Git 官方文档:git-reset(--soft)
  • Pro Git 2nd Edition · 7.7 重置揭密
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌