如何使用我喜欢的差异工具/查看器查看“git diff”输出?

Posted

技术标签:

【中文标题】如何使用我喜欢的差异工具/查看器查看“git diff”输出?【英文标题】:How do I view 'git diff' output with my preferred diff tool/ viewer? 【发布时间】:2010-09-20 06:58:58 【问题描述】:

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

【问题讨论】:

您可以在所有较新版本的 git 中使用“git difftool”而不是“git diff”。这将打开一个视觉差异程序。 关于新的脚本difftool,我在下面添加了一个答案:***.com/questions/255202/… gitx - gitx.frim.nl。纳夫说。 简要教程在这里:nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy 转到您在 Git Bash 中的存储库。输入git config diff.tool winmerge。通过键入git difftool 验证它是否有效。摆脱输入git config --global difftool.prompt false 的提示。我推荐 p4merge 而不是 winmerge。 【参考方案1】:

从 Git1.6.3 开始,您可以使用 git difftool 脚本:参见my answer below。


也许这个article 会帮助你。以下是最好的部分:

有两种不同的方法可以指定外部差异工具。

第一个是您使用的方法,通过设置 GIT_EXTERNAL_DIFF 变量。但是,该变量应该指向可执行文件的完整路径。此外,由 GIT_EXTERNAL_DIFF 指定的可执行文件将使用一组固定的 7 个参数调用:

path old-file old-hex old-mode new-file new-hex new-mode

由于大多数 diff 工具需要不同的参数顺序(并且只需要一些),因此您很可能必须指定一个包装脚本,而该脚本又会调用真正的 diff 工具。

我更喜欢的第二种方法是通过“git”配置外部差异工具 config"。这是我所做的:

1) 创建一个包含类似内容的包装脚本“git-diff-wrapper.sh”

-->8-(snip)--
#!/bin/sh

# diff is called by git with 7 parameters:
# path old-file old-hex old-mode new-file new-hex new-mode

"<path_to_diff_executable>" "$2" "$5" | cat
--8<-(snap)--

如您所见,只有第二个(“旧文件”)和第五个(“新文件”)参数是 传递给差异工具。

2) 类型

$ git config --global diff.external <path_to_wrapper_script>

在命令提示符处,替换为“git-diff-wrapper.sh”的路径,这样你的 ~/.gitconfig 包含

-->8-(snip)--
[diff]
    external = <path_to_wrapper_script>
--8<-(snap)--

确保使用正确的语法来指定包装脚本和差异的路径 工具,即使用正斜杠而不是反斜杠。就我而言,我有

[diff]
    external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"

在 .gitconfig 和

"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat

在包装脚本中。注意尾随的“猫”!

(我想'| cat' 仅适用于某些可能无法返回正确或一致的返回状态的程序。如果您的差异工具具有明确的返回状态,您可能想尝试不使用尾随猫)

(Diomidis Spinellis 添加in the comments:

cat 命令是必需的,因为如果文件不同,diff(1) 默认会以错误代码退出。 Git 期望外部差异程序仅在发生实际错误时以错误代码退出,例如如果内存不足。 通过将git 的输出传送到cat,非零错误代码被屏蔽。 更有效的是,程序可以运行 exit,参数为 0。)


那(上面引用的文章)是外部工具的理论通过配置文件定义(不是通过环境变量)。 实际使用中(还是外部工具的配置文件定义),可以参考:

How do I setup DiffMerge with msysgit / gitk? 说明了 MsysGit 和 gitk 的 DiffMerge 和 WinMerge 的具体设置 How can I set up an editor to work with Git on Windows? 将 Notepad++ 定义为外部编辑器。

【讨论】:

