git stash 把当前工作区和暂存区里还没提交的改动收进一个栈,让工作区立刻回到 HEAD 状态;等切完分支、修完 bug,再原样取回来。它是「临时打断」场景的标准解法。

本文列出 git stash 的子命令与常用参数,重点说明 -u 为什么重要、apply 与 pop 的区别,以及冲突多时更稳的 branch 子命令。

ℹ️
关于本系列
本文是《Git 使用教程》按命令拆分的第 27 / 28 篇,全部收录在 Git 栏目。参数表列的是日常高频项,并非穷举;想看某个命令的完整参数,用 git stash -h 看精简列表、git help stash 看完整手册。示例以 Git 2.56.0 为准。

一、命令语法

先看语法骨架,再对照下一节的参数表。<占位> 表示必填值,实际输入时不要带尖括号;[...] 表示可选项,-- 用来分隔选项与路径。

bash语法
git stash push [-m <message>] [<pathspec>...]
git stash list / show / apply / pop / drop / clear / branch

二、参数逐项详解

下表按用途列出 git stash 的常用参数,每项都注明了「它到底改变了什么」。

子命令 / 参数作用
git stash / git stash push收起已跟踪文件的改动;push 是完整写法
-m <备注> / --message给存档写备注,几天后还能看懂这堆改动是什么
-u / --include-untracked连未跟踪的新文件一起收(默认不收,最容易漏)
-a / --all连被忽略的文件一起收(如 node_modules,通常没必要)
--keep-index只收未暂存的改动,保留暂存区内容
-p / --patch交互式挑选要收起的 hunk
<pathspec>只收指定路径的改动
list列出所有存档,形如 stash@{0};--date=local 可显示时间
show [-p] [<存档>]看存档摘要;加 -p 看完整 diff
apply [<存档>]恢复改动但保留存档,可重复应用到多个分支
pop [<存档>]恢复改动并删除该存档
drop [<存档>] / clear删一个存档 / 清空所有存档
branch <分支> [<存档>]从存档当时的提交新建分支并应用,冲突多时最稳

apply 与 pop 的区别

命令恢复改动存档是否保留
git stash apply是保留,可再次使用
git stash pop是删除(恢复成功时)
git stash branch是,且新建分支删除

三、常用示例

临时切去修 bug 的完整流程

bash临时切去修 bug 的完整流程
git stash push -u -m "半成品:订单导出"
git switch hotfix/urgent
git commit -am "fix: 紧急修复"
git switch feature/order
git stash list
git stash pop stash@{0}

把同一批改动试用到两条分支

bash把同一批改动试用到两条分支
git stash push -m "实验性样式"
git switch theme-a && git stash apply
git switch theme-b && git stash apply stash@{0}

冲突太多时

bash冲突太多时
git stash branch fix/from-stash stash@{1}
# 从当初那个提交开出新分支,改动按原样落上去,冲突最少

四、注意事项

⚠️
默认不收未跟踪文件
git stash 只收已跟踪文件的改动,新建的文件会留在工作区,切分支时可能被带过去甚至覆盖。养成写全 git stash push -u -m "..." 的习惯。
存档不是垃圾桶: stash@{0} 的编号会随每次 push 重新排,别在脚本里写死编号;长期不用的改动还是应该开个分支提交掉。用 git stash list --date=local 定期清理。

五、小结

git stash 的参数里最重要的是 -u 和 -m:前者保证新文件不丢,后者保证过几天还认得出来。恢复时优先 apply(保留存档),确认没问题再 drop,比 pop 更宽容。

本系列共 28 篇,一个命令一篇,完整目录见 Git 栏目。下一篇:git check-ignore 与 .gitignore 规则详解。