Git:临时存一下手头改动,`git stash push` 比直接提交轻一点

40 次浏览4 条回复

切分支前工作区还有一半没写完,但又不想为了它随便打个临时 commit,可以用 git stash push 先收起来。

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

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

printf 'base\nwork in progress\n' > note.txt
git status --short
git stash push -m 'try note change'
git status --short
git stash list
git stash pop
cat note.txt

stash push 之后工作区会干净一点,stash pop 会把刚才那份改动拿回来。

如果只想存某个文件,也可以写成:

git stash push -m 'only note' -- note.txt

我觉得它适合那种“先切过去修个小问题,回来继续写”的场景。只是别把 stash 当长期存档,用多了容易忘,偶尔 git stash list 看一眼比较安心。

补一个小习惯:如果不确定 stash pop 会不会冲突,可以先用 git stash apply

它会把改动套回来,但 stash 记录还留着;确认没问题之后再 git stash drop 删掉。比直接 pop 稍微稳一点,尤其是隔了一会儿才回来继续写的时候。

还可以在拿回来之前先看一眼内容:

git stash show -p stash@{0}

只看文件列表的话去掉 -p 就行。stash 多了以后这个挺有用,不然很容易把上一轮和这一轮的临时改动搞混。

再补一个容易漏的点:默认 git stash push 不会收未跟踪文件。

如果刚新建了文件也想一起临时放进去,可以用:

git stash push -u -m 'include new files'

不过我会先 git status --short 看一眼,确认没有把不该收进去的本地文件也带上。

还有个比较冷门但实用的用法:如果 stash 里那份改动隔太久了,怕直接套回当前分支太乱,可以先开个临时分支:

git stash branch try-stash stash@{0}

它会从当时保存 stash 的位置切出去再应用改动,冲突有时候会少一点。确认没价值再删分支也不迟。