如何设置并将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 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
如果配置正确,将打开一个窗口,使用GUI界面显示差异。
所述MELD GUI窗玻璃的顺序可通过顺序进行控制$LOCAL
和$REMOTE
在cmd
,即哪个文件在右窗格中的左窗格和其被示出。如果您想要它们的另一种方法,只需像这样交换它们:
cmd = meld "$REMOTE" "$LOCAL"
最后,该prompt = false
行仅阻止git提示您是否要启动Meld,默认情况下git将发出提示。
如何设置并将Meld用作git mergetool?
git mergetool允许您使用GUI合并程序(即Meld)解决合并期间发生的合并冲突。
像difftool一样,您可以在命令行上使用来设置GUI程序,-t <tool> / --tool=<tool>
但是像以前一样,在.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
如果配置正确,“混合”窗口将打开,显示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".
选择是使用$MERGED
还是$BASE
在$LOCAL
和之间$REMOTE
。
无论哪种方式合并将显示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都会将冲突编辑内容保存在该文件中。
编辑中间窗格以解决合并冲突后,只需保存文件并关闭“合并”窗口即可。Git将自动进行更新,并且当前分支(例如master)中的文件现在将包含您在中间窗格中最终得到的内容。
git会通过附加.orig
到原始文件名来备份其中包含合并冲突信息的部分合并的文件。例如file_name.orig
。在确认您对合并感到满意并运行了您可能希望执行的所有测试之后,.orig
可以删除该文件。
此时,您现在可以进行提交以提交更改。
如果在编辑“合并”中的合并冲突时希望放弃使用“合并”,则退出“合并”而不在中间窗格中保存合并解析文件。git会响应该消息file_name seems unchanged
,然后询问Was the merge successful? [y/n]
,如果您回答,n
则合并冲突解决方案将被中止,文件将保持不变。请注意,如果您随时将文件保存在Meld中,则不会收到git的警告和提示。[当然,您可以删除该文件,然后将其替换为.orig
git为您制作的备份文件。]
如果您有多个合并冲突的文件,则git将为每个文件打开一个新的“合并”窗口,一个接一个,直到它们全部完成为止。它们不会在同一时间全部打开,但是当您完成一个中的冲突编辑并关闭Meld时,git将打开下一个冲突,依此类推,直到解决了所有合并冲突。
git mergetool
在实际项目中使用虚拟项目之前,先创建一个虚拟项目以测试其使用是明智的。如果您的操作系统要求您转义该cmd
行中的引号,请确保在测试中使用包含空格的文件名,请参见下文。
转义引号字符
某些操作系统可能需要将引号cmd
转义。经验不足的用户应记住,应该使用包含空格的文件名来测试config命令行,如果命令行cmd
不适用于包含空格的文件名,请尝试转义引号。例如
cmd = meld \"$LOCAL\" \"$REMOTE\"
在某些情况下,可能需要更复杂的引号转义。下面的Windows路径链接的第1个包含一个对每个引号进行三次转义的示例。这很无聊,但有时是必要的。例如
cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"
Windows路径
Windows用户可能需要将其他配置添加到“熔断cmd
线”中。他们可能需要使用的完整路径meldc
,该路径旨在在Windows上从命令行调用,或者他们可能需要或想要使用包装器。他们应该阅读下面链接的StackOverflow页面,这些页面是关于cmd
为Windows 设置正确的Meld 行。由于我是Linux用户,因此我无法测试各种Windows cmd
系统,除了建议使用我的示例并添加完整的Meld路径meldc
或将Meld程序文件夹添加到您的Windows之外,无法进一步了解该主题path
。
使用Meld忽略尾随空格
Meld具有许多可在GUI中配置的首选项。
在首Text Filters
选项选项卡中,有几个有用的过滤器可以在执行差异时忽略诸如注释之类的内容。尽管有可以忽略All whitespace
和的过滤器Leading whitespace
,但没有忽略Trailing whitespace
过滤器(在“合并邮件”列表中建议添加此过滤器,但在我的版本中不可用)。
忽略尾随空格通常非常有用,尤其是在协作时,并且可以在“合并首Text Filters
选项”选项卡中使用简单的正则表达式轻松手动添加。
# Use either of these regexes depending on how comprehensive you want it to be.
[ \t]*$
[ \t\r\f\v]*$
希望对大家有帮助。