Git-Extensions误操作后Git忽略myfile本地改动的排查解决
Git 跟踪文件本地改动被忽略问题排查方案
典型问题表现
- 在Git Extensions中准备提交
myfile的改动时误触发异常操作后,Git完全忽略该文件的所有本地修改,测试环境为PowerShell,已完全关闭Git Extensions。 - 修改
myfile后执行git status无任何差异输出;该文件属于Git跟踪范围(上一次提交已包含该文件的历史版本),即便手动执行git add myfile,git status依然不会展示该文件的状态变化。 - 手动删除
.gitignore文件后,git status可以正常显示.gitignore的删除变更,但始终不会列出myfile的任何相关状态。 - 更新远程仓库的
myfile版本后执行git pull,Git抛出本地改动将被合并覆盖的报错,具体报错内容:
error: Your local changes to the following files would be overwritten by merge: myfile Please commit your changes or stash them before you merge. Aborting Updating 09ad056..eef460f
- 由于
git add无法识别myfile的改动,无法正常提交该文件的变更;执行git stash也不会暂存该文件的改动。手动删除myfile后可以正常执行git pull,但重新恢复文件后问题复现,Git依然不识别对该文件的本地改动。
问题根因
- 经排查确认,异常来源于误触Git Extensions的
Assume unchanged (skip worktree)选项,该操作会给被Git跟踪的文件打上专属标记,强制Git忽略该文件的工作区改动,操作位置示意如下:
解决操作步骤
- 第一步:定位被打上异常标记的文件,在PowerShell中执行命令:
git ls-files -v | findstr "^[Sh]"
注:Windows PowerShell环境下没有原生grep命令,需替换为findstr实现匹配;输出中S开头的条目代表文件被打上skip-worktree标记,h开头的条目代表文件被打上assume-unchanged标记,从中即可找到异常被标记的myfile。 - 第二步:根据标记类型执行对应命令移除标记,恢复Git对该文件改动的跟踪能力:
- 若为skip-worktree标记:执行
git update-index --no-skip-worktree myfile - 若为assume-unchanged标记:执行
git update-index --no-assume-unchanged myfile
- 若为skip-worktree标记:执行
- 操作完成后重新执行
git status,即可正常识别myfile的本地改动,后续的add、commit、pull操作都可以按正常流程执行。
内容的提问来源于stack exchange,提问作者peer
相关产品推荐
相关产品推荐

