Git Stash 在 PhpStorm 中实际调用 Git 命令存入当前分支的 stash 栈(.git/refs/stash),跨 IDE 有效;默认仅暂存已跟踪文件的修改,新增未跟踪文件需勾选“Include untracked files”,且受 .gitignore 约束。
Git Stash 在 PhpStorm 里到底存到哪去了
它不是存在 ide 缓存里,而是实打实地调用 git 命令,把修改压进当前分支的 stash 栈——和你在终端敲 git stash push 效果完全一样。这意味着 stash 是跨 ide 的,换台电脑、换编辑器(比如 vs code)照样能 git stash pop 拿回来。
但注意:PhpStorm 默认只 stash **已跟踪文件**(即之前 commit 过的文件)的修改;新增但未 git add 的文件(untracked files)默认不进 stash。如果你改了新文件又点了「Stash Changes」,很可能发现它们不见了——其实是被忽略了。
- 要一并暂存新增文件,点 stash 弹窗右下角的 Include untracked files 复选框(对应命令行的
git stash push -u) - 如果勾了但 stash 后新文件仍没出现,检查是否被
.gitignore拦住了——stash 不绕过 ignore 规则 - stash 栈是按分支维护的,切换分支再 stash,不会混在一起;但
git stash pop默认取最新一条,不管当前分支
点「Stash Changes」按钮后没反应?常见卡点
最常遇到的是弹窗一闪而过,或者状态栏显示「No changes to stash」,但明明文件有高亮改动。这通常不是 PhpStorm bug,而是 Git 状态判断逻辑导致的:
- 文件被标记为 ignored(比如在
.git/info/exclude或项目级.gitignore中),PhpStorm 会跳过它,也不提示 - 你改的是二进制文件(如
logo.png),且没开启 Git 的二进制 diff 支持,PhpStorm 可能认为“无文本变化”,拒绝 stash - 工作目录有未解决的合并冲突(
git status显示Unmerged paths),此时git stash命令本身就会失败,PhpStorm 也跟着静默 - 权限变更(比如
chmod +x script.sh)默认不触发 stash,除非显式启用git config stash.showPatch true并配合-p参数——但 PhpStorm GUI 不暴露这个开关
怎么从列表里精准恢复某次 stash,而不是总 pop 最新的
PhpStorm 的「Unstash Changes」面板默认只列出最近几次 stash(最多 10 条),但每条都带完整提交信息和时间戳,你可以直接点击任意一条右边的 Apply Stash 按钮——它等价于 git stash apply stash@{2},不会清空 stash 栈,适合反复试验。
- 如果列表里找不到想要的 stash,点面板右上角的 Refresh 按钮(或按
Ctrl+Shift+O),强制重读 Git 的refs/stash - 想删掉某条旧 stash?不能在 UI 里直接删,得切到 Terminal,运行
git stash drop stash@{1},然后刷新面板 - Apply 后如果出现冲突,PhpStorm 会像处理 merge 冲突一样标红行号,但不会自动帮你 resolve——得手动编辑再
git add,否则下次 stash 仍会包含这些冲突标记
Stash 和 Local History 的根本区别别搞混
很多人以为「Local History」是 PhpStorm 版 stash,其实二者完全无关:Local History 是 IDE 自己在 .idea/workspace.xml 附近存的快照,不依赖 Git,删了项目目录就丢;而 git stash 是写进 .git/refs/stash 的真实 Git 对象,只要 .git 文件夹在,stash 就在。
立即学习“PHP免费学习笔记(深入)”;
- Local History 能恢复删掉的文件,stash 不能(除非你当初勾了 Include untracked files)
- stash 可以跨机器同步(推送到远程仓库的 reflog?不行,但你能
git push origin refs/stash:refs/stash手动推,极少见);Local History 完全本地 - 如果你关掉了 VCS 集成(File → Settings → Version Control → 选 None),「Stash Changes」菜单项会直接消失——它底层强依赖 Git CLI
真正容易被忽略的是:stash 不保存工作区 clean 状态。比如你 stash 前刚执行过 git clean -fd,那些被删的文件不会因为 stash 而复活;stash 只管「修改」,不管「删除」或「新建但未跟踪」的动作本身——除非你主动勾选包含 untracked files。


















