Git:临时收起改动时,`git stash -u` 能把新文件也带上

27 次浏览3 条回复

有时候切分支前想先把工作区清干净,但目录里还有刚建的文件。普通 git stash 不会收起未跟踪文件,这时可以用 -u

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

mkdir git-stash-u-demo && cd git-stash-u-demo
git init
printf 'base\n' > app.txt
git add app.txt
git commit -m 'init'

printf 'base changed\n' > app.txt
printf 'draft\n' > draft.txt

git status --short
git stash push -u -m 'wip with draft'
git status --short
git stash pop
git status --short

第一次状态里会看到已修改的 app.txt 和未跟踪的 draft.txtstash -u 后工作区会干净一些,pop 之后两类改动都会回来。

这个适合临时切上下文。要是里面有不想带走的缓存文件,还是先看一眼 git status --short 比较稳。

补一句:如果只是想把未跟踪文件也收起来,但不想碰 .gitignore 里那些缓存,可以用 git stash push -u;要连忽略文件一起收才是 -a

我觉得 -a 得稍微谨慎点,像 node_modules、构建产物这种被带进去,stash 会变得又大又慢。

还有个小细节:stash 多了以后最好顺手带个 -m,不然后面只看到 WIP on ... 容易分不清是哪一坨。

想先看内容也不用急着 pop,可以:

git stash list
git stash show -p stash@{0}

确认没问题再 git stash pop stash@{0},会安心一点。

如果 stash 是为了临时切分支,还有个不太常用但挺好理解的命令:

git stash branch try-wip stash@{0}

它会从当时 stash 的基点拉一个新分支,再把改动套上去。比在当前分支直接 pop 少一点心理负担,尤其是隔了几天才想起来那坨改动的时候。