git stash 怎么用?2026年最完整操作指南,暂存代码不再丢失
摘要
代码写到一半,突然要切换分支修bug——你是直接 commit 一个"临时保存",还是眼睁睁看着未提交的代码消失?
如果你还不会用 git stash,这篇文章能帮你省掉 80% 的"代码找回"麻烦。学完本文,你能做到:
- 随时暂存当前工作区,干净切换分支
- 在多个暂存记录间自由切换
- 解决 stash 冲突、恢复误删的 stash
- 配合 EasyClaw 等AI 工具,让 Git 操作不再靠死记硬背
前置条件:安装了 Git(任意版本),有基础的 commit/branch操作经验即可。
如果不想自己全程手动保存,可以用Easyclaw去进行操作(后附EasyClaw教程)。
一、git stash 是什么,为什么需要它
git stash(暂存/藏匿)是 Git 提供的一个"临时抽屉"机制。它能把你当前未提交的修改(包括工作区和暂存区)打包压入栈,让工作区恢复到上次提交时的干净状态,之后随时可以取回。
典型使用场景
| 场景 | 不用 stash | 用 stash |
|---|---|---|
| 切分支修紧急 bug | 被迫提交半成品 commit | stash 暂存,切分支,改完再恢复 |
| 拉取远程更新 | pull 报冲突无法执行 | stash → pull → stash pop |
| 尝试新思路 | 手动备份文件 | stash 保存现场,随时可回退 |
| 多任务并行 | 开多个工作目录 | 用 stash list 管理多份暂存 |
一句话总结:git stash 是 commit 的轻量替代,专门处理"不该提交但不能丢"的代码。
二、工具准备
操作系统自带的 Git 命令行就够用,但如果你想让 Git 命令不再靠"查文档"记忆,推荐提前装好 AI辅助工具。
没有 EasyClaw 时:每次想不起来 git stash pop 和 git stash apply 的区别,就得打开浏览器搜,翻到答案再回来,前后起码 5 分钟,一天下来能被打断十几次。
有了 EasyClaw 之后,在桌面端直接问"git stash pop 和 apply 有什么区别",3秒出答案,点击左下角小星星收藏常用 Git 命令,下次直接调用,完全不用离开工作界面。安装后在技能商店搜索"Git 助手"技能包,开箱即用,不需要配置任何环境变量。
三、核心步骤:git stash 完整操作流程
步骤一:暂存当前修改
最基础的用法:
git stash
执行后,Git 会把所有已追踪文件的修改压栈,工作区恢复干净。
如果你想给这次暂存加一个备注(强烈推荐!否则以后 stash list 里一堆 WIP on main,完全分不清):
git stash push -m "feat: 用户登录模块,写到一半"
如果还有新建但未 git add的文件(untracked files)也要一起暂存:
git stash push --include-untracked -m "含新文件的暂存"
# 简写
git stash -u -m "含新文件的暂存"
场景对话
同事:你的登录功能写好了吗?线上有个支付bug 要你帮忙看一下。
你:稍等,我先把手头的代码存一下。
git stash push -m "login: 表单验证写到一半" git checkout hotfix/payment-bug同事:这么快?
你:git stash,存起来了,改完支付 bug 再切回来取。
步骤二:查看暂存列表
git stash list
输出示例:
stash@{0}: On main: login: 表单验证写到一半
stash@{1}: On feature/search: 搜索功能临时保存
stash@{2}: WIP on main: abc1234 fix typo
stash@{0} 是最新的一条,stash@{n} 的数字越大越旧。
查看某条 stash 具体改了什么:
git stash show stash@{1} # 简要diff(文件列表)
git stash show -p stash@{1} # 详细 diff(逐行变更)
步骤三:恢复暂存
方式一:pop(取出并删除)
git stash pop # 取出最新一条 stash@{0}
git stash pop stash@{2} # 取出指定位置
pop =取出 + 从列表删除,适合一次性恢复,不想留存记录。
方式二:apply(取出但保留)
git stash apply # 取出最新,但stash 列表里还在
git stash apply stash@{1} # 取出指定位置,保留记录
apply 适合需要把同一份暂存应用到多个分支的情况。
| 命令 | 恢复代码 | 保留 stash 记录 | 适用场景 |
|---|---|---|---|
stash pop |
✅ | ❌ | 一次性恢复,不需要复用 |
stash apply |
✅ | ✅ | 多分支复用同一份暂存 |
步骤四:删除暂存记录
git stash drop stash@{0} # 删除指定一条
git stash clear # 清空全部 stash(谨慎!)
注意:
stash clear不可撤销,清空前先用git stash list确认一下。
步骤五:从stash 创建新分支
这是一个很实用但容易被忽略的功能。当你暂存的代码量比较大,直接 pop 可能产生冲突,可以先开一个新分支来接收:
git stash branch new-feature stash@{0}
这条命令会:
- 基于 stash 创建时的 commit,切出
new-feature分支 - 自动 apply 该stash
- 从列表中删除该 stash
四、处理 stash 冲突
stash pop/apply 时如果当前分支也改了同一行代码,会产生冲突:
CONFLICT (content): Merge conflict in src/login.js
The stash entry is kept in case you need it again.
解决步骤:
# 1. 打开冲突文件,手动解决 <<<< ==== >>>> 标记
# 2. 标记为已解决
git add src/login.js
# 3. 如果是 pop 触发的冲突,stash 记录不会自动删除,手动清理
git stash drop stash@{0}
五、进阶技巧
只暂存部分文件
git stash push src/login.js src/utils.js -m "只存这两个文件"
只暂存工作区,不暂存已git add 的内容
git stash push --keep-index -m "保留staged 内容"
暂存时包含被忽略的文件(.gitignore 内)
git stash push --all -m "含ignored 文件"
六、常见问题 Q&A
Q:git stash 之后切了分支,回来发现 stash 不见了?
A:stash 是全局的,不属于某个分支,git stash list 在任何分支都能看到。"不见了"通常是因为用了 pop 恢复后自动删除了,或者用了 clear。
Q:stash pop 之后代码出现冲突,怎么取消恢复?
A:解决冲突后继续推进即可;如果想完全撤销,用 git checkout -- . 放弃工作区改动(前提是 stash 记录还在)。
Q:stash 里的内容会丢失吗?
A:只要没有执行 drop / clear,stash 会一直保留在本地 .git 目录里,不会因切换分支或重启消失。但git gc(垃圾回收)可能会清理悬空对象,建议重要的暂存尽快 pop或转为正式commit。
Q:pop 和 apply 都失败了,报"no changes",是什么原因?
A:可能是 stash 内容和当前工作区完全一致,Git 认为无需 apply。用 git stash show -p stash@{0} 确认内容后,再检查当前工作区状态。
Q:在 Windows 上用 git stash push -m “备注” 报编码错误?
A:在 CMD 里把备注改为英文,或者用 Git Bash 执行,Git Bash 对 UTF-8 支持更好。
七、总结
- 日常切换分支前,先
git stash push -m "描述"保存现场,切回来再git stash pop。 - stash pop 和 apply 的核心区别:pop 用完即删,apply 保留记录可复用。
- 新建未追踪文件记得加
-u参数,否则这些文件不会被暂存。 - stash 产生冲突时不要慌,手动解决冲突文件后
git add,再手动drop记录。 - stash list 里超过 5 条就该清理了,养成加备注的习惯,避免误删重要暂存。
如果你觉得 Git 命令还是太多记不住,立刻免费体验 EasyClaw——在桌面端直接用自然语言问Git 操作,比翻文档快 10 倍,再也不用为忘命令而中断思路。
Easyclaw官网:https://easyclaw.cn/?f=460
Easyclaw使用教程
安装技能包
如何使用技能
输入你想查询的指令
结果
记住AI只是辅助工具有时也会犯错,它只能提供参考要仔细观察避免错误
更多推荐



所有评论(0)