如何设置和使用Meld作为我的git diff工具?
git difftool可以使用GUI差异程序(如Meld),而不是在终端中显示差异输出。
尽管你可以使用-t <tool> / --tool=<tool>
命令行设置GUI程序,但最好在.gitconfig
文件中进行配置。[注意:请见底部有关转义引号和Windows路径的部分。]
[diff]
tool = meld
[difftool]
prompt = false
[difftool "meld"]
cmd = meld "$LOCAL" "$REMOTE"
[注意: 这些设置不会改变git diff
的行为,它仍然像往常一样运行。]
您可以像使用 git diff
一样使用 git difftool
。例如:
git difftool <COMMIT_HASH> file_name
git difftool <BRANCH_NAME> file_name
git difftool <COMMIT_HASH_1> <COMMIT_HASH_2> file_name
如果正确配置,Meld窗口将打开并显示差异,使用GUI界面。可以通过
cmd
中
$LOCAL
和
$REMOTE
的顺序来控制Meld GUI窗口窗格的顺序,也就是说,左窗格显示哪个文件,右窗格显示哪个文件。如果你想要它们反过来,只需像这样交换它们的位置:
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
这时,file_name
包含了部分合并的文件和冲突信息(即该文件中包含所有的 >>>>>>>
和 <<<<<<<
条目)。
现在可以使用合并工具来解决合并冲突。您可以很容易地启动它:
git mergetool
如果正确配置,则会打开一个Meld窗口,显示3个文件。每个文件都将包含在其GUI界面的单独窗格中。
在上面的示例.gitconfig条目中,建议使用2行作为[mergetool "meld"] cmd行。实际上,高级用户可以以各种方式配置cmd行,但这超出了本答案的范围。
此答案有两个备选的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"
选择在
$LOCAL
和
$REMOTE
之间使用
$MERGED
或
$BASE
。任何一种方式,Meld都会显示3个面板,左右面板分别为
$LOCAL
和
$REMOTE
,中间面板为
$MERGED
或
$BASE
。
无论哪种情况,中间面板都是您应该编辑以解决合并冲突的文件。区别只在于您更喜欢哪个起始编辑位置;如果要使用包含部分合并文件和合并冲突信息的文件,则使用$MERGED
,如果要使用$LOCAL
和$REMOTE
的共享提交祖先,则使用$BASE
。 [由于这两个cmd
行都有用,我将它们都保留在我的.gitconfig
文件中。大多数时候,我使用$MERGED
行,$BASE
行被注释掉,但是注释可以交换,如果我想使用$BASE
线。]
关于输出文件的说明:不要担心--output "$MERGED"
在cmd
中是否被使用,无论之前在cmd
行中使用了$MERGED
还是$BASE
,--output
选项只是告诉Meld git想要保存冲突解析文件的文件名。 Meld将在该文件中保存您的冲突编辑,无论您使用$MERGED
还是$BASE
作为起始编辑点。
在编辑中间面板以解决合并冲突后,只需保存文件并关闭Meld窗口即可。 Git会自动更新,当前分支(例如主分支)中的文件现在将包含您在中间面板中最终得到的内容。
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文件替换它。]
如果您有多个具有合并冲突的文件,则git将为每个文件打开一个新的Meld窗口,直到所有文件都处理完毕。它们不会同时打开,但是当您完成编辑其中一个文件中的冲突并关闭Meld时,git将打开下一个文件,以此类推,直到解决所有合并冲突。
在使用git mergetool之前,最好创建一个虚拟项目进行测试。请确保在测试中使用包含空格的文件名,以防您的操作系统需要转义
cmd
行中的引号,请参见下文。
转义引号字符
某些操作系统可能需要转义
cmd
中的引号。较不熟练的用户应记住,配置命令行应使用包含空格的文件名进行测试,如果
cmd
行在包含空格的文件名中无法正常工作,则尝试转义引号。例如:
cmd = meld \"$LOCAL\" \"$REMOTE\"
在某些情况下,可能需要更复杂的引号转义。下面的Windows路径链接中的第一个包含了每个引号三次转义的示例。这很繁琐,但有时是必要的。例如:
cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"
Windows路径
Windows用户可能需要在Meld cmd
命令行中添加额外的配置。他们可能需要使用完整路径调用meldc
,这是设计为从Windows命令行调用的,或者他们可能需要或想要使用一个包装器。他们应该阅读下面链接的关于为Windows设置正确的Meld cmd
行的StackOverflow页面。由于我是Linux用户,无法测试各种Windows cmd
行,并且对此问题没有进一步的信息,除了建议使用我的示例并添加Meld或meldc
的完整路径,或将Meld程序文件夹添加到您的path
中。
忽略Meld中的尾随空格
Meld有许多可以在GUI中配置的首选项。
在首选项的文本过滤器
选项卡中,有几个有用的过滤器可以在执行差异时忽略诸如注释之类的内容。虽然有过滤器可以忽略所有空格
和前导空格
,但没有忽略尾随空格
的过滤器(这已经被建议添加到Meld邮件列表中,但在我的版本中不可用)。
忽略尾随空格通常非常有用,特别是在协作时,可以在Meld首选项的文本过滤器
选项卡中轻松手动添加一个简单的正则表达式。
# Use either of these regexes depending on how comprehensive you want it to be.
[ \t]*$
[ \t\r\f\v]*$