二进制文件冲突无法自动合并,因为git的合并引擎仅识别文本的“行”和“上下文”,而psd、xlsx、pdf等文件无行结构,git只能判断文件整体变化,无法定位具体修改(如第3页表格新增两行或图层重命名),故直接报conflict(content)并中断。

二进制文件冲突为什么不能像代码那样自动合并
因为 Git 的合并引擎只理解文本的“行”和“上下文”,而 .psd、.xlsx、.pdf、.jar 这类文件没有可解析的行结构。Git 只能判断“这个文件整体变了”,但无法指出“第3页表格新增了两行数据”或“图层‘背景’被重命名”。所以它直接放弃智能合并,报出 CONFLICT (content) 并中断流程。
常见错误现象包括:
- 终端只显示
Auto-merging design.psd和CONFLICT (content): Merge conflict in design.psd,没有 -
git diff design.psd输出空或乱码,git merge-file报错 “binary files differ” - IDE(如 IDEA)提示 “Binary file conflict”,但 Merge 工具不可用或灰显
git checkout --ours / --theirs 是最稳的解决方式
当协作方明确知道“谁的版本更权威”时,直接选用原生命令是最少出错的选择。它不依赖外部工具,也不要求你打开 Excel 或 Photoshop。
操作要点:
- 确认当前所在分支是你要保留变更的目标分支(比如你在
main上执行git merge feature/ui,那--ours指的就是main版本) - 命令必须在冲突状态(即
MERGING)下运行,否则--ours无效 - 执行后必须立刻
git add,否则git commit会失败并提示 “cannot do a partial commit during a merge” - 别用
git restore --ours替代 —— 它作用于工作区,但不会清除 Git 的冲突标记,git commit仍会拒绝
示例:
GInstall OneClick — 一键安装 GitHub 项目:规划、克隆、安装 Node 依赖、运行开发脚本。适用于想要获取 GitHubNode.js 项目的用户。
git checkout --theirs assets/logo.png git add assets/logo.png git commit -m "resolve binary conflict: keep logo from feature/branding"
手动合并前必须提取两个版本再比对
如果两个版本都有有效修改(比如设计师改了 PSD 图层,产品经理更新了 Excel 表格),盲目选 --ours 或 --theirs 会丢数据。这时得人工介入,但前提是先拿到两个干净副本。
关键步骤:
- 不要在冲突状态下直接双击打开文件 —— 大多数应用会读取暂存区的“半成品”,内容不可靠
- 用
git show HEAD:assets/report.xlsx > report-main.xlsx提取当前分支版本 - 用
git show MERGE_HEAD:assets/report.xlsx > report-feature.xlsx提取待合并分支版本(MERGE_HEAD是 Git 在合并时自动记录的对方提交) - 用 Excel 自带的“比较工作簿”功能,或 Beyond Compare、WinMerge 等支持二进制对比的工具打开两个文件
- 合并完成后,把最终版覆盖到工作区文件,再
git add—— 此时 Git 认为该文件已解决
哪些二进制文件类型最容易踩坑
不是所有带扩展名的文件都是真二进制。有些看似是文档,实际是 ZIP 压缩包(如 .docx、.xlsx),Git 默认仍按二进制处理;而有些纯文本却被误标为二进制(如 UTF-16 编码的 .csv)。
验证方式:
- 运行
git check-attr -a -- somefile.xlsx,看是否返回binary: set - 用
file somefile.xlsx查看实际 MIME 类型(应为Zip archive data) - 执行
git merge-file --no-commit &1 | head -n1,若输出含 “binary files differ”,则确认是二进制
容易被忽略的点:某些构建产物(如 dist/bundle.js)虽是文本,但因体积大、无意义 diff,团队常配置为 binary 属性 —— 这类文件一旦冲突,也得走二进制流程,不能指望 git diff 显示差异。










