当我做"git diff"时,如何获得并排差异?

140 git git-diff code-visualization

当我输入"git diff"时,我想看到一个并排的差异,就像"diff -y"一样,或者喜欢在像"kdiff3"这样的交互式差异工具中显示差异.如何才能做到这一点?

Mat*_*all 132

试试git difftool

git difftool而不是git diff.你永远不会回去.

更新以添加示例用法:

这是一个链接到另一个stackoverflow,讨论git difftool: 如何使用我首选的diff工具/查看器查看'git diff'输出?

对于较新版本git,该difftool命令支持许多开箱即用的外部差异工具.例如vimdiff,自动支持,可以通过以下命令从命令行打开:

cd /path/to/git/repo
git difftool --tool=vimdiff
Run Code Online (Sandbox Code Playgroud)

git difftool --tool-help这里列出了其他支持的外部差异工具示例输出:

'git difftool --tool=<tool>' may be set to one of the following:
        araxis
        kompare
        vimdiff
        vimdiff2

The following tools are valid, but not currently available:
        bc3
        codecompare
        deltawalker
        diffuse
        ecmerge
        emerge
        gvimdiff
        gvimdiff2
        kdiff3
        meld
        opendiff
        tkdiff
        xxdiff
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果你得到的话,你可能会回去.显示此消息是因为没有配置'diff.tool'.也许更新答案用最少的方法配置这个东西,以便它在终端中显示并排差异,这是OP要求的?在使用ssh连接的远程服务器上,GUI工具非常无用. (32认同)

Til*_*ilo 82

虽然Git有diff的内部实现,但您可以设置外部工具.

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

  1. 设置GIT_EXTERNAL_DIFFGIT_DIFF_OPTS环境变量.
  2. 通过配置外部差异工具 git config

也可以看看:

执行a时git diff,Git会检查上述环境变量及其.gitconfig文件的设置.

默认情况下,Git将以下七个参数传递给diff程序:

path  old-file  old-hex old-mode  new-file  new-hex new-mode
Run Code Online (Sandbox Code Playgroud)

您通常只需要旧文件和新文件参数.当然,大多数diff工具只使用两个文件名作为参数.这意味着你需要编写一个小的包装器脚本,它接受Git为脚本提供的参数,并将它们交给你选择的外部git程序.

假设你把你的包装脚本放在~/scripts/my_diff.sh:

#!/bin/bash
# un-comment one diff tool you'd like to use

# side-by-side diff with custom options:
# /usr/bin/sdiff -w200 -l "$2" "$5" 

# using kdiff3 as the side-by-side diff:
# /usr/bin/kdiff3 "$2" "$5"

# using Meld 
/usr/bin/meld "$2" "$5"

# using VIM
# /usr/bin/vim -d "$2" "$5"
Run Code Online (Sandbox Code Playgroud)

然后,您需要使该脚本可执行:

chmod a+x ~/scripts/my_diff.sh
Run Code Online (Sandbox Code Playgroud)

然后你需要告诉Git如何以及在哪里找到自定义差异包装器脚本.你有三种选择:(我更喜欢编辑.gitconfig文件)

  1. 使用GIT_EXTERNAL_DIFF,GIT_DIFF_OPTS

    例如,在.bashrc或.bash_profile文件中,您可以设置:

    GIT_EXTERNAL_DIFF=$HOME/scripts/my_diff.sh
    export GIT_EXTERNAL_DIFF
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运用 git config

    使用"git config"定义可以找到包装器脚本的位置:

    git config --global diff.external ~/scripts/my_diff.sh
    
    Run Code Online (Sandbox Code Playgroud)
  3. 编辑~/.gitconfig文件

    您可以编辑~/.gitconfig文件以添加以下行:

    [diff]
      external = ~/scripts/my_diff.sh
    
    Run Code Online (Sandbox Code Playgroud)

注意:

与安装自定义差异工具类似,您还可以安装自定义合并工具,它可以是一个可视化合并工具,以更好地帮助可视化合并.(参见progit.org页面)

请参阅:http://fredpalma.com/518/visual-diff-and-merge-tool/https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration

  • 这很棒,但它为每个文件启动了一个新的查看器.有没有办法在'meld`中创建一个合并差异? (3认同)
  • @Tilo 我在 vim 中收到错误消息:警告:输出不是终端 (2认同)

mb1*_*b14 42

