如何使用我的首选diff工具/查看器查看“git diff”输出?

当我输入git diff ,我想用我选择的视觉差异工具(Windows上的SourceGear“diffmerge”)查看输出结果。 我如何配置git来做到这一点?


从Git1.6.3开始,你可以使用git difftool脚本 :参见下面的答案。


可能是这篇文章会帮助你。 这里是最好的部分:

有两种不同的方式来指定外部差异工具。

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

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

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

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

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

正如你所看到的,只有第二个(“旧文件”)和第五个(“新文件”)参数将被传递给diff工具。

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工具的路径,即使用正向斜杠而不是反斜杠。 就我而言,我有

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

在.gitconfig和

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

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

(我认为只有某些程序不需要返回适当的或一致的返回状态时才需要' | cat ',如果你的diff工具有明确的返回状态,你可能想尝试没有尾随的猫)


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

  • 如何用msysgit / gitk设置DiffMerge? 它说明了MsysGit和gitk的DiffMerge和WinMerge的具体设置
  • 我如何设置一个编辑器来在Windows上使用Git? 将Notepad ++定义为外部编辑器。

  • 要完成上面的“diff.external”配置答案:

    正如Jakub所说,Git1.6.3引入了2008年9月提出的git difftool

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

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

    它基本上是git-mergetool修改以在git索引/工作树上运行。

    这个脚本的通常用例是当你有变化或未变化的变化时,你想看到并排差异查看器中的变化(例如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”

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


    在Git 2.5之前:

    使用自定义diff工具配置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配置轻松切换工具。

    您也有Dave的这个博客文章添加其他细节。
    (或者winmergeu选项的这个问题)

    对此设置的兴趣是winmerge.sh脚本 :您可以对其进行自定义以考虑特殊情况。

    下面以David Marble的答案为例说明一个例子:

  • 源文件或目标文件中的新文件
  • 删除原始或目的地中的文件

  • Kem Mason在他的回答中提到,你也可以通过使用--extcmd选项来避免任何包装

    --extcmd=<command>
    

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

    例如,这是gitk如何运行/使用任何diff工具。


    本着回答与问题有所不同的问题的精神。 尝试此解决方案:

    $ meld my_project_using_git
    

    Meld了解git并提供有关最近更改的导航。

    链接地址: http://www.djcxy.com/p/41953.html

    上一篇: How do I view 'git diff' output with my preferred diff tool/ viewer?

    下一篇: Can I use Terracotta to scale a RAM