gitgutter仅标记冲突不解决冲突,真正解冲突需用sublime merge等支持三方视图的工具,或通过git merge -x theirs自动覆盖、手动编辑后git add并commit。

GitGutter 只能标冲突,不能解冲突
GitGutter 是 Sublime Text 的一个状态提示插件,它会在编辑器左侧显示 Git 状态图标(如 +、-、→),也能高亮标出冲突标记区域( 和 <code>>>>>>> 之间的块)。但它**不提供任何合并逻辑、不传入 $BASE/$LOCAL/$REMOTE 参数、也不支持三方视图**。你看到的只是文件里已存在的冲突标记,和用记事本打开没区别。
常见错误现象:
- 点 GitGutter 菜单里的 “Resolve Conflict” —— 实际什么都没发生,或直接报错 “command not found”
- 以为开启 GitGutter 后右键就能弹出合并面板 —— 它压根不集成 mergetool 协议
- 在多仓库项目里,GitGutter 只对当前文件所在路径下最近的
.git生效;如果项目结构是monorepo/packages/foo/,而.git在顶层,它大概率找不到仓库,连图标都不显示
Sublime Merge 才是真正能解冲突的工具
Sublime Merge 是独立应用,不是 Sublime Text 插件。它原生支持 Git 的 mergetool 协议,能接收 $BASE、$LOCAL、$REMOTE、$MERGED 四个路径参数,把三方内容分栏展示。配置正确后,git mergetool 命令才会唤起它的窗口,而不是 fallback 到 vim。
关键配置项(顺序不能错):
git config --global merge.tool sublime_merge-
git config --global mergetool.sublime_merge.cmd 'subl --wait "$MERGED"'(macOS/Linux)或'smerge merge "$BASE" "$LOCAL" "$REMOTE" "$MERGED" --wait'(Windows) git config --global mergetool.trustPrompt false
验证是否生效:终端运行 git mergetool,立刻弹窗才算通。若弹出 vim,说明 subl 或 smerge 命令不可达(检查 PATH 或安装路径是否含空格未转义)。
解决完必须手动 git add,否则 Git 不认
Sublime Merge 保存文件只是写回磁盘,Git 不会自动感知。它只把 $MERGED 写回去,但不会执行 git add。很多人关掉窗口就以为搞定了,结果 git status 里文件还在 Unmerged paths 下,状态仍是 both modified。
必须做两件事:
- 在 Sublime Merge 中按
Cmd+S(macOS)或Ctrl+S(Windows/Linux)保存 - 回到终端,明确运行
git add <filename></filename>(不能用git add .,避免误提临时文件) - 再运行
git commit或git merge --continue
漏掉 git add 是最常被忽略的一步,也是为什么“明明改好了还一直报 conflict”的根本原因。
git merge -X theirs 适合无脑覆盖场景
如果你清楚知道:这次合并里,所有冲突都该用对方分支的代码,自己本地改的全不要 —— 那根本不用开任何工具。直接在 merge 命令里加 -X theirs 参数:
git merge feature/login -X theirs
它会让 Git 自动跳过冲突提示,遇到冲突时直接选 theirs 版本(即 feature/login 分支的内容),然后自动生成合并提交。注意:--theirs 是 checkout 用的,-X theirs 才是 merge 用的,别混。
适用场景:
- 你正在 rebase 到 main,但只想保留 main 上的所有修改
- 团队约定 feature 分支永远权威,dev 分支只做临时调试
- CI 流水线里需要自动化处理某些低风险合并
不适用场景:逻辑有交叉、需人工判断哪段该留哪段该删——这时候还是得靠 Sublime Merge 的三方视图。











