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
相关产品推荐
相关产品推荐

