git reset 的默认模式是什么
git reset 不带参数时就是 --mixed 模式:把分支指针移回指定提交,同时重置暂存区,但保留工作区文件不动。结果是原本已暂存的改动全部退回「已修改未暂存」状态,内容一点没丢。它常被用来一次性取消全部暂存。
回退提交时它做了什么
执行 git reset HEAD~1 时,分支指针后退一条,上一条提交的内容被放回工作区。历史里少了一条提交,改动却完整保留,之后可以用 git add -p 重新组织成新的提交。这与 --hard 形成鲜明对比:后者会把工作区一起重置,内容直接消失。
基本信息
| 适用平台 | Linux / macOS / Windows(Git 2.x) |
|---|---|
| 语法 | git reset [--mixed] [<提交>] [--] [路径] |
| 影响范围 | HEAD 与暂存区 |
| 工作区 | 保留改动,不覆盖文件内容 |
| 等价写法 | git reset 无参数;git reset --mixed HEAD |
| 路径形式 | git reset -- <路径> 只取消指定文件的暂存 |
典型使用场景
- 取消全部暂存:把暂存区清空,重新挑选要提交的改动
- 回退一条提交:撤销最近一次提交但保留改动,重新组织
- 修正提交范围:混进无关文件时退回来重新暂存
- 拆分提交:把一条大提交退回工作区,再拆成若干条
- 调整分支:把本地分支指针移动到指定的历史位置
常用示例
常用示例
git reset # 取消全部暂存,改动留在工作区
git reset HEAD~1 # 回退一条提交,改动回到工作区
git reset --mixed HEAD~1 # 与上一条等价,显式写法
git reset -- src/app.py # 只取消该文件的暂存
git status --short # 核对改动落在哪一层
git add -p # 重新组织成新的提交三种 reset 模式对比
| 模式 | HEAD | 暂存区 | 工作区 |
|---|---|---|---|
| --soft | 移动 | 保留 | 不动 |
| --mixed(默认) | 移动 | 重置 | 不动 |
| --hard | 移动 | 重置 | 重置 |
回退一条提交后,改动散落在工作区,可以用交互式暂存重新组织成新提交,比在原提交上修修补补更灵活。
reset 的默认模式不会碰工作区文件,但加 --hard 会直接覆盖。两个模式只差一个参数,后果差别很大,执行前看清楚命令。