Git对二进制文件冲突静默处理,仅显示“both modified”且不提示差异;因其依据文件头800字节含\0判定二进制,禁用diff;须用git checkout --ours/theirs选版本并显式git add标记解决,否则合并卡住;建议预设.gitattributes声明binary避免隐式冲突。

Git对二进制文件冲突不报错、不标记、不提示差异,只静默卡在“both modified”状态——你必须主动识别、手动选版本、显式git add,否则合并永远无法完成。
为什么git diff对.psd/.xlsx什么也输出不了
Git判断二进制的依据是文件头前800字节是否含\0(空字节),和后缀名无关。一旦判定为二进制,git diff就禁用内容比对,只显示Binary files a/file.psd and b/file.psd differ。
-
git status显示both modified,但看不到任何差异细节 -
git mergetool默认不弹窗(除非额外配置支持二进制的外部工具) - VSCode等编辑器的冲突UI完全不加载红蓝标记块,连
Accept Current Change按钮都不出现
用git checkout --ours或git checkout --theirs强制选版本
这是最直接、最安全的解法,适用于明确知道该留哪边的情况(比如你刚改完设计稿,同事改的是旧版)。
- 保留你当前分支的版本:
git checkout --ours -- path/to/file.psd - 保留对方分支(如
origin/main)的版本:git checkout --theirs -- path/to/report.xlsx - 命令末尾的
--是必需的,防止路径被误认为参数 - 执行后必须立刻
git add path/to/file.psd,否则Git仍认为冲突未解决
提前用.gitattributes声明binary避免隐式冲突
等冲突发生再手动选,容易漏、容易错、容易忘记git add。更稳的做法是在项目初期就声明哪些文件永远不该被合并。
- 在仓库根目录新建
.gitattributes - 写入:
* .psd binary、* .xlsx binary、* .sketch binary -
binary关键字等价于-merge -diff,Git会直接拒绝尝试合并 - 下次冲突时,
git status会明确标为unmerged,终端打印CONFLICT (binary): Merge conflict in file.psd,而不是含糊的Auto-merging
真正容易被忽略的是:Git从不自动标记二进制文件为“已解决”,哪怕你已经用checkout覆盖了文件内容——git add这一步不可跳过,且必须针对具体路径,不能用git add .偷懒,否则可能漏掉没处理完的二进制冲突文件。


















