临时切换分支、需团队协作或后续用 git stash pop 恢复时选 Stash;只想存部分文件、反复应用/撤销且不共享时选 Shelve。两者底层不同:Stash 是 Git 原生 ref,Shelve 是 WebStorm 本地补丁。

Git Stash 和 Shelve 到底该用哪个?
直接说结论:**临时切换分支、需要团队协作或后续可能用 git stash pop 在命令行恢复时,选 Stash;只想存一部分文件、反复应用/撤销、不打算共享给他人,选 Shelve。**
很多人一上来就点错入口——WebStorm 里「Stash Changes」在顶部菜单 Git → Stash Changes,而「Shelve Changes」得在 Commit 工具窗口(Alt+0)里右键文件或变更列表才出现。两者底层完全不同:Stash 是 Git 原生命令生成的 ref 对象,Shelve 是 WebStorm 自己维护的本地补丁,不进 Git 历史。
-
Stash会打包所有未提交更改(包括新文件,但不含.gitignore排除项),不能挑文件;Shelve允许你取消勾选任意文件,甚至只搁置某个 changelist -
Stash默认 30 天后可能被 Git 的gc清理掉;Shelve一直留着,直到你手动删掉 Shelf 条目 - 冲突处理上,
Unshelve有 IDE 内置三向合并视图;git stash pop出冲突就得切终端手动解决
怎么正确执行 Git Stash(不是 Shelve)?
别在 Commit 窗口右键选「Shelve Changes」——那不是 stash。真要走 Git 流程,必须从顶部菜单触发:
- 确保当前工作区没正在运行的 rebase/merge(否则会报错
error: cannot stash in the middle of a merge) - 点击
Git → Stash Changes,弹出对话框后填个有意义的Stash message(比如WIP: auth refactor before switching to feat/login) - 勾选
Include untracked files才能暂存新文件(默认不勾);勾选Include ignored files是极少数场景,通常不用 - 点 OK 后,本地修改消失,
Local Changes列表清空,Git 日志里也不会多一条提交
此时你在终端执行 git stash list 就能看到它,和命令行操作完全一致。
为什么点了 Stash 却找不到 Unstash 选项?
常见原因是:你没打开 Git 工具窗口,或者没切换到 Log 标签页。正确路径是:
- 按
Alt+9打开Git工具窗口(如果看不到,检查View → Appearance → Tool Window Bars是否启用) - 左侧选中
Log: main(或你当前分支),顶部标签切换到Stashes - 这里会列出所有 stash 记录,右键就能选
Apply Stash或Pop Stash
注意:Pop 是 apply + drop 一步到位;Apply 只应用不删除,适合反复测试。如果误点了 Drop,还能靠 git reflog 找回来,但 WebStorm 不提供图形化回溯。
Stash 后切分支失败?检查这三点
即使成功 stash,切换分支仍可能失败,典型错误是 error: Your local changes to the following files would be overwritten by checkout。这不是 stash 失败,而是:
- 你 stash 之后又改了某些文件(比如编辑器自动保存、IDE 生成临时文件),导致工作区非干净状态
- stash 时没勾选
Include untracked files,但那些未跟踪文件恰好和目标分支里同名文件冲突 - 目标分支有 submodule,而你本地 submodule 指针没更新(
git submodule update --init可解)
最稳的做法:stash 后立刻执行 git status 确认输出是 nothing to commit, working tree clean,再切分支。别信 IDE 界面显示的“干净”——它有时会漏判自动生成的文件。

















