You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

git stash push -- <path>未加-a/--all却删未跟踪文件?求文档依据

Git Stash Push 针对子目录时未跟踪文件的行为解析

核心行为的文档依据

在你使用的Git 2.14.3版本中,git stash push -- <pathspec>的特殊行为确实有明确的文档说明:

当未指定<pathspec>时,所有变更(已暂存和未暂存)以及未跟踪文件(除非使用--no-keep-index)都会被暂存。当指定<pathspec>时,只有匹配路径规则的变更会被暂存,且匹配路径规则的未跟踪文件会被移除(就像对它们执行了git checkout操作一样)。

简单来说,一旦你给git stash push加上了子目录路径参数,Git的逻辑就会切换:它只暂存该路径下的已跟踪变更,而该路径下的未跟踪文件会被直接清理,这和不指定路径时默认保留未跟踪文件的行为完全不同。

为什么会有这种差异?

Git设计这个逻辑的初衷是,当你针对特定子目录执行stash操作时,大概率只想暂存该目录下已有的、已跟踪文件的修改;而该目录下的未跟踪文件可能是临时生成的、你不需要保留的内容,所以Git默认帮你清理掉了它们。而全局stash时,Git会假设你可能还需要这些未跟踪文件,因此默认保留。

如何避免误删未跟踪文件?

如果想在针对子目录stash时保留未跟踪文件,只需要加上--include-untracked(或短参数-u)即可,命令如下:

git stash push -u -- subdir

这样指定子目录下的未跟踪文件也会被存入stash中,后续可以通过git stash pop完整恢复。

内容的提问来源于stack exchange,提问作者nneonneo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:30:08