如何设置和使用 Meld 作为我的 git difftool?
git difftool 使用 GUI 差异程序(即 Meld)显示差异,而不是在终端中显示差异输出。
虽然您可以使用-t <tool> / --tool=<tool> 在命令行上设置GUI 程序,但在.gitconfig 文件中配置它更有意义。 [注意:请参阅底部关于转义引号和 Windows 路径的部分。]
# Add the following to your .gitconfig file.
[diff]
tool = meld
[difftool]
prompt = false
[difftool "meld"]
cmd = meld "$LOCAL" "$REMOTE"
[注意:这些设置不会改变git diff 的行为,git diff 将继续照常运行。]
您使用git difftool 的方式与使用git diff 的方式完全相同。例如
git difftool <COMMIT_HASH> file_name
git difftool <BRANCH_NAME> file_name
git difftool <COMMIT_HASH_1> <COMMIT_HASH_2> file_name
如果配置正确,将打开一个 Meld 窗口,使用 GUI 界面显示差异。
Meld GUI 窗口窗格的顺序可以通过cmd 中$LOCAL 和$REMOTE 的顺序来控制,即哪个文件显示在左窗格中,哪个文件显示在右窗格中。如果你想要它们相反,只需像这样交换它们:
cmd = meld "$REMOTE" "$LOCAL"
最后,prompt = false 行只是停止 git 提示您是否要启动 Meld,默认情况下 git 会发出提示。
如何设置和使用 Meld 作为我的 git 合并工具?
git mergetool 允许您使用 GUI 合并程序(即 Meld)来解决合并期间发生的合并冲突。
与 difftool 一样,您可以使用 -t <tool> / --tool=<tool> 在命令行上设置 GUI 程序,但和以前一样,在您的 .gitconfig 文件中配置它更有意义。 [注意:请参阅底部关于转义引号和 Windows 路径的部分。]
# Add the following to your .gitconfig file.
[merge]
tool = meld
[mergetool "meld"]
# Choose one of these 2 lines (not both!) explained below.
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
您不要使用git mergetool 来执行实际的合并。在使用git mergetool 之前,您可以使用 git 以通常的方式执行合并。例如
git checkout master
git merge branch_name
如果存在合并冲突,git 会显示如下内容:
$ git merge branch_name
Auto-merging file_name
CONFLICT (content): Merge conflict in file_name
Automatic merge failed; fix conflicts and then commit the result.
此时file_name 将包含带有合并冲突信息的部分合并文件(即包含所有>>>>>>> 和<<<<<<< 条目的文件)。
Mergetool 现在可用于解决合并冲突。你可以很容易地开始它:
git mergetool
如果配置正确,将打开一个 Meld 窗口,显示 3 个文件。每个文件都将包含在其 GUI 界面的单独窗格中。
在上面的示例 .gitconfig 条目中,建议将 2 行作为 [mergetool "meld"] cmd 行。事实上,高级用户可以通过各种方式配置cmd 行,但这超出了本答案的范围。
此答案有 2 条替代的 cmd 行,它们之间将满足大多数用户的需求,对于希望将该工具提升到下一个复杂级别的高级用户来说,这将是一个很好的起点。
首先这里是参数的含义:
-
$LOCAL 是当前分支中的文件(例如 master)。
-
$REMOTE 是要合并的分支中的文件(例如 branch_name)。
-
$MERGED是部分合并的文件,里面有合并冲突的信息。
-
$BASE 是 $LOCAL 和 $REMOTE 的共享提交祖先,这就是说包含 $REMOTE 的分支最初创建时的文件。
我建议你使用:
[mergetool "meld"]
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
或:
[mergetool "meld"]
cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
# See 'Note On Output File' which explains --output "$MERGED".
选择是在$LOCAL 和$REMOTE 之间使用$MERGED 还是$BASE。
无论哪种方式,Meld 都会在左右窗格中显示 3 个窗格,其中 $LOCAL 和 $REMOTE 以及中间窗格中的 $MERGED 或 $BASE。
在这两种情况下,中间窗格都是您应该编辑以解决合并冲突的文件。不同之处在于您更喜欢哪个起始编辑位置; $MERGED 用于包含具有合并冲突信息的部分合并文件的文件或$BASE 用于$LOCAL 和$REMOTE 的共享提交祖先。 [由于cmd 两条线都很有用,我将它们都保存在我的.gitconfig 文件中。大多数时候我使用$MERGED 行,$BASE 行被注释掉,但如果我想使用$BASE 行,注释掉可以交换。]
关于输出文件的注意事项:不要担心--output "$MERGED" 会在cmd 中使用,无论$MERGED 还是$BASE 之前在cmd 行中使用过。 --output 选项只是告诉 Meld git 希望将冲突解决文件保存在哪个文件名中。无论您使用 $MERGED 还是 $BASE 作为起始编辑点,Meld 都会将您的冲突编辑保存在该文件中。
编辑中间窗格以解决合并冲突后,只需保存文件并关闭 Meld 窗口。 Git 将自动进行更新,当前分支(例如 master)中的文件现在将包含您在中间窗格中最终得到的任何内容。
git 将通过将.orig 附加到原始文件名来备份部分合并的文件,其中包含合并冲突信息。例如file_name.orig。在检查您对合并感到满意并运行您可能希望执行的任何测试后,可以删除 .orig 文件。
此时,您现在可以进行提交以提交更改。
如果您在 Meld 中编辑合并冲突时,希望放弃使用 Meld,则退出 Meld,而不在中间窗格中保存合并解决方案文件。 git 将回复消息file_name seems unchanged,然后询问Was the merge successful? [y/n],如果您回答n,则合并冲突解决将中止,文件将保持不变。请注意,如果您在任何时候将文件保存在 Meld 中,那么您将不会收到来自 git 的警告和提示。 [当然你可以直接删除文件,用 git 为你制作的备份 .orig 文件替换。]
如果您有超过 1 个文件存在合并冲突,那么 git 将为每个文件打开一个新的 Meld 窗口,一个接一个,直到它们全部完成。它们不会同时打开,但是当您完成对一个冲突的编辑并关闭 Meld 时,git 会打开下一个,依此类推,直到所有合并冲突都已解决。
在live 项目中使用git mergetool 之前,创建一个虚拟项目来测试它的使用是明智的。请务必在测试中使用包含空格的文件名,以防操作系统要求您转义 cmd 行中的引号,请参见下文。
转义引号字符
某些操作系统可能需要对cmd 中的引号进行转义。经验不足的用户应该记住,配置命令行应该使用包含空格的文件名进行测试,如果 cmd 行不适用于包含空格的文件名,请尝试转义引号。例如
cmd = meld \"$LOCAL\" \"$REMOTE\"
在某些情况下,可能需要更复杂的引号转义。下面的第一个 Windows 路径链接包含对每个引号进行三次转义的示例。这很无聊,但有时是必要的。例如
cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"
Windows 路径
Windows 用户可能需要在 Meld cmd 行中添加额外的配置。他们可能需要使用 meldc 的完整路径,该路径旨在从命令行在 Windows 上调用,或者他们可能需要或想要使用包装器。他们应该阅读下面链接的 StackOverflow 页面,这些页面是关于为 Windows 设置正确的 Meld cmd 行。由于我是 Linux 用户,因此我无法测试各种 Windows cmd 行,并且除了建议使用我的示例并添加 Meld 或 meldc 的完整路径或添加将程序文件夹合并到您的path。
使用 Meld 忽略尾随空格
Meld 有许多可以在 GUI 中配置的首选项。
在首选项Text Filters 选项卡中,有几个有用的过滤器可以在执行差异时忽略诸如 cmets 之类的内容。虽然有过滤器可以忽略 All whitespace 和 Leading whitespace,但没有忽略 Trailing whitespace 过滤器(这已被建议作为 Meld 邮件列表中的附加项,但在我的版本中不可用)。
忽略尾随空格通常非常有用,尤其是在协作时,并且可以使用 Meld 首选项Text Filters 选项卡中的简单正则表达式轻松手动添加。
# Use either of these regexes depending on how comprehensive you want it to be.
[ \t]*$
[ \t\r\f\v]*$
希望对大家有所帮助。