用 git restore --staged 只撤回暂存区

16 次浏览3 条回复

有时候 git add . 手快了,只想把某个文件从暂存区拿下来,但不想丢掉本地修改,可以用 restore --staged。

环境:Git 2.25+,在仓库根目录执行:

git restore --staged src/app.ts

如果想把这次暂存的内容都撤回工作区:

git restore --staged .

它不会删掉文件里的改动,只是把状态从 staged 变回未暂存。提交前发现多 add 了日志文件、临时配置时,这个比重新改一遍省心一点。

这个命令现在确实比老写法清楚一点。

如果仓库里还有人习惯用旧命令,也可以对照记:

git reset HEAD src/app.ts

效果差不多,但 restore --staged 一眼就能看出来只是动暂存区,不太容易被误会成要回滚文件。

还有个小细节挺容易混:如果文件本来已经被 Git 跟踪,restore --staged 只是把这次 index 里的改动退回去,工作区内容还在。

我一般会顺手接一眼:

git status --short

看到从 M 变成 M,心里就比较有数了。

补一个容易忽略的情况:如果文件是这次新建、刚被 git add 的,执行后它会从暂存区回到未跟踪状态,文件内容不会消失。

可以用 git status --short 看看,通常会从 A 变成 ??。