啊,我设置了外部差异程序,但不知道 7 个参数,谢谢。 荣誉...这非常方便。我使用“opendiff”进行设置(在 Mac OS X 下启动光滑的 XCode FileMerge 实用程序)。 @Ryan:太好了 :) 您是否使用了此答案中详述的“diff.external”设置或下面我的第二个答案的“git difftool”? 太棒了!谢谢,尝试了 DiffMerge 和 opendiff;两者都工作得很好。 那么 git 将 7 个参数发送到 diff 程序?我对 Git 了解得越多,我就越觉得它是为一个人设计的:最初的程序员。这个 dvcs 看起来更像是一个没什么作用的闪亮玩具。【参考方案2】:

简介

作为参考,我想在VonC's answer 中加入我的变体。请记住,我使用的是 MSys 版本的 Git(此时为 1.6.0.2)并修改了 PATH,并从 PowerShell(或 cmd.exe)而不是 Bash shell 运行 Git。

我引入了一个新命令,gitdiff。运行此命令会临时重定向 git diff 以使用您选择的可视差异程序(与 VonC 永久执行此操作的解决方案相反)。这让我可以同时拥有默认的 Git 差异功能 (git diff) 和视觉差异功能 (gitdiff)。两个命令都采用相同的参数,例如,您可以键入以直观方式区分特定文件中的更改

gitdiff path/file.txt

设置

请注意,$GitInstall 用作 Git 安装目录的占位符。

    创建一个新文件,$GitInstall\cmd\gitdiff.cmd

     @echo off
     setlocal
     for /F "delims=" %%I in ("%~dp0..") do @set path=%%~fI\bin;%%~fI\mingw\bin;%PATH%
     if "%HOME%"=="" @set HOME=%USERPROFILE%
     set GIT_EXTERNAL_DIFF=git-diff-visual.cmd
     set GIT_PAGER=cat
     git diff %*
     endlocal
    

    创建一个新文件 $GitInstall\bin\git-diff-visual.cmd(将 [visual_diff_exe] 占位符替换为您选择的差异程序的完整路径)

     @echo off
     rem diff is called by git with 7 parameters:
     rem path old-file old-hex old-mode new-file new-hex new-mode
     echo Diffing "%5"
     "[visual_diff_exe]" "%2" "%5"
     exit 0
    

    你现在完成了。从 Git 存储库中运行 gitdiff 现在应该为每个更改的文件调用您的可视差异程序。

【讨论】:

【参考方案3】:

Windows/MSYSGit解决方案

阅读答案后,我发现了一种更简单的方法,只需更改一个文件。

    使用参数 2 和 5 创建一个批处理文件来调用您的 diff 程序。该文件必须在您的路径中的某个位置。 (如果您不知道它在哪里,请将其放在 C:\windows 中。)调用它,例如“gitdiff.bat”。我的是:

    @echo off
    REM This is gitdiff.bat
    "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
    

    将环境变量设置为指向您的批处理文件。例如:GIT_EXTERNAL_DIFF=gitdiff.bat。或者通过 PowerShell 输入 git config --global diff.external gitdiff.bat

    重要的是不要使用引号或指定任何路径信息,否则它将不起作用。这就是为什么 gitdiff.bat 必须在你的路径中。

现在,当您键入“git diff”时,它将调用您的外部差异查看器。

【讨论】:

+1(如果可以的话,+10。)这确实是最简单的解决方案。我为接受的答案挣扎了几个小时,最后放弃了(我的一些问题可能与通过 PowerShell 运行 Git 相关......)但是,我使用了 git config --global diff.external winmerge.cmd,而不是设置 GIT_EXTERNAL_DIFF 环境变量,并且它效果同样好。 此解决方案的几个问题: 1. 不适用于新文件。 WinMerge 要求我输入第二个文件进行比较。 2. 比较下一个文件的窗口只有在你关闭当前的 WinMerge 窗口后才会打开,无法同时查看所有文件。【参考方案4】:

这是一个适用于 Windows 的批处理文件 - 假设 DiffMerge 安装在默认位置,处理 x64,根据需要处理正向和反斜杠替换,并且能够自行安装。用你最喜欢的差异程序替换 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

