git stash 默认只暂存已跟踪文件的修改,不包含未跟踪文件(如新建未add的.env.local),必须加-u参数才能暂存;VSCode中stash操作无显式按钮,需通过命令面板调用,且pop失败时stash不会自动删除。

直接说结论:git stash 不是“一键保存所有改动”的万能快照,它默认只管已跟踪文件的修改和暂存区状态,新文件、忽略文件、未 git add 的改动全都不收——用错参数或没看清状态,stash 后发现“代码丢了”,其实是压根没存进去。
git stash push -u 是什么情况下必须加的
你新建了一个 .env.local,改了几行,没运行过 git add,然后执行 git stash。结果切分支回来一查,文件还在工作区?不,它根本没被 stash 收走——因为它是 untracked 文件,默认被跳过。
-
git stash和git stash push默认行为一致:只处理 tracked 文件的 staged + unstaged 变更 - 要包含所有未跟踪文件(比如本地配置、日志、临时生成文件),必须显式加
-u:git stash push -u - 加了
-u后,git status里显示为Untracked files:的条目才会进 stash;否则它们留在原地,且 stash 恢复时也不会动它们 - 注意:如果该文件在
.gitignore里,-u也不管——得再加-a,但慎用,可能把密钥、token 一起塞进 stash
VSCode 里点 “Stash Changes” 却没弹窗,到底发生了什么
你右键一个已修改文件 → 点 “Stash Changes”,结果啥也没弹出来,工作区看起来“没变化”。这不是卡死,是 VSCode 根据当前暂存区状态做了自动判断。
- 如果当前**没有任何
git add过的变更**(即全是 unstaged 修改),VSCode 直接执行git stash push -m "VS Code stash",不弹窗 - 只要存在至少一个 staged 文件(哪怕只有一个
git add README.md),VSCode 就会弹窗,让你选:“Stash including staged changes” 还是 “Stash only untracked and modified” - 弹窗容易被遮挡(尤其多窗口/分屏时),留意右下角状态栏是否出现 “Stashing changes…” 提示;没看到就切终端看有没有阻塞进程
- VSCode 不支持
git stash push -S(仅 stash staged 部分)这类精细控制,想这么干,必须切终端
git stash pop 失败后 stash 去哪了
执行 git stash pop 报冲突,你关掉终端去修代码,回头再试,发现 git stash list 还有那条记录——不是 Git 漏删,是它根本没删。
-
git stash pop本质是git stash apply+git stash drop两步;apply 失败时,drop 不会执行 - 所以冲突后
git stash list仍能看到stash@{0},下次pop还是它,容易反复撞同一处冲突 - 解决完冲突后,必须手动
git add冲突文件,再git stash drop stash@{0}清理,否则它一直占位 - 更稳妥的做法是:先用
git stash apply试还原,确认无误再git stash drop;或者用git stash pop --index保留暂存区状态,避免重置错乱
跨分支 pop stash 为什么代码“贴歪了”却没报错
你在 feature/login 上改了 auth.js 第 12 行,git stash 后切到 hotfix/timeout 执行 git stash pop,没冲突提示,但逻辑出 bug——不是 Git 没尽责,是 patch 应用机制本身不保证语义对齐。
- stash 本质是基于当前 HEAD 的 diff 补丁;换分支 pop,Git 只按行号+上下文模糊匹配位置,若目标分支同文件已有相近修改,补丁可能“偏移”贴到错误行
- 这种错位不会触发冲突(因为没改同一行),但会导致功能异常,排查极难
- 优先用
git stash branch hotfix-from-stash:它自动创建新分支并 pop,确保上下文一致 - 非跨分支不可时,先
git stash show --stat stash@{0}看改了哪些文件,再git log -p -n 3 hotfix/timeout -- auth.js查目标分支近期变更,预判风险点
最常被忽略的一点:stash 描述不写清楚,git stash list 里全是 WIP on main: abc1234,几周后你根本分不清哪条 stash 对应哪个需求、哪个分支、改了什么核心逻辑——加 -m 不费事,但省下的排查时间远超预期。



