你也可以试试git diff --word-diff.它不是完全并排,但不知何故更好,所以你可能更喜欢它与你真正的并排需求.

  • 这是最简单的方法.甚至更好的是`git diff --word-diff = color` (10认同)
  • @Rolf默认安装版本是1.7.1.可以解释一下差异.`git diff --color-words`确实有效. (4认同)
  • 是的,`git diff --color-words`是现代git版本的方法. (4认同)

小智 35

ydiff(以前称为cdiff)可以并排显示,增量显示和彩色差异.

有了它,你可以使用:

ydiff -s
Run Code Online (Sandbox Code Playgroud)

这将git diff针对每个具有差异的文件以并排显示模式启动.

有关详细信息和演示,请参阅ydiff GitHub存储库页面.


sta*_*fry 15

您可以按如下方式并排diff使用sdiff:

$ git difftool -y -x sdiff  HEAD^ | less
Run Code Online (Sandbox Code Playgroud)

在哪里HEAD^,你应该替换你想要反对的任何东西.

我在这里找到了这个解决方案,其中还有其他一些建议.然而,这一个答案是OP的问题简明扼要.

有关参数的解释,请参阅man git-difftool.


Shr*_*rey 13

我最近实现了一个工具,可以做到这一点: https: //github.com/banga/git-split-diffs

使用方法如下:

npm install -g git-split-diffs

git config --global core.pager "git-split-diffs --color | less -RFX"
Run Code Online (Sandbox Code Playgroud)

这就是它在终端中的外观(使用默认主题):

并排差异预览

正如你所看到的,它还支持语法高亮和高亮行内更改的单词


小智 8

export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'
Run Code Online (Sandbox Code Playgroud)

那简单地说:

git diff
Run Code Online (Sandbox Code Playgroud)


dan*_*nvk 8

如果你想在不涉及GitHub的情况下在浏览器中看到并排差异,你可能会喜欢git webdiff,这是一个替代品git diff:

$ pip install webdiff
$ git webdiff
Run Code Online (Sandbox Code Playgroud)

与传统的GUI difftools相比tkdiff,它提供了许多优势,例如它可以为您提供语法高亮显示和显示图像差异.

在这里阅读更多相关信息.


Lui*_*ano 6

我用colordiff.

在Mac OS X上,安装它

$ sudo port install colordiff
Run Code Online (Sandbox Code Playgroud)

在Linux上可能apt get install colordiff或类似的东西,取决于您的发行版.

然后:

$ git difftool --extcmd="colordiff -ydw" HEAD^ HEAD
Run Code Online (Sandbox Code Playgroud)

或者创建一个别名

$ git alias diffy "difftool --extcmd=\"colordiff -ydw\""
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它

$ git diffy HEAD^ HEAD
Run Code Online (Sandbox Code Playgroud)

我称它为"diffy",因为它diff -y是unix中的并排差异.Colordiff还添加了更好的颜色.在选项中-ydw,y是并排的,w是忽略空格,d而是产生最小的差异(通常你得到一个更好的结果作为差异)

  • 在Mac OS X上,自制软件也是如此:`brew install colordiff` (2认同)

Jos*_*ban 6

我个人非常喜欢icdiff

如果你在Mac OS XHomeBrew,只是做brew install icdiff

为了正确获取文件标签以及其他很酷的功能,我在我的~/.gitconfig

[pager]
    difftool = true
[diff]
    tool = icdiff
[difftool "icdiff"]
    cmd = icdiff --head=5000 --highlight --line-numbers -L \"$BASE\" -L \"$REMOTE\" \"$LOCAL\" \"$REMOTE\"
Run Code Online (Sandbox Code Playgroud)

我像这样使用它: git difftool


Wal*_* IV 5

对于unix,将just git和内置组合diff

git show HEAD:path/to/file | diff -y - path/to/file
Run Code Online (Sandbox Code Playgroud)

当然,您可以将HEAD替换为其他git引用,并且可能要-W 170在diff命令中添加类似内容。

假设您只是将目录内容与过去的提交进行比较。在两次提交之间进行比较更为复杂。如果您的外壳是bash,则可以使用“进程替换”:

diff -y -W 170 <(git show REF1:path/to/file) <(git show REF2:path/to/file)
Run Code Online (Sandbox Code Playgroud)

哪里REF1REF2git参考–标签,分支或哈希。