带路径的 reset 是什么
git reset 一旦带上路径参数,语义就变了:它只把指定路径从暂存区里移除(或改为指定版本的内容),绝不移动分支指针,也不碰工作区文件。效果等同于 git restore --staged <路径>,是老版本里唯一可用的取消暂存写法。区别记住一点:不带路径的 reset 会移动分支指针,带路径的 reset 只动索引,两者完全是两回事。
基本信息
| 用途 | 按文件取消暂存 |
|---|---|
| 语法 | git reset [<提交>] -- <路径> |
| 关键差别 | 带路径时不移动 HEAD |
| 等价写法 | git restore --staged <路径>(Git 2.23+) |
| 平台 | 任意 Git 客户端 |
典型使用场景
- 一次 git add . 之后发现多加了几个文件,想逐个移出暂存区
- 准备把改动拆成多个提交,先取消整体暂存
- 误把本地配置或密钥加入暂存,提交前移除
- 把目录里的临时文件从索引里剔除
- 提交前复查暂存内容,发现多余项立即清掉
- 用 -- 分隔以区分同名分支与文件
常用示例
常用示例
git reset HEAD -- app.py # 把 app.py 移出暂存区
git reset -- src/legacy/ # 目录整体取消暂存
git restore --staged app.py # 等价的新式写法
git status --short # 复核结果reset 与 restore 对照
| 命令 | 作用范围 |
|---|---|
| reset <路径> | 只改索引,不动工作区 |
| reset <提交> | 移动分支指针,可能改动工作区 |
| restore --staged | 新式写法,只改索引 |
| restore <路径> | 只改工作区,不动索引 |
不带路径的 reset 会移动分支指针;带路径的 reset 只动索引,两种形态语义不同,敲命令前先确认自己要哪一种。
路径前加 -- 能避免路径名与分支名混淆,仓库里存在同名文件或分支时这一步是必要的。
带路径的 reset 不影响工作区内容,所以它很适合修正「暂存错了文件」这类失误;真正想丢弃文件改动的场景应该用 git restore 或 checkout -- 路径,两件事别混一起想。
取消暂存后的收尾
- git status --short 复核哪些文件回到了未暂存状态
- 新文件取消暂存后会变回未跟踪,需要时重新 add
- 确认没有把本地配置或密钥留在暂存区,提交前再扫一遍
- 准备继续拆分提交时,用 git add -p 逐块精细暂存