首页 / Git 入门教程 / 贮藏(Stash)

Git 入门教程

贮藏(Stash)

本教程共 26 篇 · 第 16 篇 · 更新于 2026-07-29 · 约 6 分钟阅读

GitGit 入门教程贮藏stashgit stash popgit stash apply工作现场保存

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)过的文件不会自动重新暂存。想保留原暂存状态,加 --indexgit 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 不藏未跟踪文件。两个选择:

  1. 新建文件后 git add 一下。
  2. 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 场景

  1. 正在 feature 分支写代码,改了一半。

  2. 被喊去修紧急 bug。

git stash -m "登录页面写到一半"
git switch main
git switch -b hotfix
  1. 修复 bug,提交,push。
git add .
git commit -m "修复支付回调"
git push origin hotfix
  1. 回到 feature 继续干活。
git switch feature
git stash pop
  1. 继续写,一切像没发生过。

本章小卡片

命令作用
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。