【讨论】:

很棒的脚本,它省去了我查找 DiffMerge 命令的麻烦。您可能想修改安装行以使用引号 - 我的机器出现问题:“%1”=="--install"。【参考方案5】:

从 Git 版本 1.6.3 开始,您可以配置“git difftool”以使用您最喜欢的图形差异工具。

当前支持(在撰写此答案时)开箱即用的是 KDiff3、Kompare、tkdiff、Meld、xxdiff、emerge、vimdiff、gvimdiff , ecmerge, Diffuseopendiff;如果您要使用的工具不在此列表中,您可以随时使用“difftool.&lt;tool&gt;.cmd”配置选项。

“git difftool”接受与“git diff”相同的选项。

【讨论】:

Araxis Merge 也已配置。 araxis.com/merge/scm_integration.html 用法示例:git difftool -t kdiff3 HEAD【参考方案6】:

完成上面我之前的"diff.external" config answer:

作为mentioned by Jakub,Git1.6.3引入git difftool,最初于2008年9月提出:

用法='[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]' (请参阅本答案最后部分的--extcmd

$LOCAL 包含起始修订版中的文件内容,$REMOTE 包含结束修订版中文件的内容。$BASE 包含工作中文件的内容

基本上是git-mergetool修改为对git index/worktree进行操作。

此脚本的常见用例是当您有暂存或未暂存的更改并且您希望在并排差异查看器中查看更改(例如xxdifftkdiff 等)。

git difftool [<filename>*]

另一个用例是当您希望看到相同的信息但正在比较任意提交时(这是 revarg 解析可能更好的部分)

git difftool --start=HEAD^ --end=HEAD [-- <filename>*]

最后一个用例是当您想将当前工作树与 HEAD 以外的其他内容(例如标签)进行比较时

git difftool --commit=v1.0.0 [-- <filename>*]

注意:由于 Git 2.5,git config diff.tool winmerge 就足够了! 见“git mergetool winmerge”

而since Git 1.7.11,您可以选择--dir-diff,以便在填充两个临时目录后生成可以一次比较两个目录层次结构的外部差异工具,而不是每次运行外部工具的一个实例一个文件对。


在 Git 2.5 之前:

使用自定义差异工具配置difftool 的实际案例:

C:\myGitRepo>git config --global diff.tool winmerge
C:\myGitRepo>git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --global difftool.prompt false

将 winmerge.sh 存储在 PATH 的目录部分中:

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files/WinMerge/WinMergeU.exe" -u -e "$1" "$2" -dl "Local" -dr "Remote"

如果您有其他工具(kdiff3、P4Diff、...),请创建另一个 shell 脚本和相应的 difftool.myDiffTool.cmd 配置指令。 然后您可以使用diff.tool 配置轻松切换工具。

您也有此blog entry by Dave 以添加其他详细信息。 (或this question 用于winmergeu 选项)

此设置的兴趣在于 winmerge.shscript:您可以自定义它以考虑特殊情况。

例如,请参阅David Marble 的answer below 以了解处理以下问题的示例:

源或目标文件 已删除源或目标中的文件

正如Kem Mason 在his answer 中提到的,您还可以使用--extcmd 选项避免任何包装器

--extcmd=<command>

指定用于查看差异的自定义命令。 git-difftool 忽略配置的默认值并在指定此选项时运行 $command $LOCAL $REMOTE

例如,gitk is able to run/use any diff tool 是这样的。

【讨论】:

我不得不为 $LOCAL 和 $REMOTE 转义 $,以防止它们变成 "" 和 ""。我会编辑说 git config --globla difftool.winmerge.cmd "winmerge.sh \"\$LOCAL\" \"\$REMOTE\"" 另外,你知道如何让 -s 选项(在一个 winmerge 窗口中打开多个差异)在这个方案中工作吗? @Carlos:弗兰克(见上面的评论)想让你看看***.com/questions/1220309/…(在一个winmerge窗口中打开几个差异) --start=--end= 选项在 v1.7.11 中无法识别 @SteveChambers 是的,我在***.com/a/10879804/6309 中提到过。我会编辑这个答案。【参考方案7】:

使用新的 git difftool,只需将其添加到您的 .gitconfig 文件中即可:

[diff]
    tool = any-name
[difftool "any-name"]
    cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""

还可以添加:

[difftool]
    prompt = false

Also check out diffall,我编写的一个简单脚本,用于扩展令人讨厌的 (IMO) 默认差异行为,即以串行方式打开每个。

Windows 上的全局 .gitconfig 位于 %USERPROFILE%\.gitconfig

【讨论】:

什么是$local,什么是$remote? +1 表示不需要包装脚本的方法 @CJohnson:分别是原始文件的路径和编辑文件的路径。 如果博客链接失效,这里是链接的 SO 答案:***.com/a/1291578/321973 @CJohnson:$LOCAL 始终是最新的提交。但是 $REMOTE 并不一致。在查看本地沙箱中的更改时,它是当前/已编辑的文件,但是当比较历史提交时,它是 parent 提交。普通差异的 IOW $LOCAL = old 和 $REMOTE = new。对于历史,$LOCAL = 较新,$REMOTE = 较旧。【参考方案8】:

关于如何在 1.6.3 之前的 Git 版本上配置差异工具的 Linux 版本(1.6.3 将差异工具添加到 Git),this 是一个很棒的简明教程。

简而言之:

第 1 步:将其添加到您的 .gitconfig 中

[diff]
  external = git_diff_wrapper
[pager]
  diff =

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

#!/bin/sh

vimdiff "$2" "$5"

【讨论】:

【参考方案9】:

我在 Ubuntu 上使用 Kompare:

sudo apt-get install kompare

比较两个分支:

git difftool -t kompare <my_branch> master

【讨论】:

【参考方案10】:

试试这个解决方案:

$ meld my_project_using_git

Meld 了解 Git 并提供对最近更改的导航。

【讨论】:

太好了,输入meld . 比输入git difftool 容易得多,并且必须按顺序查看更改的文件。而且它更接近于 Mercurial 的 hg vdiff 插件。 另外,meld . 也适用于 Mercurial 和 Subversion 项目,以防有人好奇。 嗯,当我这样做时,会显示已修改文件的列表。当我单击其中一个或进行“比较”时,它会在单独的选项卡中单独打开。如何获得差异? @misiu_mp,我刚试过,点击修改后的文件,显示差异(旧文件和修改后的文件)。 这是在哪个版本添加的?它似乎不适用于融合版本1.1.5【参考方案11】:

如果您通过Cygwin 执行此操作,您可能需要使用cygpath

$ git config difftool.bc3.cmd "git-diff-bcomp-wrapper.sh \$LOCAL \$REMOTE"
$ cat git-diff-bcomp-wrapper.sh
#!/bin/sh
"c:/Program Files (x86)/Beyond Compare 3/BComp.exe" `cygpath -w $1` `cygpath -w $2`

【讨论】:

由于某种原因,使用“bc3”不再适合我,但如果我使用“beyond”代替,那很好。【参考方案12】:

您可能想试试xd,它是 Git/SVN diff 的 GUI 包装器。它本身不是差异工具。

当你想运行git diffsvn diff时运行xd,它会显示一个文件列表,一个预览窗口,你可以启动任何你喜欢的差异工具,包括tkdiff,xxdiff,gvimdiff, Emacs (ediff)、XEmacs (ediff)、Meld、Diffuse、Kompare 和 KDiff3。您还可以运行任何自定义工具。

很遗憾,该工具不支持 Windows。

披露:我是这个工具的作者。

【讨论】:

【参考方案13】:

在VonC's answer 的基础上处理文件删除和添加,使用以下命令和脚本:

git config --global diff.tool winmerge
git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\" \"$BASE\""
git config --global difftool.prompt false

这和把它放在你的全局文件中是一样的.gitconfig

[diff]
    tool = winmerge
[difftool "winmerge"]
    cmd = winmerge.bat "$LOCAL" "$REMOTE" "$BASE"
[difftool]
    prompt = false

然后将以下内容放入文件 winmerge.sh 中,该文件必须在您的路径中:

#!/bin/sh
NULL="/dev/null"
if [ "$2" = "$NULL" ] ; then
    echo "removed: $3"
elif [ "$1" = "$NULL" ] ; then
    echo "added: $3"
else
    echo "changed: $3"
    "C:/Program Files (x86)/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$1" "$2"
fi

【讨论】:

winmerge.sh 脚本的出色补充。 +1。我已更新 my answer 以链接到您的。 winmerge.bat 在第二个 sn-p 应该是 winmerge.sh 你可以为许多工具制作这个吗?并通过文件扩展名关联它们?【参考方案14】:

我对此还有一个补充。我喜欢定期使用不支持作为默认工具之一的差异应用程序(例如万花筒),通过

git difftool -t

我还希望将默认的 diff 用作常规命令行,因此不能选择设置 GIT_EXTERNAL_DIFF 变量。

您可以通过以下命令一次性使用任意diff 应用程序:

git difftool --extcmd=/usr/bin/ksdiff

它只是将 2 个文件传递给您指定的命令,因此您可能也不需要包装器。

【讨论】:

好点:还没有人提到--extcmd 选项。 +1。我已将其包含在我的答案中。 你能添加对“万花筒”的引用吗?【参考方案15】:

如果您在 Mac 上安装了 Xcode,那么您已经安装了 FileMerge。终端命令是opendiff,所以你可以这样做:

git difftool -t opendiff

【讨论】:

使用 -y 选项来避免烦人的提示。不幸的是,git 会等到 FileMerge 退出后再提供下一个更改的文件。使用 -d 选项一次性进行目录比较。 选项 -t 似乎需要完整路径。也许使用 git difftool --extcmd=opendiff 更好。【参考方案16】:

这适用于我在 Windows 7 上。不需要中介 sh 脚本

.gitconfig 的内容:

    [diff]
      tool = kdiff3

    [difftool]
       prompt = false

    [difftool "kdiff3"]
      path = C:/Program Files (x86)/KDiff3/kdiff3.exe
      cmd = "$LOCAL" "$REMOTE"

【讨论】:

您是否也将 kdiff3 定义为您的合并工具?如果是这样,介意分享你的 gitconfig 的那一部分吗? 谢谢。这对我来说不太有效,但是当我删除 path 并将 cmd 更改为 "\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\"" 时它确实有效【参考方案17】:

我已经在文件~/.gitconfig 中使用这个位很长时间了:

[diff]
    external = ~/Dropbox/source/bash/git-meld

git-meld:

#!/bin/bash
if [ "$DISPLAY" = "" ];
then
    diff $2 $5
else
    meld $2 $5
fi

但是现在我已经厌倦了在图形环境中总是使用Meld,并且使用这种设置调用普通差异并不容易,所以我切换到了这个:

[alias]
    v =  "!sh -c 'if [ $# -eq 0 ] ; then git difftool -y -t meld ; else git difftool -y $@ ; fi' -"

使用此设置,类似这样的工作:

git v
git v --staged
git v -t kompare
git v --staged -t tkdiff

我仍然可以保留旧的git diff

【讨论】:

【参考方案18】:

我在这里尝试了一些花哨的东西(使用 tkdiff),但对我没有任何帮助。所以我写了下面的脚本,tkgitdiff。它做我需要它做的事情。

$ cat tkgitdiff
#!/bin/sh

#
# tkdiff for git.
# Gives you the diff between HEAD and the current state of your file.
#

newfile=$1
git diff HEAD -- $newfile > /tmp/patch.dat
cp $newfile /tmp
savedPWD=$PWD
cd /tmp
patch -R $newfile < patch.dat
cd $savedPWD
tkdiff /tmp/$newfile $newfile

【讨论】:

【参考方案19】:

您可以使用git difftool

例如,如果您有Meld,您可以通过以下方式编辑分支masterdevel

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

【讨论】:

【参考方案20】:

如果您碰巧已经有一个与文件类型关联的差异工具(例如,因为您安装了带有差异查看器的 TortoiseSVN),您可以将常规 git diff 输出通过管道传输到“临时”文件,然后打开它直接文件,无需了解查看器的任何信息:

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

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

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

【讨论】:

【参考方案21】:

对之前优秀答案的简短总结:

git difftool --tool-help
git config --global diff.tool <chosen tool>
git config --global --add difftool.prompt false

然后通过键入来使用它(也可以指定文件名):

git difftool

【讨论】:

【参考方案22】:

安装Meld:

 # apt-get install meld

然后选择它作为 difftool:

 $ git config --global diff.tool meld

如果你想在控制台中运行它,输入:

 $ git difftool

如果要使用图形模式,请输入:

 $ git mergetool

输出将是:

 'git mergetool' will now attempt to use one of the following tools:
 meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse
 diffmerge ecmerge p4merge araxis bc3 codecompare emerge vimdiff
 Merging:
 www/css/style.css
 www/js/controllers.js

 Normal merge conflict for 'www/css/style.css':
   local: modified file
   remote: modified file
 Hit return to start merge resolution tool (meld):

所以只需按 Enter 即可使用 meld(默认)。这将打开图形模式。进行魔法保存并按下解决合并的按钮。就是这样。

【讨论】:

我喜欢融合,但它在 MacO 上的表现一直很差,所以我切换到了 sublime 合并。【参考方案23】:

如果您不是命令行用户,那么如果您安装了TortoiseGit,您可以右键单击文件以获取带有“稍后区分”选项的 TortoiseGit 子菜单。

当您在第一个文件上选择此项时,您可以右键单击第二个文件,进入 TortoiseGit 子菜单并选择“Diff with ==yourfilehere==”。 这将为结果提供 TortoiseGit 合并 GUI。

【讨论】:

【参考方案24】:

在 Mac OS X 上,

git difftool -t diffuse

在 Git 文件夹中为我完成这项工作。安装Diffuse,可以使用port-

sudo port install diffuse

【讨论】:

“端口”?在BSD? 你能添加对“端口”和“漫反射”的引用吗?以及假定的平台/操作系统?【参考方案25】:

查看其他一些外部差异工具后,我发现 IntelliJ IDEA(和 android Studio)中的 diff 视图最适合我。

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

如果您想使用 IntelliJ IDEA 作为您的 diff 工具,您应该首先设置 IntelliJ IDEA,以便按照说明 here 的说明从命令行运行:

在 macOS 或 UNIX 上:

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

在 Windows 上:

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

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

按照this blog post上的说明进行操作:

重击

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

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")

你可以试试git difftoolgit difftool HEAD~1

【讨论】:

【参考方案26】:

可以从这里的其他答案中收集到以下内容,但对我来说这很难(信息太多),所以这里是 tkdiff 的“只需输入”答案:

git difftool --tool=tkdiff <path to the file to be diffed>

您可以用您最喜欢的差异化工具的可执行名称替换 tkdiff。只要(例如 tkdiff),(或您最喜欢的差异工具)在您的 PATH 中,它就会被启动。

【讨论】:

这是最简单最快的方法。

以上是关于如何使用我喜欢的差异工具/查看器查看“git diff”输出?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式利用 Eclipse 的合并和差异查看器

彩色 Git 差异到 HTML

英雄联盟模型查看器

如何用pycharm查看文件修改记录和对比分支差异

查看结构性xib差异的工具?

如何用pycharm查看文件修改记录和对比分支差异