Git:只想撤回工作区里的某个文件,`git restore` 比 checkout 清楚点

33 次浏览2 条回复

改代码时偶尔会把一个文件试乱,但又不想动别的改动。新一点的 Git 可以用 git restore 只还原指定文件。

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

mkdir git-restore-demo && cd git-restore-demo
git init
printf 'hello\n' > app.txt
git add app.txt
git commit -m 'init'

printf 'broken\n' > app.txt
git diff -- app.txt
git restore app.txt
cat app.txt

最后会看到 app.txt 又变回:

hello

如果文件已经 git add 进暂存区了,先退回暂存区可以用:

git restore --staged app.txt

我觉得它适合那种“这个文件不要了,其他文件先留着”的场景。用之前最好先 git diff -- 文件名 看一眼,免得把还想保留的临时改动也还原掉。

这个点确实比 checkout -- file 好懂很多。

补一个小习惯:如果不确定文件现在有没有进暂存区,可以先看一眼:

git status --short

左边那列有东西一般就是暂存区也动了,只撤工作区的话用 git restore 文件名,连暂存一起想退就再配 --staged。这样不太容易把两层状态搞混。

还有个容易忽略的小用法:如果只是想把某个文件恢复到上一个提交里的样子,可以指定来源:

git restore --source=HEAD~1 -- app.txt

这个不会切分支,比 checkout HEAD~1 -- app.txt 读起来直一点。用之前还是建议先 git diff HEAD~1 -- app.txt 看一眼,避免把当前需要的改动盖掉。