vscode中scm视图右上角“stash changes”仅stash当前修改文件且不弹窗确认,而命令面板“git: stash”会检测暂存区并询问是否包含staged变更;二者均不支持-u参数,需终端执行。

VSCode 里点一下就能 git stash,但真要靠它安全切换分支、临时保存半成品,光点按钮远远不够——默认行为会漏掉未跟踪文件,冲突时没提示,pop 后 stash 消失还容易误删。
VSCode 中 stash 按钮和命令面板的区别在哪
VSCode 左侧 SCM 视图右上角的 ⋯ → Stash Changes,和命令面板里执行 Git: Stash,底层都调用 git stash push,但行为有关键差异:
- 右键文件 →
Stash changes只 stash 该文件的修改,不带 -u 或 --staged 参数,也不弹窗确认 - 命令面板执行
Git: Stash会检测当前是否有已暂存(staged)的变更,若有则弹窗问“Include staged changes?”——选否就只 stash 未暂存部分,选是等效于git stash push -S - 两者都不支持
-u(含未跟踪文件)或--keep-index,想用就得切终端
为什么 git stash pop 没反应,或者改了文件却没还原
这不是 VSCode 卡了,而是 Git 在 pop 过程中遇到冲突时默认中止,但不报错、不弹窗,只在终端输出 Auto-merging xxx 和 CONFLICT (content): Merge conflict in xxx,编辑器里对应文件会出现
- VSCode 不会主动高亮冲突文件,得手动打开被修改的文件才能看到
-
git stash pop是apply + drop两步合并,一旦冲突,apply 失败,drop 也不会执行,stash 仍保留在栈里 - 更稳妥的做法是先
git stash apply,确认无冲突、内容正确后再git stash drop - 如果已经 pop 失败,别急着
git stash drop,先git status看哪些文件冲突,解决完再git add提交或继续 drop
如何 stash 未跟踪的新文件(比如刚建的 config.local.js)
默认 git stash 完全忽略 untracked 文件,哪怕它们出现在 git status 的 “Untracked files” 区域里。必须加参数才能包含:
-
git stash push -u -m "wip: add local config"—— 包含所有未跟踪文件 -
git stash push -a -m "wip: include ignored files"—— 还包含 .gitignore 里声明忽略的文件(慎用) - VSCode 内置操作不支持这两个参数,必须进终端执行
- 执行后,
git stash show -p stash@{0}能确认是否真的包含了新文件
stash 列表里一堆 stash@{0},怎么知道哪个改了啥
git stash list 默认只显示类似 stash@{0}: WIP on main: 8a3f2c1 fix login timeout,根本看不出这次 stash 具体动了哪几个文件。
- 加
-p查看补丁:git stash show -p stash@{0},能看到具体增删行 - 创建时务必加描述:
git stash push -m "wip: api v2 migration - update auth header",比默认的 WIP 有用十倍 - VSCode 命令
Git: Show All Stashes会列出全部,但依然只显示默认 message;想快速定位,还是得终端配合git stash show - 注意:stash 只存在本地
.git/refs/stash,clone 新仓库后这些记录全都没了——别把它当备份用
最常踩的坑不是不会 stash,而是 stash 后忘了它存在,几天后 git stash pop 覆盖了新写的逻辑;或者在多人协作分支上 apply 了一个旧 stash,把别人刚合入的改动又悄悄回退了。stash 是个本地快照工具,不是版本管理替代品,用完记得及时清理或转成 commit。











