
你正改到一半,突然要切去修一个紧急 bug,可手头的改动还没写完、提交又怕不完整——这种时候硬切分支只会让改动跟着跑或冲突报错。Git 暂存改动的核心答案是:用 git stash 把工作区和暂存区的改动先“收起来”存到栈里,等忙完再原样恢复,既不丢进度也不污染提交。本文基于 Git 2.4x 验证,把暂存全部改动、只暂存部分文件、以及暂存时带消息三种用法讲透,并附恢复与删除的踩坑清单。今天这篇文章,编程狮就把这块讲透。
先看结论
| 你的场景 | 该用的写法 | 一句话命令 |
|---|---|---|
| 全部改动先收起来 | 暂存工作区全部 | git stash |
| 只收其中几个文件 | 暂存指定文件 | git stash push 文件 |
| 收起来还要好辨认 | 带消息的暂存 | git stash save "改到一半" |
💡 小提示:stash 是一个栈,后进先出。恢复时默认恢复最近一条,记不清就先用
git stash list看编号。
一、Git 暂存改动到底在做什么
Git 暂存改动,本质是把“还没提交的修改”临时塞进一个叫 stash 的栈里,让工作区回到干净状态。这样你就能放心地分支切换或拉取更新,而不用为半成品强行提交。等腾出手来,再把改动弹回工作区。
⚠️ 注意:stash 只保存已被 Git 跟踪的文件改动。全新未
git add过的文件默认不会被收进去,需要用-u参数才包含未跟踪文件。
先看最基础的 git stash 命令:
# 把所有已跟踪文件的改动收进 stash 栈
git stash
# 看看当前栈里有多少份暂存
git stash list
上面这段做的是:在当前分支执行 git stash,工作区立刻变干净,改动被压入栈顶。如果你还不熟悉分支切换的基础,可以先过一遍 Git 教程,把工作区与提交的关系铺平。
二、方案一:暂存工作区全部改动
这是最常用的写法,一条 git stash 把工作区与暂存区一起收起,适合“整个改动都要先让路”的场景,比如临时去修线上 bug。
# 收起全部改动,工作区回到 HEAD 状态
git stash
# 切去修 bug 的分支,干完再回来
git checkout hotfix
# ……修复并提交……
git checkout feature
# 恢复最近一次暂存并弹出栈
git stash pop
上面 git stash pop 会把栈顶改动恢复回工作区,同时把这条 stash 从栈里删掉。执行后你之前写到一半的内容就回来了,可以继续。

💡 小提示:常用命令记不住时,Git 速查手册 把 stash 系列参数摊开对照着看更省心。
三、方案二:只暂存指定文件
有时候你改了 A、B 两个文件,只想先收 A,B 留着继续写。用 git stash push 后面跟具体路径,就能只暂存工作区里的一部分。
# 只收起 src/a.js 的改动,b.js 留在工作区
git stash push src/a.js -m "先收 a 的改动"
# 确认 b.js 还在
git status
这种写法适合“多任务并行、只想隔离某一块”的情况。参数 -m 还能给这条 stash 起个名字,后面 git stash list 里一眼能认出来。
四、方案三:带消息暂存与横向对比
前两种默认不写说明,栈里堆多了就分不清哪条是哪次。用 git stash save "说明" 或 git stash push -m "说明" 给每条加备注,是多人协作和长时间中断时的好习惯。
# 带消息地收起改动
git stash save "登录模块改到一半"
# 恢复指定编号而不是栈顶
git stash apply stash@{1}
# 不想恢复、直接丢弃某条
git stash drop stash@{1}
把三种写法摆在一起对比:
| 方案 | 适用场景 | 优点 | 代价 |
|---|---|---|---|
| 暂存全部 | 整个改动要让路 | 一条命令最省事 | 不能只隔离部分文件 |
| 暂存指定文件 | 只收其中几处 | 粒度可控 | 要多写文件路径 |
| 带消息暂存 | 暂存多、易混淆 | 事后好辨认 | 命令稍长 |

五、踩坑清单
把最容易卡住的三点列出来,每条给现象、原因、修复:
- 现象:stash pop 后报冲突。 原因:恢复时的文件和你切回来后的改动重叠了。修复:先
git stash drop清掉旧 stash,手动合并冲突后再决定要不要重新 stash。 - 现象:新文件没被收进去。 原因:默认只收已跟踪文件。修复:加
-u(git stash -u)把未跟踪文件也一起收。 - 现象:list 里 stash 越来越多不敢动。 原因:只 stash 不 drop。修复:确认都恢复后,用
git stash clear一次性清空,或逐条git stash drop精准删。
动手验证清单(照着做)
- 前置安装:先确认本机已安装 Git,运行
git --version检查版本;没装先下载安装并配好命令行。 - 配置身份:若还没配置,用
git config --global user.name和git config --global user.email配置提交身份。 - 操作命令:照着方案一、方案二、方案三的
git stash相关命令依次执行。 - 预期结果(未在本机执行):
git stash list能看到刚才入栈的暂存项,git stash show -p能看出具体改了哪些文件。 - 运行验证:
git status检查工作区在 stash 之后是否变干净,pop 之后改动又回到工作区。 - 失败处理:若 pop 时发生冲突,Git 不会自动丢弃暂存,用
git stash drop手动清理已恢复的条目;不确定就先git stash apply只恢复不删除。 - 修复补丁:暂存项误删可用
git fsck --unreachable找回悬空对象再恢复;日常别在 stash 里堆太久,建议每完成一次临时切换就立刻 pop 或 drop,避免暂存项越积越多导致混淆。
总结
Git 暂存改动就是用 stash 栈把半成品“寄存”起来,让工作区随时能干净地切去别的分支。最常用的是 git stash 暂存全部;只想隔离某几个文件就用 git stash push 文件路径;暂存一多容易乱,记得用带消息的写法给每条加备注。恢复用 stash pop 或 apply,不要忘了用 drop / clear 清理,否则栈会越堆越厚。把这张对比表记牢,下次中途被打断就不会手忙脚乱。
要点带走:
- 默认 stash 只收已跟踪文件,未跟踪要加 -u;
- 只收部分改动用 git stash push 指定路径;
- 带消息暂存便于事后辨认,恢复后记得清理栈。
下一步可以把分支管理与版本控制系统学一遍。
延伸学习
想把 Git 暂存与版本控制系统补齐,可以按这个顺序来:
- 刚开始接触版本控制,翻 Git 版本控制入门 看基础工作流;
- 想建立整体认知,Git 必备利器 把 Git 的定位讲得很清楚;
- 想边学边练,编程课程 里有配套图文微课,适合巩固。
常见问题
Q:git stash 和 git commit 有什么区别?
A:commit 会把改动正式记入历史,别人也能看到;stash 只是临时塞进本地栈,不生成提交、不影响分支历史。改动还没想好要不要留,就用 stash 寄存。
Q:stash pop 和 stash apply 该用哪个?
A:pop 恢复后顺手把这条 stash 删掉,apply 恢复但保留在栈里。确定只要这一份就用 pop,想先看看效果再决定就先用 apply。
Q:stash 的改动会丢吗?
A:只要不执行 drop 或 clear,stash 会一直留在本地栈里。误删前可以用 git stash list 确认编号,必要时用 git stash apply stash@{n} 再取回来。

TRAE-AI编程



