git stash 是 git 提供的栈式暂存机制,用于临时保存工作区和暂存区修改、恢复干净 head 状态以切换分支;默认不保存未跟踪文件,需加 -u 参数;stash@{0} 为最新项,pop 会删除而 apply 不删,本质是带元数据的特殊提交。

git stash 是最常用也最安全的暂存方案
未提交修改直接切换分支会被 Git 拒绝,git stash 就是为此设计的:它把工作区和暂存区的改动打包压栈,同时清空工作区,让你能干净切换。执行后 HEAD 会回到最近一次提交状态,但所有改动没丢,只是“藏起来了”。
常见错误现象:运行 git stash 后发现新文件(untracked)没被保存 —— 这是因为默认不处理未跟踪文件。
- 要包含未跟踪文件,必须加
-u参数:git stash push -u -m"临时调试" - 带描述更易识别,避免后期靠时间戳猜用途;
git stash list里能看到你写的-m内容 - 如果中途误操作导致工作区变脏,
git stash apply可重复应用,而git stash pop应用后自动删掉该条记录
git commit 临时提交更适合中长期切换
当你改了一半、但已通过编译或局部测试,且预计几小时甚至隔天才会切回来,git commit 比 stash 更可靠。stash 栈是本地的、不跨机器,而 commit 记录在分支历史里,IDEA 或其他协作者都能看到进度。
注意别 push 到远程——这是关键约束:
-
git add . && git commit -m"wip: user login refactor"(wip 表示 work in progress) - 切换分支前确认
git status显示 “nothing to commit” - 切回原分支后,若想清理这个临时提交,可用
git reset --soft HEAD~1把它变回暂存区,保留修改
IDEA 内置 stash 和 shelve 容易混淆
IntelliJ IDEA 提供两个相似功能:Stash Changes 调用的是 Git 原生命令,生成真实 stash 记录;Shelve Changes 是 IDE 自研机制,不依赖 Git,只存在本地项目配置中。
容易踩的坑:
- 用
Shelve Changes后换电脑或重装 IDEA,那些 shelved 内容就丢了 - 在
Stash Changes对话框里勾选 “Include unversioned files”,等价于命令行加-u - 恢复时选
Apply Stash不会删除记录,适合反复验证;Pop Stash才会清掉栈顶那条
git stash pop 冲突时怎么撤回
git stash pop 应用失败时,Git 不会自动回退,而是让冲突文件留在工作区并标为 unmerged 状态。此时不能直接 git reset --hard,否则可能连 stash 本身都毁掉。
正确做法:
- 先用
git status确认哪些文件冲突,手动解决后git add再git commit - 如果想放弃这次 pop,运行
git stash show -p | git apply -R可逆向打补丁(前提是还没add冲突文件) - 最保险的兜底:
git stash apply stash@{0}先试应用,确认无冲突再git stash drop stash@{0}
stash 不是黑盒,它本质就是一次 commit + 一个引用指针;真正难的不是存,而是恢复时面对不同分支的上下文差异 —— 这点常被忽略。











