HOWTO · Git

为 Git 设置 SourceGear DiffMerge 工具

在本文中,我们将讨论配置 Git 以使用 SourceGear 的 DiffMerge 作为默认 difftool 的过程。

本页内容

配置 Git,以便调用 SourceGear 的 DiffMerge,通过图形界面查看 git difftool 的比较结果,并使用 git mergetool 处理合并结果。DiffMerge 支持三方比较,因此合并视图可以同时显示两侧文件、共同基线和结果文件。请先安装 DiffMerge,再配置系统中实际存在的可执行文件路径。

为什么在 Git 中使用 DiffMerge

Git 无需图形应用程序即可比较修订版本并准备合并输入。DiffMerge 会将这些文件一并呈现,让更改和冲突更容易查看。比较与合并命令使用的输入不同:差异比较两个版本,而合并还可以包含共同祖先,以及用于保存解决结果的目标文件。

在 Windows 上配置 DiffMerge

在 Git Bash 中,使用以下可复制的设置配置工具名称和命令。示例采用常见的安装路径;如果 sgdm.exe 位于其他位置,请相应修改。外层单引号可在存储的命令中保留内层双引号和 Git 占位符,包括路径中的空格。

本节中的代码以及显示的标签或输出仍为英文。

git config --global diff.tool diffmerge
git config --global merge.tool diffmerge
git config --global difftool.diffmerge.cmd '"C:/Program Files/SourceGear/Common/DiffMerge/sgdm.exe" "$LOCAL" "$REMOTE"'
git config --global mergetool.diffmerge.cmd '"C:/Program Files/SourceGear/Common/DiffMerge/sgdm.exe" --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"'

这些命令会更新全局 .gitconfig;如果要在当前仓库中设置值,请省略 --global。如果要直接编辑 .gitconfig,两个命令值分别是 "C:/Program Files/SourceGear/Common/DiffMerge/sgdm.exe" "$LOCAL" "$REMOTE" 和 "C:/Program Files/SourceGear/Common/DiffMerge/sgdm.exe" --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"。

DiffMerge 命令行参考说明了 --merge 模式和 --result 选项。各平台示例中的合并命令遵循该语法:先传入结果路径,再依次传入本地、基线和远程文件。

在 macOS 上配置 DiffMerge

使用 command -v diffmerge 检查可执行文件的位置。以下命令采用示例中的 /usr/local/bin/diffmerge;如果你的 Mac 上路径不同,请在两个命令值中都替换为实际路径。单引号包围的值会让内嵌引号和 Git 占位符在 .gitconfig 中保持原样。

本节中的代码以及显示的标签或输出仍为英文。

git config --global diff.tool diffmerge
git config --global merge.tool diffmerge
git config --global difftool.diffmerge.cmd '"/usr/local/bin/diffmerge" --nosplash "$LOCAL" "$REMOTE"'
git config --global mergetool.diffmerge.cmd '"/usr/local/bin/diffmerge" --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"'

在 Ubuntu 上配置 DiffMerge

使用 command -v diffmerge 检查可执行文件的位置。以下命令采用示例路径 /usr/bin/diffmerge;如果安装报告了其他路径,请在两个命令值中都替换为该路径。单引号包围的值会让内嵌引号和 Git 占位符在 .gitconfig 中保持原样。

本节中的代码以及显示的标签或输出仍为英文。

git config --global diff.tool diffmerge
git config --global merge.tool diffmerge
git config --global difftool.diffmerge.cmd '"/usr/bin/diffmerge" --nosplash "$LOCAL" "$REMOTE"'
git config --global mergetool.diffmerge.cmd '"/usr/bin/diffmerge" --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"'

只有在不希望 Git 保留备份副本时,才将 mergetool.keepBackup 设为 false;熟悉这一工作流程之前,保留备份可能会有所帮助。

运行 Git difftool 和 mergetool

配置好工具后,运行 git difftool,即可打开已更改文件的比较视图。若要比较一对指定修订版本或单个文件,请提供修订版本和路径,例如 git difftool main feature -- src/app.py。发生合并冲突时,运行 git mergetool;也可以通过路径将操作限制到单个文件,例如 git mergetool -- src/app.py。这些命令需要相关修订版本或正在进行的合并冲突;仅配置工具并不会创建比较任务。

运行以下独立示例,将配置写入临时 Git 配置文件,并读取选中的工具:

本节中的代码以及显示的标签或输出仍为英文。

config_file="$(mktemp)"
trap 'rm -f "$config_file"' EXIT
git config --file "$config_file" diff.tool diffmerge
git config --file "$config_file" --get diff.tool

示例输出中的工具名称标签 diffmerge 保持英文。

理解配置和文件参数

使用 git config --global --get diff.tool 检查生效的设置,或通过 git config --global -e 打开全局配置文件。配置项会将 DiffMerge 选为 Git 的工具,而 *.cmd 值则告诉 Git 如何启动它。请确认配置的可执行文件路径有效,并为可能包含空格的路径加上引号。

Git 会将 $LOCAL 和 $REMOTE 作为当前比较或合并操作的两侧文件传入。它们的含义取决于操作类型和涉及的修订版本,因此不能一概视为原始文件和修改后的文件。执行合并时,$BASE 表示共同祖先输入,$MERGED 表示用于保存解决结果的文件。合并命令必须按照 DiffMerge 预期的顺序传入全部四个路径。请在存储的命令中保留这些占位符,不要替换成具体文件名。为你的平台配置好工具路径、命令名称和参数顺序后,git difftool 和 git mergetool 就能分别启动 DiffMerge 执行对应任务。