sublime text 不处理 git 合并冲突,需用独立应用 sublime merge;必须正确配置 git mergetool 调用 smerge,确保命令注册到 path、参数顺序为 "$base" "$local" "$remote" -o "$merged"、启用 trustexitcode true,否则保存后 git 仍卡住。

Sublime Text 本身不处理 Git 合并冲突,真正干活的是 Sublime Merge —— 它是独立应用,不是插件,也不能用 subl 或拼错的 sublime_merge 替代。必须让 git mergetool 调起 smerge,且参数顺序、退出码配置全对,否则点完“保存”Git 还卡着不继续。
为什么 git mergetool 启动失败或静默退出
根本原因只有两个:命令没注册进 $PATH,或配置里用了错误的命令名。
-
smerge是 Sublime Merge 安装后注册的命令行工具名,Windows 默认加进系统 Path,macOS 通常软链到/usr/local/bin/smerge,Linux 必须用官方.deb/.rpm包安装——手动解压不会注册 - 配置中写
subl、sublime_text、sublime_merge(多下划线)或路径漏转义(如 macOS 上/Applications/Sublime Merge.app/...有空格却没加反斜杠),都会导致Cannot run 'smerge': No such file or directory - 验证方式很简单:终端直接输
smerge --version,有输出说明注册成功;没反应就回头检查环境变量或重装
smerge merge 的参数顺序不能错
Git 传给合并工具的四个环境变量:$BASE(共同祖先)、$LOCAL(当前分支)、$REMOTE(待合并分支)、$MERGED(要写入的目标文件),smerge merge 严格按此顺序消费。
- 正确配置命令:
git config --global mergetool.smerge.cmd 'smerge merge "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"' - 常见抄错:
'smerge "$LOCAL" "$REMOTE" "$BASE" "$MERGED"'—— 这会跳过三路比对,界面空白或崩溃 - macOS 上若用完整路径,空格必须转义:
'/Applications/Sublime\ Merge.app/Contents/SharedSupport/bin/smerge merge "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'
trustExitCode true 是必须项,不是可选
Sublime Merge 关闭窗口时返回 0 表示“已解决”,但 Git 默认不信任外部工具的退出码,所以即使你点完 Save and Stage 并关掉窗口,Git 仍会弹出 Was the merge successful? 并等你手动输 y。
- 必须执行:
git config --global mergetool.smerge.trustExitCode true - 漏配后果:批量解决多个冲突时,每个文件都要停一次、敲一次
y,完全打断流程 - 顺带一提:
git config --global merge.tool smerge也要设,否则git mergetool不知道该调谁
在 Sublime Merge 里解决冲突的实际操作要点
它不是“打开文件改两笔再保存”那么简单,三窗格逻辑和状态同步容易被忽略。
- 左侧是
$LOCAL(你的修改),右侧是$REMOTE(对方的修改),中间是结果;三角按钮点一下就整块接受某边,不是光标所在行 - 改完必须点右上角
Save and Stage(不是普通 Ctrl+S),否则 Git 不认为冲突已解决 - 如果中途切去 Sublime Text 编辑,记得回 Sublime Merge 点
Refresh同步内容,它不会自动监听文件变化 - 冲突文件多时,用
Next Conflict按钮跳转,别靠滚动找 —— 中间窗格里没高亮标记的位置,不代表没冲突
最常被跳过的其实是 trustExitCode true 和参数顺序。很多人配完能启动界面,但卡在“保存后 Git 不动”,翻日志发现全是 Hit return to continue,其实就差这一行配置。另外,别试图用 Sublime Text 插件替代 Sublime Merge 处理三路冲突 —— Diffy 只能看,不能选边合并。











