当我键入gitdiff时,我想用我选择的可视化diff工具(Windows上的SourceGear“diffmerge”)查看输出。如何配置git以执行此操作?


当前回答

在查看了其他一些外部差异工具后,我发现IntelliJ IDEA(和Android Studio)中的差异视图是我最喜欢的。

步骤1-设置IntelliJ IDEA以从命令行运行

如果要使用IntelliJ IDEA作为差异工具,应首先设置IntelliJ IDEA,以便按照以下说明从命令行运行:

在macOS或UNIX上:

确保IntelliJ IDEA正在运行。在主菜单上,选择“工具”|“创建命令行启动器”。将打开“创建启动器脚本”对话框,其中包含启动器脚本的建议路径和名称。您可以接受默认值,也可以指定自己的路径。注意它,因为你稍后会需要它。在IntelliJ IDEA之外,将启动器脚本的路径和名称添加到路径中。

在Windows上:

在Path系统环境变量中指定IntelliJ IDEA可执行文件的位置。在这种情况下,您将能够从任何目录调用IntelliJ IDEA可执行文件和其他IntelliJ IDEA命令。

步骤2-配置git以使用IntelliJ IDEA作为difftool

遵循此博客文章的说明:

Bash

export INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
PATH=$IDEA_HOME $PATH

Fish

set INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
set PATH $INTELLIJ_HOME $PATH

现在将以下内容添加到git配置中:

[merge]
   tool = intellij
[mergetool "intellij"]
   cmd = idea merge $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE") $(cd $(dirname "$BASE") && pwd)/$(basename "$BASE") $(cd $(dirname "$MERGED") && pwd)/$(basename "$MERGED")
   trustExitCode = true
[diff]
   tool = intellij
[difftool "intellij"]
   cmd = idea diff $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE")

您可以使用gitdifftool或gitdifftoolHEAD~1进行测试

其他回答

在查看了其他一些外部差异工具后,我发现IntelliJ IDEA(和Android Studio)中的差异视图是我最喜欢的。

步骤1-设置IntelliJ IDEA以从命令行运行

如果要使用IntelliJ IDEA作为差异工具,应首先设置IntelliJ IDEA,以便按照以下说明从命令行运行:

在macOS或UNIX上:

确保IntelliJ IDEA正在运行。在主菜单上,选择“工具”|“创建命令行启动器”。将打开“创建启动器脚本”对话框,其中包含启动器脚本的建议路径和名称。您可以接受默认值,也可以指定自己的路径。注意它,因为你稍后会需要它。在IntelliJ IDEA之外,将启动器脚本的路径和名称添加到路径中。

在Windows上:

在Path系统环境变量中指定IntelliJ IDEA可执行文件的位置。在这种情况下,您将能够从任何目录调用IntelliJ IDEA可执行文件和其他IntelliJ IDEA命令。

步骤2-配置git以使用IntelliJ IDEA作为difftool

遵循此博客文章的说明:

Bash

export INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
PATH=$IDEA_HOME $PATH

Fish

set INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
set PATH $INTELLIJ_HOME $PATH

现在将以下内容添加到git配置中:

[merge]
   tool = intellij
[mergetool "intellij"]
   cmd = idea merge $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE") $(cd $(dirname "$BASE") && pwd)/$(basename "$BASE") $(cd $(dirname "$MERGED") && pwd)/$(basename "$MERGED")
   trustExitCode = true
[diff]
   tool = intellij
[difftool "intellij"]
   cmd = idea diff $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE")

您可以使用gitdifftool或gitdifftoolHEAD~1进行测试

对于如何在1.6.3之前的Git版本上配置diff工具的Linux版本(1.6.3向Git添加了difftool),这是一个非常简洁的教程。

简而言之:

步骤1:将其添加到.gitconfig中

[diff]
  external = git_diff_wrapper
[pager]
  diff =

步骤2:创建一个名为git_diff_wrapper的文件,将其放在$PATH中的某个位置

#!/bin/sh

vimdiff "$2" "$5"

这是一个适用于Windows的批处理文件-假设DiffMerge安装在默认位置,处理x64,根据需要处理前向反斜杠替换,并能够自行安装。应该很容易用你喜欢的diff程序替换DiffMerge。

要安装:

gitvdiff --install 

gitvdiff.bat:

@echo off

REM ---- Install? ----
REM To install, run gitvdiff --install

if %1==--install goto install



REM ---- Find DiffMerge ----

if DEFINED ProgramFiles^(x86^) (
    Set DIFF="%ProgramFiles(x86)%\SourceGear\DiffMerge\DiffMerge.exe"
) else (
    Set DIFF="%ProgramFiles%\SourceGear\DiffMerge\DiffMerge.exe"
)



REM ---- Switch forward slashes to back slashes ----

set oldW=%2
set oldW=%oldW:/=\%
set newW=%5
set newW=%newW:/=\%


REM ---- Launch DiffMerge ----

%DIFF% /title1="Old Version" %oldW% /title2="New Version" %newW%

goto :EOF



REM ---- Install ----
:install
set selfL=%~dpnx0
set selfL=%selfL:\=/%
@echo on
git config --global diff.external %selfL%
@echo off


:EOF

如果你恰好已经有一个与文件类型相关的diff工具(比如,因为你安装了TortoiseSVN,它附带了一个diff查看器),你可以将常规的git diff输出通过管道发送到一个“temp”文件,然后直接打开该文件,而无需了解查看器:

git diff > "~/temp.diff" && start "~/temp.diff"

将其设置为全局别名效果更好:gitwhat

[alias]
    what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f"

你可以使用gitdifftool。

例如,如果您有Meld,可以通过以下方式编辑分支master和devel:

git config --global diff.external meld
git difftool master..devel