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 找回原提交