非文本文件冲突不能直接编辑,因git不插入冲突标记且无法解析二进制差异,强行编辑易损坏文件头;应先git merge --abort恢复状态,再用git checkout --ours/--theirs定向取舍并git add。

非文本文件冲突为什么不能直接编辑
Git 对 .png、.woff2、.pdf 等非文本文件默认不执行内容合并,只做“全有或全无”判断。一旦两个分支都修改了同一二进制文件,git status 会显示 both modified,但打开文件看不到 这类标记——因为 Git 根本没尝试插入它们。强行用文本编辑器保存可能损坏文件头,导致图片打不开、字体渲染失败。
快速确认并恢复到安全状态的三步操作
遇到这类冲突,别急着改文件。先确保工作区可逆:
- 运行
git status,确认输出里有类似Unmerged paths和both modified: icon.png的行 - 立即执行
git merge --abort—— 这会清空所有未提交的冲突状态,把工作目录和暂存区完全还原到git merge前一刻 - 再用
git ls-files -u检查是否还有未合并条目(应为空输出),确认已退出合并状态
真正要保留哪个版本?用 checkout --ours/theirs 定向取舍
如果明确只需要某一分支的二进制文件(比如设计稿以 design 分支为准,代码分支只负责引用),就跳过手动编辑,直接覆盖:
-
git checkout --ours icon.png:保留当前分支(HEAD)的版本,丢弃待合并分支的改动 -
git checkout --theirs icon.png:采用待合并分支的版本,丢弃当前分支的改动 - 执行后必须立刻
git add icon.png,否则git commit会报错“still contains unmerged paths” - 注意:
--theirs在git pull场景下实际对应远程分支;在git merge feature场景下才对应feature分支
后续怎么避免重复踩坑
非文本文件冲突无法自动解决是 Git 的底层限制,但可以减少发生频率:
- 把
.gitattributes文件加到仓库根目录,显式声明哪些后缀不参与合并:*.png -merge、*.ttf -merge - 团队约定:图标/字体等资源统一由专人提交,其他分支只允许
git checkout <commit-hash> -- assets/icon.png</commit-hash>向前同步,禁止本地修改 - CI 流程中加入检查:
git diff --name-only HEAD^ | grep -E '\.(png|jpg|woff2|pdf)$' && echo "binary file changed, please verify"
二进制冲突没有“融合”逻辑,只有“选一个”。想靠编辑器点几下 Accept Incoming 就搞定,基本等于赌运气。真正省事的方式,是提前用 .gitattributes 切断 Git 的自动合并幻想,再靠流程约束人。











