先看症状:你的三方合并是不是"假的"?

很多人以为自己在用三方合并,其实打开的只是普通双向对比。判断方法很简单——Beyond Compare 的三方合并窗口应该有三个上方面板(左侧 LOCAL、中间 BASE、右侧 REMOTE)和一个底部输出面板。如果你只看到左右两栏,说明调用方式有误,根本没有进入 merge 模式。

Beyond Compare相关配图

一个典型的出错场景:在 Git 中配置 Beyond Compare 为 mergetool 后,执行 `git mergetool` 弹出的窗口只有两个文件在做 diff。这通常是因为 `.gitconfig` 中的 `cmd` 参数写成了 diff 模式而非 merge 模式。正确的写法(以 Beyond Compare 5 / v4 Pro 版为例)应当显式传入四个路径参数:

```ini [mergetool "bc"] cmd = "BComp.exe" "$LOCAL" "$REMOTE" "$BASE" "$MERGED" trustExitCode = true ```

注意这里是 `BComp.exe`(等待进程)而不是 `BCompare.exe`(后台启动后立即返回)。用错可执行文件名会导致 Git 认为合并瞬间完成,直接跳过你的操作。

参数顺序踩坑:为什么 BASE 面板是空的

Beyond Compare 的命令行参数顺序直接决定了哪个文件出现在哪个面板。官方文档(Scooter Software Knowledge Base, 适用于 Beyond Compare v4.4.7 及 v5.x)明确指出,三方合并的参数映射关系为:

Beyond Compare相关配图

``` BComp.exe ```

第一个参数 → 左面板,第二个 → 右面板,第三个 → 中间 BASE 面板,第四个 → 底部输出文件。

常见故障:有人把 `$BASE` 放在第一个位置,结果左面板显示的是公共祖先版本,中间面板加载了 LOCAL,合并逻辑完全混乱。更隐蔽的情况是 `$BASE` 变量本身为空——当 Git 找不到共同祖先时(比如合并两个无关历史的分支),`$BASE` 会指向一个空临时文件,中间面板自然一片空白。

排查步骤:

1. 在终端手动打印变量,确认四个文件路径都存在且非空: ```bash git mergetool --tool=bc -- ``` 2. 如果 BASE 确实为空,可以在 Beyond Compare 底部输出面板中手动选择"以左侧为基础"或"以右侧为基础"开始编辑,而非等待自动合并。

合并完成但结果没写回:trustExitCode 与输出路径

另一个高频问题是:在 Beyond Compare 里仔细处理完冲突,保存并关闭,回到终端却发现 Git 提示合并失败,或者冲突标记依然存在。

Beyond Compare相关配图

根源通常有两个:

第一,`trustExitCode` 设置。当设为 `true` 时,Git 完全依赖 Beyond Compare 的退出码判断合并是否成功。如果你点了窗口右上角的"×"关闭而不是点击"保存"按钮后退出,Beyond Compare 会返回非零退出码,Git 就认为你放弃了合并。建议在 Beyond Compare 内使用 Ctrl+S 保存输出文件,再通过菜单正常退出。

第二,输出路径不匹配。某些 Git GUI 客户端(如 SourceTree、Fork)在调用外部 mergetool 时,会用自己的临时目录存放 `$MERGED` 文件。如果 Beyond Compare 的输出写到了另一个位置,Git 读不到结果。验证方法:

```bash # 在 .gitconfig 中临时加一行 log 来确认实际路径 [mergetool "bc"] cmd = echo \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\" >> ~/merge_debug.log && "BComp.exe" "$LOCAL" "$REMOTE" "$BASE" "$MERGED" ```

检查 `merge_debug.log` 中 `$MERGED` 的路径是否指向工作区内的实际冲突文件。

macOS 和 Linux 下的额外兼容问题

Windows 上的配置相对直接,但 macOS 和 Linux 用户还需要注意以下几点:

macOS 上 Beyond Compare 的命令行工具需要手动安装。打开 Beyond Compare 后,进入菜单栏 → Beyond Compare → Install Command Line Tools,这会在 `/usr/local/bin/` 下创建 `bcomp` 和 `bcompare` 两个符号链接。`.gitconfig` 中应使用 `bcomp`(阻塞模式):

```ini [mergetool "bc"] cmd = bcomp "$LOCAL" "$REMOTE" "$BASE" "$MERGED" ```

Linux 下如果通过 Snap 安装 Beyond Compare,路径可能是 `/snap/bin/bcompare`,且 Snap 的沙箱机制可能阻止访问 `/tmp` 目录下的 Git 临时文件。症状表现为打开后面板全部空白。解决方案是改用 .deb 或 .rpm 包安装,或者通过 `snap connect bcompare:removable-media` 授予额外文件访问权限。

如果你使用 WSL(Windows Subsystem for Linux),需要在 cmd 中通过 `wslpath` 转换路径,否则 Windows 端的 Beyond Compare 无法识别 Linux 风格的路径。

总结

这篇 Beyond Compare 三方合并教程跳过了"什么是三方合并"的科普部分,直接针对配置不生效、面板显示异常、合并结果丢失、跨平台兼容性这四类真实故障给出了可复现的排查路径。核心就三件事:确认 `BComp`(阻塞模式)而非 `BCompare`;确认四个参数的顺序与变量非空;确认退出方式和输出路径。如果你的环境问题比较复杂,可以前往 Beyond Compare 官网下载最新版本试用,v5 在合并冲突的自动解析能力上有明显提升,值得体验。

相关阅读:Beyond Compare 三方合并教程使用技巧Beyond Compare 使用教程入门:从安