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 规则详解。