必须配置 git mergetool 使用 smerge 命令,正确命令为 'smerge merge "$base" "$local" "$remote" -o "$merged"',并设置 trustexitcode true,否则无法自动标记解决且需手动 git add。

git mergetool 配置必须用 smerge,不是 subl 或 sublime_merge
Sublime Merge 的命令行工具名是 smerge,哪怕你双击图标打开的是 “Sublime Merge” 应用,终端里真正被 Git 调用的必须是它。用 subl(Sublime Text)或拼错成 sublime_merge 会导致 git mergetool 启动失败,报错类似 Cannot run 'smerge': No such file or directory 或静默退出。
- Windows 下安装后默认注册了
smerge命令;若未生效,需手动把C:\Program Files\Sublime Merge\加进系统Path环境变量 - macOS 安装后通常自动软链
/usr/local/bin/smerge;如失效,可运行:sudo ln -sf "/Applications/Sublime Merge.app/Contents/SharedSupport/bin/smerge" /usr/local/bin/smerge
- Linux(如 Ubuntu)需从官网下载
.deb或.rpm包安装,不推荐手动解压——否则smerge不会自动注册到$PATH
mergetool 命令参数顺序不能颠倒:必须是 smerge merge "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"
Git 在调用三方合并工具时,会把四个关键路径通过环境变量传入:$BASE(共同祖先)、$LOCAL(当前分支)、$REMOTE(待合并分支)、$MERGED(待写入的冲突文件)。Sublime Merge 的 merge 子命令严格依赖这个顺序,颠倒或漏掉任一参数都会导致界面空白、无法识别冲突块,甚至直接崩溃。
- 正确配置命令:
git config --global mergetool.smerge.cmd 'smerge merge "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'
- 错误示例(常见于抄错教程):
'smerge "$LOCAL" "$REMOTE" "$BASE" "$MERGED"'—— 这会跳过三路比对逻辑,退化为双文件 diff - Mac 用户注意:如果用了完整路径,空格和转义必须精确,例如:
git config --global mergetool.smerge.cmd '/Applications/Sublime\ Merge.app/Contents/SharedSupport/bin/smerge merge "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'
trustExitCode true 是必须项,否则每次启动都弹确认框
Git 默认不信任外部合并工具能正确标记“已解决”,所以即使你在 Sublime Merge 里点完 Save and Stage 并关闭窗口,Git 仍会问你 Was the merge successful?。按 y 才继续,否则中断流程——这在批量解决多个冲突时极其打断节奏。
- 必须执行:
git config --global mergetool.smerge.trustExitCode true
- 同时建议关掉交互提示:
git config --global mergetool.keepBackup false
(避免生成.orig备份文件) - 验证是否生效:运行
git config --get mergetool.smerge.trustExitCode,输出应为true
冲突解决后别忘了 git add,Sublime Merge 不自动 stage
Sublime Merge 的 Save and Stage 按钮只是保存文件并调用 git add —— 但这个行为只在它作为独立 GUI 应用打开时有效。当它被 git mergetool 启动时,**它只负责编辑和保存 $MERGED 文件,不会执行任何 Git 命令**。也就是说,你点完保存、关掉窗口,Git 依然认为该文件处于“未解决”状态。
- 正确收尾流程:
git mergetool<br>(在 Sublime Merge 中修改 → Save → Close)<br>git add <conflicted-file><br>git commit</conflicted-file>
- 偷懒技巧:一次性 stage 所有已解决冲突:
git add .
(前提是工作区没有其他未预期变更) - 容易忽略的点:如果冲突文件是二进制(如图片、.docx),Sublime Merge 无法处理,
git mergetool会跳过它,必须手动用git checkout --ours或--theirs指定保留哪版
最常卡住的地方不是配不起来,而是配对了却在保存后忘了 git add,或者误以为 Save and Stage 在命令行触发模式下也生效。工具再顺滑,Git 的暂存区逻辑它也不会绕过去。











