Git执行checkout、reset指令仍无法丢弃工作区修改该如何解决?
问题根因
你遇到的是大小写不敏感文件系统和Git大小写规则冲突的典型问题:
Windows、macOS默认使用的文件系统(NTFS、APFS默认配置)是大小写不敏感但保留大小写的,你仓库索引中存储的文件名为首字母大写的Doxygen.css,你执行撤销命令时输入的是全小写的doxygen.css,Git在默认配置下会忽略大小写差异,导致无法正确匹配索引中的文件条目,撤销操作不生效。git reset --hard不生效也是相同原因。
可直接生效的解决方案
按顺序执行以下操作即可,不需要重新克隆仓库:
- 首先临时修改当前仓库的Git配置,关闭大小写忽略:
git config core.ignorecase false
- 执行撤销操作,注意文件名必须和
git status输出的完全一致,首字母大写:
git checkout -- projects/TouchDetector/5.6.1/_static/doxygen/Doxygen.css
- 执行
git status验证,此时修改提示应该已经消失。如果后续不需要保留大小写敏感配置,可以执行git config core.ignorecase true恢复默认配置。
异常场景兼容方案
如果上述操作仍然不生效,大概率是文件索引缓存异常,按以下步骤处理:
- 先将文件从Git索引中移除,不会删除本地文件:
git rm --cached projects/TouchDetector/5.6.1/_static/doxygen/Doxygen.css
- 从HEAD版本中恢复正确的文件:
git checkout HEAD -- projects/TouchDetector/5.6.1/_static/doxygen/Doxygen.css
如果是Linux/macOS环境下因为文件权限变更导致的状态误报,可以额外执行git config core.fileMode false忽略文件权限的变更检测。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

