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

Git checkout后文件跨分支出现的原因及合理性咨询

为什么stash后切换分支,未跟踪的新文件还留在工作区?

嘿,这个现象其实是Git的默认行为,完全正常,我来给你把原因和原理讲明白:

问题根源:你创建的是未被Git跟踪的新文件

你在master分支新建的dato.py,在执行git add之前属于「未跟踪文件」——Git还没把它纳入版本管理的范围。而git stash的默认行为只暂存已跟踪文件的修改和暂存区的内容,不会管未跟踪的新文件。

所以当你执行git stash的时候,这个dato.py根本没被存到stash栈里,它就安安稳稳留在你的本地工作区。当你切换到feature_branch时,只要这个分支里没有同名的已跟踪文件,Git就不会去改动工作区里的未跟踪文件,自然你在git status里还能看到它。

这是正常现象吗?

完全正常!这是Git的设计逻辑:它不会自动处理未跟踪文件,因为它不确定这些文件是你临时创建的草稿,还是需要纳入版本管理的内容,所以默认会把它们留在工作区,交给你自己决定后续处理方式。

背后的Git原理拆解

Git的工作区文件主要分三类:

  • 已跟踪文件:已经被git add过,纳入版本管理的文件,Git会追踪它们的修改
  • 未跟踪文件:新建的、从未被git add过的文件,Git不会主动处理
  • 忽略文件:被.gitignore匹配的文件,Git完全忽略

git stash的核心作用是「临时保存当前工作区和暂存区的修改,让工作区回到干净状态」,但默认只覆盖已跟踪文件的修改。对于未跟踪文件,Git认为它们不属于当前仓库的版本内容,所以不会动它们。

补充:如果想把未跟踪文件也一起stash怎么办?

如果你希望把未跟踪文件也暂存起来,可以用带-u参数的stash命令:

git stash push -u
# 或者旧版本用 git stash save -u

-u是--include-untracked的缩写,加上这个参数后,未跟踪文件也会被存入stash,此时再切换分支,工作区就看不到dato.py了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:12:59