Git worktree 是 Git 2.5 起内置的核心功能,允许多个目录同时检出同一仓库的不同分支,共享 .git 数据库但文件互不干扰,实现真正多分支并行开发。

git config --local 是分支级配置的唯一有效方式
Git 本身不支持“按分支设置 diff 工具”,所谓“特定分支上配置”实际是利用工作目录的局部配置能力——只有 git config --local 写入当前仓库 .git/config 文件时,才可能让该配置在切换到某分支后“生效”。但注意:它不是绑定分支的,而是绑定整个仓库的。真正能实现“分支差异化 diff”的唯一路径,是配合 Git 的 worktree 或手动切换 .git/config 中的 [diff] 段落。
- 执行
git config --local diff.tool vimdiff只影响当前仓库,与当前所在分支无关 - 若你在
feature/login分支下运行该命令,再切到main,diff 工具仍是vimdiff - 想让不同分支用不同工具,必须在切换分支时同步改写
.git/config的[diff]块,或使用git worktree隔离配置
用 git worktree 实现真正的分支隔离 diff 配置
如果你确实需要 feature/a 用 meld、main 用 vscode,最可靠的方式是为每个分支开独立工作树,并在各自目录里设 --local 配置:
- 先创建分支工作树:
git worktree add -b feature/a ../myrepo-feature-a feature/a - 进入新目录:
cd ../myrepo-feature-a - 设置该分支专用 diff 工具:
git config --local diff.tool meld,再配好diff.meld.cmd - 同理,为
main开另一个 worktree,里面设diff.tool=code和对应命令
这样每个 worktree 有独立的 .git/config,自然互不干扰。注意:worktree 共享 .git/objects,但 config、hooks、reflog 等是隔离的。
diff.tool 和 difftool --no-index 的行为差异容易混淆
很多人以为设了 diff.tool 就能自动触发图形比对,结果 git diff 还是走终端输出——这是因为 diff.tool 只被 git difftool 调用,git diff 默认永远走文本模式。
CNB 云原生构建平台的 Git 操作技能,支持代码克隆、提交、推送、分支管理、Merge Request 管理、流水线触发与结果读取。初次使用需收集用户的 Git 用户名和邮箱。
-
git diff:只输出文本,无视diff.tool -
git difftool:读取diff.tool并启动对应程序(需提前配好diff.<tool>.cmd) -
git difftool --no-index a.txt b.txt:绕过 Git 索引,直接比两个文件,此时也依赖diff.tool配置
常见坑:只配了 diff.tool 却没配 diff.meld.cmd,运行 git difftool 会报错 error: cannot run meld: No such file or directory。
Windows 下 vscode 的 diff 命令要加 --wait 参数
在 Windows 上用 VS Code 作 diff.tool,不加 --wait 会导致 git difftool 立即返回、窗口闪退。正确配置如下:
git config --local diff.tool code git config --local difftool.code.cmd 'code --wait --diff $LOCAL $REMOTE'
注意三点:
-
$LOCAL和$REMOTE是 Git 内置变量,不能写成$1 $2或其他形式 -
--wait必须存在,否则 Git 认为比对完成,立刻清理临时文件,VS Code 就打不开内容 - 如果用的是 Insiders 版本,命令名可能是
code-insiders,需同步调整
跨平台脚本里别硬编码路径,Git 会自动在 $PATH 中查找 code;也不建议用绝对路径如 C:\Users\xxx\AppData\Local\Programs\Microsoft VS Code\Code.exe,维护成本高且易失效。

















