git stash pop 应用后删除栈顶stash,git stash apply 仅应用不删除,支持重复使用和指定stash@{n}恢复;默认stash不保存未跟踪文件,需加-u参数。

没提交也没 stash 的改动,切换分支后基本找不回来了。 Git 不会帮你记住未保存的状态,所谓“丢失”其实是它压根没存过——只有 git add 过的、或 git stash 过的、或 git commit 过的,才真正落盘。
git stash pop 和 git stash apply 有什么区别
核心就一条:git stash pop 会从栈顶取出并删除该 stash;git stash apply 只应用、不删除,适合反复验证或保留备份。
- 如果你执行
git stash pop后发现冲突或不对劲,已经没法原路退回(因为 stash 被删了),得靠git stash list看是否还有其他 stash 可用 -
git stash apply stash@{2}可以指定任意位置的 stash,比 pop 更可控 - 误删 stash 后想恢复?只要还没执行
git stash clear,git fsck --lost-found有时能捞回 dangling commit,但别依赖这个
切换分支前忘了 stash,现在改没了怎么办
分两种真实情况:
- 切换时 VSCode 弹窗选了「强制迁出」或命令行用了
git checkout -f:改动已丢,git reflog也救不回来,因为工作区变更从未进入 Git 对象库 - 切换时没报错、也没弹窗,但改完文件在新分支上找不到:大概率是目标分支里对应文件被删/重命名过,Git 没法自动 carry over,此时改动其实“卡”在工作区但被隐藏了——运行
git status,常能看到deleted: xxx.php或unmerged: xxx.js这类提示 - 如果
git status是干净的,而你确定改过:检查是否改的是未跟踪文件(git ls-files --others --exclude-standard可列出),这类文件默认不会被 stash 或切换携带
stash 不生效?可能是没跟踪新文件
git stash 默认只处理已跟踪文件(即进过 git add 的)。新建的文件、配置文件、.env 这类未 add 的内容,stash 会直接忽略。
- 要一并暂存未跟踪文件,必须加
-u(--include-untracked):git stash push -u -m "wip: api v2" - 如果还包含被忽略文件(如
.idea/),得额外加-a(--all),但慎用,容易把敏感信息塞进 stash - 执行
git stash show -p stash@{0}可确认某次 stash 是否含你想要的文件变更
最常被忽略的一点:stash 是本地操作,不随 git push 同步。换机器、重装系统、或同事想拿你的 stash —— 都不行。真要共享临时状态,得提交到一个临时分支,再推上去。











