贮藏(Stash)
本教程共 26 篇 · 第 16 篇 · 更新于 2026-07-29 · 约 6 分钟阅读
16. 贮藏(Stash)
本节目标:学会用 git stash 临时保存未完成的改动,切换分支处理紧急任务,回来再恢复现场继续开发。
你正写到一半,突然被喊去修一个紧急 bug。代码改了一半没法提交,切分支又怕丢。
这就是 stash 的用武之地。
stash 一句话定义
把工作目录和暂存区的”脏状态”暂存到一个栈里,让工作目录变干净。以后可以原样恢复。
可以把它理解成”把正在写的文章暂时塞到抽屉里,去处理紧急邮件,回来接着写”。
基本用法
保存当前工作
git stash
更明确的写法:
git stash push -m "正在写登录页面"
-m 加个描述,方便以后辨认。
执行完输出类似:
Saved working directory and index state WIP on main: a1b2c3d 添加首页样式
工作目录瞬间干净了。可以安心切分支。
查看贮藏列表
git stash list
stash@{0}: WIP on main: a1b2c3d 添加首页样式
stash@{1}: WIP on main: d4e5f6g 修复注册流程
最新的是 stash@{0}。像栈一样,越新越靠前。
恢复贮藏
两种姿势:
git stash apply # 恢复,但贮藏还在
git stash pop # 恢复,并删除这个贮藏
pop 更常用。恢复完直接扔掉,省事。
想恢复指定某个:
git stash apply stash@{1}
Note恢复贮藏时,之前暂存(git add)过的文件不会自动重新暂存。想保留原暂存状态,加
--index:git stash apply --index。
删除贮藏
手动删除:
git stash drop stash@{0}
清空所有:
git stash clear
Warning
clear不可恢复。确定不要了再执行。
贮藏的高级用法
贮藏未跟踪文件
默认 stash 只保存”已跟踪文件”的改动。新建的文件不会进来。
加 -u(或 --include-untracked)把未跟踪文件也藏起来:
git stash -u
加 -a(或 --all)连被 .gitignore 忽略的文件也一起藏:
git stash -a
交互式贮藏
只想藏部分改动?加 -p(或 --patch):
git stash -p
Git 会逐个 hunk 问你要不要藏:
diff --git a/app.py b/app.py
@@ -12,6 +12,9 @@ def hello():
print("hello")
+
+ print("world")
+
Stage this hunk [y,n,q,a,d,/,e,?]?
y:藏这个 hunk。n:不藏。a:藏这个文件剩下的所有 hunk。d:这个文件剩下的都不藏。s:把当前 hunk 拆成更小的。e:手动编辑这个 hunk。q:退出,之前选定的会保存。
从贮藏创建分支
恢复贮藏时,如果当前分支已经有了新提交,可能会冲突。
git stash branch 能一步到位:基于贮藏时的提交创建新分支,恢复工作,然后删掉贮藏。
git stash branch new-feature
输出:
M app.py
Switched to a new branch 'new-feature'
Dropped refs/stash@{0}...
适用场景:你发现之前的工作其实更适合在独立分支上继续。
贮藏的常见坑
贮藏不包含未跟踪文件
这是新手最常踩的坑。新建了文件,stash 完切分支,回来发现文件没了。
因为默认 stash 不藏未跟踪文件。两个选择:
- 新建文件后
git add一下。 - 用
git stash -u。
多次 stash 要辨认清楚
list 输出只看描述不够直观。可以加 --stat 看改了哪些文件:
git stash show stash@{1}
app.py | 10 ++++++++++
1 file changed, 10 insertions(+)
想看完整 diff:
git stash show -p stash@{1}
贮藏和分支是两个概念
贮藏是临时存放,不是提交。贮藏不会出现在 git log 里,也不会被 push 到远程。
一个典型的 stash 场景
-
正在
feature分支写代码,改了一半。 -
被喊去修紧急 bug。
git stash -m "登录页面写到一半"
git switch main
git switch -b hotfix
- 修复 bug,提交,push。
git add .
git commit -m "修复支付回调"
git push origin hotfix
- 回到 feature 继续干活。
git switch feature
git stash pop
- 继续写,一切像没发生过。
本章小卡片
| 命令 | 作用 |
|---|---|
git stash | 保存当前工作(不含未跟踪文件) |
git stash -u | 保存当前工作 + 未跟踪文件 |
git stash -p | 交互式选择要保存的部分 |
git stash list | 列出所有贮藏 |
git stash show <id> | 查看贮藏概要 |
git stash apply | 恢复贮藏(保留栈中记录) |
git stash pop | 恢复并删除栈中记录 |
git stash drop <id> | 删除指定贮藏 |
git stash clear | 清空所有贮藏 |
git stash branch <name> | 从贮藏创建新分支 |
Tip贮藏只存本地,不能替代提交。下班前最好把重要进度正式提交或推到远程,别只依赖 stash。