Git:add 多了,用 restore --staged 只退暂存区

41 次浏览3 条回复

有时候 git add . 手快,把暂时不想提交的文件也放进暂存区了。这个时候不用改工作区内容,只把它从 staged 里拿出来就行。

环境:Git 2.30+。可以开个小目录试一下:

mkdir git-unstage-demo && cd git-unstage-demo
git init
printf 'one\n' > a.txt
printf 'two\n' > b.txt
git add .
git status --short

git restore --staged b.txt
git status --short

第二次状态里,a.txt 还在暂存区,b.txt 会变成未暂存的改动。文件内容不会被删,只是从这次提交里先挪出去。

如果想退掉全部暂存,可以用:

git restore --staged .

我觉得这个比记 git reset HEAD <file> 更直观一点,尤其是给新同事解释的时候。

这个命令挺适合和 git diff --staged 搭配用。

我一般是提交前先看一眼:

git diff --staged

发现有文件不该进这次提交,再 git restore --staged path/to/file。这样比等 commit message 写完才发现混进东西要省事一点。

还可以补一个 -p:

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

它会按 hunk 让你选要不要退回暂存区。一个文件里混了两处改动,只想把其中一处留到下次提交时,这个比整文件退出来再重新 add -p 少绕一点。

这里有个小坑也值得记一下:restore --staged 只是把内容从 index 里拿掉,工作区那份改动还在。

所以如果本来是想撤掉代码改动,别只敲这一句。可以先看一下:

git status --short
git diff

确认真不要工作区内容了,再考虑 git restore path/to/file。这俩命令名字很像,但一个退暂存,一个改工作区,手快时还挺容易混。