Git执行git merge master时未修改文件被自动提交如何解决
Git合并master后大量未修改文件被标记为已修改问题
问题场景
在个人开发分支执行git merge master合并master分支最新代码,操作完成后执行git status查看仓库状态,大量从未编辑修改过的文件被标记为已提交状态。初步怀疑异常和Linux Ubuntu系统有关,已尝试执行git merge --abort终止本次合并后重新操作,问题仍然复现,异常状态截图如下:

问题原因
该问题和Ubuntu系统本身无直接关联,属于跨系统协作开发时Git配置不匹配的常见问题:
- Git默认开启文件可执行权限位(即文件mode的
+x属性)跟踪,只要文件的可执行权限和当前分支记录的不一致,哪怕文件内容完全没有改动,Git也会将其判定为已修改。这种权限差异通常来自不同操作系统的权限机制区别:Windows系统不区分类Unix系统的可执行权限位、不同开发者设备的umask配置不同、协作者提交时误修改了文件权限,都会导致合并时出现批量无内容改动的文件变更记录。 - 定位方式:执行命令
git config core.fileMode,如果返回结果为true,即可确认是该配置导致的异常。
解决方法
- 先清理当前异常的工作区状态:
如果当前还处于合并流程中,执行git merge --abort终止合并;如果已经退出合并流程,执行git reset --hard HEAD回到当前分支的干净提交节点。 - 关闭Git对文件可执行权限位的跟踪,单仓库生效执行:
git config core.fileMode false
如果需要让本机所有Git仓库都默认关闭该配置,添加全局参数执行:git config --global core.fileMode false - 重新执行合并操作:
git merge master - 合并完成后执行
git status验证,之前未编辑过的文件不会再出现在变更列表中。
其他排查方向
如果关闭权限位跟踪后问题仍然存在,可依次检查以下配置:
- 换行符配置不匹配:Ubuntu环境建议将自动换行配置设置为
input,执行命令git config core.autocrlf input即可,避免Windows系统的CRLF换行符和Linux的LF换行符差异导致批量文件被判定为修改。 - 暂存区脏数据:执行
git rm --cached -r .清空暂存区跟踪记录(该操作不会删除本地磁盘上的实际文件,仅清除Git暂存区的缓存),之后重新添加需要提交的文件即可。
内容的提问来源于stack exchange,提问作者Fathe
相关产品推荐
相关产品推荐

