Git status显示本地未删除文件为已删除,切换分支后问题反复出现
问题成因
- 大小写不敏感文件系统冲突:这是该类问题最常见的诱因。Windows、macOS默认使用大小写不敏感的文件系统(如默认配置的NTFS、APFS),如果你切换的其他分支中存在同名但大小写不同的文件(比如后缀为小写的
xyz.png),切换分支时文件系统会把两个大小写不同的文件视为同一个,直接覆盖内容。等你切回master分支时,Git要匹配的是xyz.PNG(大写后缀),但磁盘上留存的是小写版本,就会判定原大写文件被删除。 - Git钩子自动操作:如果仓库配置了
post-checkout钩子脚本,可能在切换分支完成后自动执行预设的清理逻辑,误删了该PNG文件。 - 第三方软件干扰:如果仓库目录处于同步盘(OneDrive、iCloud、国内网盘等)的同步范围,或是被杀毒软件、企业安全管控软件监控,可能在切换分支产生文件变动的瞬间,被这类软件误判为风险文件自动删除。
- Git配置不匹配:如果本地Git的
core.ignorecase配置和实际文件系统特性不匹配,比如文件系统是大小写不敏感,但手动将core.ignorecase设为了false,也会引发文件识别异常。
彻底解决方法
- 优先排查大小写冲突
执行以下命令查看不同分支的同名文件大小写情况:
# 查看master分支下该文件的真实文件名 git ls-tree master --name-only | grep -i xyz.png # 查看你切换过的其他分支下的同名文件真实文件名 git ls-tree 其他分支名 --name-only | grep -i xyz.png
如果确认存在大小写不同的两个文件,统一两个分支的文件名大小写即可解决,建议统一使用全小写避免跨平台冲突:
# 先在master分支执行改名 git mv xyz.PNG xyz.png git commit -m "统一PNG文件大小写,避免跨平台冲突" git push # 切到其他分支执行同样的改名操作合并即可
- 排查Git钩子
查看仓库.git/hooks目录下是否存在非.sample后缀的post-checkout文件,打开检查是否包含删除文件的相关逻辑,不需要的钩子直接删除该文件即可。 - 排查第三方软件干扰
把仓库移动到非同步目录、临时关闭杀毒软件监控后再测试切换分支,如果问题不再出现,将仓库目录加入对应软件的白名单即可。 - 修正Git配置
Windows、macOS下执行以下命令,确保配置和文件系统特性匹配:
git config --local core.ignorecase true
内容的提问来源于stack exchange,提问作者jawsnnn
相关产品推荐
相关产品推荐

