默认 git stash 不会丢掉未跟踪文件,仅暂存已跟踪的修改;加 -u 可包含未跟踪文件,-a 还包括被忽略文件;stash 是本地栈式列表,不跨仓库同步,不可 cherry-pick 或 revert。

stash 会丢掉未跟踪的文件吗
默认不会暂存,但也不会丢掉——它只是忽略。执行 git stash 时,只保存已跟踪(tracked)且被修改的文件,所有 git status 显示为 untracked 的新文件都不会进入 stash。
- 如果需要一并暂存未跟踪文件,加
-u参数:git stash -u - 想连忽略文件(.gitignore 里的)也一起 stash?用
-a:git stash -a,但极少需要,容易误带临时配置或构建产物 - 不确定当前 stash 包含什么?用
git stash show -p stash@{0}看具体差异
stash 后切换分支再 pop,为什么文件没恢复
不是 stash 失效了,而是 pop 时发生了冲突,Git 默认中止操作并留下冲突标记,但不报错提示“失败”,看起来像“没反应”。
- 执行
git stash pop后检查git status:如果有unmerged或冲突文件,说明 pop 卡在半途 - 想强制应用并自动丢弃冲突部分?不行,Git 不提供这种模式;正确做法是先解决冲突,再
git add+git commit或git stash drop - 更安全的做法是先
git stash apply(不自动 drop),确认无误后再手动git stash drop
多个 stash 怎么区分和找回
Git 把 stash 当成栈,但实际是带时间戳的列表,stash@{0} 是最近一次,stash@{1} 是上一次……但靠数字记容易错。
- 用
git stash list查看全部,输出里包含提交简写和备注,例如:stash@{0}: WIP on main: 8a3f2c1 fix login timeout - 创建 stash 时加描述,比默认的
WIP on xxx有用得多:git stash push -m "wip: api v2 migration" - 想恢复某个特定 stash?别只写
git stash pop,明确指定:git stash pop stash@{2}或git stash apply stash@{2}
stash 和 cherry-pick / revert 混用会出问题吗
不会直接冲突,但语义混乱。stash 是本地暂存机制,不产生 commit;cherry-pick 和 revert 都依赖 commit 对象。如果你从 stash pop 出来的修改再去 cherry-pick 其他分支的 commit,Git 完全感知不到 stash 来源——它只认工作区状态。
- stash 本身不可被 cherry-pick,因为不是 commit;想复用某次 stash 的修改到其他分支,只能先
apply,再commit,再cherry-pick这个新 commit - 误把 stash 当 commit 回退?
git revert对stash@{0}会报错:fatal: bad revision 'stash@{0}' - 最常被忽略的一点:stash 不跨仓库同步,clone 新环境后,所有 stash 都不存在——它只存在本地
.git/refs/stash,别把它当备份用


















