VSCode 的 Git Stash 默认仅 stash 已跟踪文件的修改,不处理新建未跟踪文件、未暂存更改及冲突状态;需设 git.untrackedChanges 为 all 或用 git stash push -u 才包含未跟踪文件,恢复时优先用 Apply 而非 Pop 避免丢失修改。

VSCode 的 Git Stash 功能能用,但默认只 stash 已跟踪文件的修改;新建未 git add 的文件、未暂存的 staged 更改、冲突状态下的操作,都容易出错或被忽略——想稳住工作区,得先搞清它在哪生效、在哪失效。
为什么点「Stash Changes」后文件还在列表里?
这不是 VSCode 失效,是它按 Git 规则严格过滤:只处理已跟踪(tracked)且有修改/已暂存的文件。新建的 utils.js、刚写完没 git add 的 config.local.json,默认完全不进 stash。
- 现象:右键文件 →
Stash Changes,左侧“更改”列表仍显示该文件 - 原因:该文件状态是
untracked,VSCode 调用的是git stash push默认行为(不含-u) - 临时解法:终端执行
git stash push -u -m "with untracked" - 长期设置:VSCode 设置中搜
git.untrackedChanges,改为all,之后图形化 stash 会自动包含新建文件(但依然不支持-S或跳过冲突)
怎么安全恢复 stash 而不丢代码?
VSCode 提供 Git: Apply Stash 和 Git: Pop Stash 两个命令,行为差异极大,选错可能直接丢失修改。
使用约定式提交(Conventional Commits)从 Git 历史记录中生成结构化变更日志,支持多种格式、AI 增强型描述以及可自定义的范围……
-
Git: Apply Stash=git stash apply:应用后 stash 保留在栈中,适合先试还原、确认无误再手动git stash drop -
Git: Pop Stash=git stash pop:应用后立即删除该 stash;一旦冲突失败,stash 消失,原始修改也回不来 - VSCode 不对
Pop做二次确认,也不保留暂存区状态(--index),要保留 staged 状态得切终端跑git stash pop --index - 想恢复旧 stash(比如
stash@{2})?VSCode 原生界面只支持最新一条,必须用终端:git stash apply stash@{2}
为什么 stash 后看不到历史列表?
VSCode 源代码管理视图默认不展示 stash 列表,你点“Stashes”面板看到的其实是空的——这不是 bug,是原生限制。
- 查看完整列表:命令面板输入
Git: Show All Stashes,它会调用git stash list并弹出可选菜单 - 但该命令只支持选中后
pop,不支持apply或预览内容差异 - 要看某条 stash 改了啥:终端运行
git stash show -p stash@{0} - 想在 UI 里直接浏览/对比/管理多条 stash?得装扩展,比如 GitLens
哪些情况 VSCode 会禁用 stash 按钮?
不是功能坏了,是它主动锁死——这是保护机制,绕过可能破坏 Git 索引。
- 当前处于合并(
merge)、变基(rebase)或拣选(cherry-pick)过程中 - 工作区存在未解决的冲突(哪怕只一个文件高亮红色)
- Git 索引状态异常(例如上一次操作中断导致
.git/index.lock残留) - 此时命令面板里
Git: Stash会灰掉,右键菜单也不出现Stash Changes - 别强行开终端硬 push:先
git status看状态,解决冲突或git rebase --abort清理现场再 stash
真正麻烦的从来不是 stash 这个动作本身,而是 stash 范围模糊、恢复不可逆、历史不可见这三点叠加——尤其当你刚新建了带密钥的配置文件,又顺手点了 Pop,结果连后悔的机会都没有。

















