Git文件模式变更冲突的理解与解决方案
解决Git中"File mode changed in both source and destination"冲突(非忽略方案)
问题本质
虽然ls显示两个分支的文件权限字符串一致(均为-rw-rw-r--),但Git实际追踪的是文件的执行权限位(即是否包含x权限),同时文件大小差异说明内容存在不可见差异(如换行符、末尾空格),两者叠加引发了冲突。
分步解决方法
1. 确认Git感知到的权限与内容差异
执行以下命令,查看Git识别到的具体变化:
git diff develop my-branch -- path/to/file.py
输出中会显示:
- 文件模式变化:如
old mode 100644/new mode 100755,这是Git判定模式冲突的核心依据 - 内容差异:会列出文件中具体的字符变化(包括换行符、空格等不可见内容)
也可通过数字权限确认实际差异:
# 在develop分支执行 stat -c "%a %n" path/to/file.py # 在你的分支执行 stat -c "%a %n" path/to/file.py
644对应rw-rw-r--,755对应rwxr-xr-x,对比两个分支的数字权限是否一致。
2. 修正文件模式
如果确实存在执行权限的误修改,在你的分支中调整权限与develop分支一致:
# 假设develop分支的数字权限是644 chmod 644 path/to/file.py # 提交权限修正 git add path/to/file.py git commit -m "fix: correct file mode for path/to/file.py"
3. 修复文件内容差异
根据git diff的结果,手动修正文件中的内容差异(如统一换行符、删除多余空格等),然后提交:
git add path/to/file.py git commit -m "fix: resolve content differences in path/to/file.py"
4. 重新处理合并与PR
将develop分支合并到你的分支:
git merge develop
若仍有内容冲突,按常规流程解决后提交。最后推送更新后的分支到远程,Bitbucket的PR即可正常处理。
补充说明
Git仅追踪文件的执行权限位,而非全部权限。跨系统操作(如Windows与Linux切换)时,换行符自动转换可能导致文件内容变化,同时Git可能自动调整文件权限,进而触发这类冲突。
内容的提问来源于stack exchange,提问作者AssertionError
相关产品推荐
相关产品推荐

