VSCode 的 Git: Stash 仅 stash 已跟踪文件,不处理未跟踪、二进制文件及冲突状态;全局 stash 必须通过命令面板调用,右键仅作用于选中文件;stash 后新文件仍在“更改”列表属正常,因默认不包含 untracked 文件。

VSCode 里点一下就能 stash,但默认只管已跟踪文件;新文件、二进制文件、冲突状态都容易漏掉或失败——得知道它“不做什么”,才不会以为功能坏了。
Git: Stash 命令面板调用是唯一可靠入口
VSCode 源代码管理侧边栏没有 stash 按钮,右键菜单里的“Stash Changes”只对选中文件生效,而全局 stash 必须走命令面板。按 Ctrl+Shift+P(Windows/Linux)或 Cmd+Shift+P(macOS),输入 Git: Stash 回车即可触发。
- 它实际执行的是
git stash push -m "VS Code stash",带默认消息,不可跳过 - 如果工作区有未解决的合并冲突,
Git: Stash会直接报错:error: Cannot save the current index state,不会静默失败 - 右键单文件 stash 更安全:适合只想藏起某几个改动,避免误卷入其他未提交变更
- 面板按钮 stash 全局修改,适合确认其他文件已提交/丢弃后再操作
为什么 stash 后文件还在“更改”列表里?
这不是 bug,是 Git 的设计边界:stash 默认只处理「已跟踪(tracked)」且「已修改/已暂存」的文件。刚新建、没 git add 过的文件(untracked)根本不会被包含。
- 例如你新建了
.env并编辑,但没git add .env,执行Git: Stash后它仍显示在“更改”里——这是正常行为 - 要 stash 未跟踪文件,必须切终端运行:
git stash push -u -m "with untracked",-u(等价于--include-untracked)不能通过 VSCode 命令面板传入 -
-a(--all)会连.gitignore里的文件也 stash,一般没必要,反而增加恢复复杂度
stash 后 pop 失败,大概率是合并冲突没提示
VSCode 点“Pop Stash”本质是执行 git stash pop,但遇到冲突时 UI 不弹窗、不报错,只让 Git 图标变红或“更改”列表突然多出冲突标记文件。
- 先在终端跑
git status,看是否提示both modified:或unmerged paths - 想安全预览再应用?VSCode 不支持
git stash show -p,得手动进终端查:git stash show -p stash@{0} - pop 失败后,stash 记录还在,但工作区已半途卡住;此时建议改用
git stash apply stash@{0}+git stash drop stash@{0}分步控制 - 二进制文件(如图片、.zip)被 stash 后 pop 冲突时 Git 直接拒绝,无法自动合并,只能手动还原原始版本再处理
stash 列表不刷新、内容看不到,得靠终端补位
VSCode 的 Git: Show Stash List 能列出 stash@{0} 这类索引,但仅限名称和分支信息,不显示修改路径、不支持 diff 预览,也不自动刷新缓存。
- 执行
Git: Show Stash List后选中条目,VSCode 默认执行git stash pop(不是apply),stash 会被删掉——这点容易误操作 - UI 不展示 stash 时间戳,所有记录都叫
On main: VS Code stash,所以务必在终端用git stash push -m "wip: api timeout fix"手动加可识别 message - “源代码管理”面板 stash 后仍显示旧文件列表?关掉面板重开,或按
Ctrl+R刷新窗口,是常见 UI 缓存问题 - 想查 stash 里到底改了哪些行?VSCode 不提供界面,只能终端:
git stash show -p stash@{0}或git stash show --name-only stash@{0}
真正麻烦的不是 stash 不会用,而是它不做精细控制、不暴露冲突细节、不保留时间上下文——这些空缺必须靠终端命令填上,否则一到 pop 就卡住,还得翻日志找哪次 stash 改了哪个文件。











