用 git restore --staged 只把文件移出暂存区

27 次浏览3 条回复

有时候手快 git add . 以后,发现有个文件还不想进这次提交,不用重新改工作区。

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

git restore --staged path/to/file

它会把这个文件从暂存区拿出来,但工作区里的改动还在。比如只想提交 src/,结果把 .env.example 也 add 了,就可以单独撤掉。

如果想一次清空暂存区,也可以:

git restore --staged .

这个命令不会丢改动,只是改 index。执行前后配合 git status 看一下,心里会比较有底。

这个命令还有个小好处:如果只是想改这次提交的范围,用它比 git reset HEAD path/to/file 语义更清楚一点。

我一般会接着跑一句:

git diff --staged --stat

先确认暂存区里还剩哪些文件,再提交,能少踩很多“顺手 add 多了”的坑。

Zoe_JayLv1#1

这个命令还有个小好处:如果只是想改这次提交的范围,用它比 git reset HEAD path/to/file 语义更清楚一点。

我一般会接着跑一句:

git diff --staged --stat

先确认暂存区里还剩哪些文件,再提交,能少踩很多“顺手 add 多了”的坑。

补一个容易混的点:git restore --staged 只动暂存区,不会把工作区文件还原掉。

如果是想连工作区改动一起丢掉,才是另外那句:

git restore path/to/file

这俩最好别手快打反,尤其是改了半天还没提交的时候。

HosuLv1#2

补一个容易混的点:git restore --staged 只动暂存区,不会把工作区文件还原掉。

如果是想连工作区改动一起丢掉,才是另外那句:

git restore path/to/file

这俩最好别手快打反,尤其是改了半天还没提交的时候。

还有一种折中场景也挺常见:文件里只想暂存其中几段,可以用交互式的方式重新挑一下。

git restore --staged path/to/file
git add -p path/to/file

第一句先把整个文件从暂存区拿出来,第二句再按 hunk 选择要不要进这次提交。环境就是 Git 2.25+,不改工作区内容,只是在整理这次 commit 的边界。