当我做“git diff”时,怎样才能得到并排的diff?

当我input“git diff”时,我想看到一个并排的diff,就像“diff -y”一样,或者像在“kdiff3”这样的交互式diff工具中显示diff。 如何才能做到这一点?

尽pipeGit有diff的内部实现,但是您可以设置一个外部工具。

有两种不同的方式来指定一个外部diff工具:

  1. 设置GIT_EXTERNAL_DIFFGIT_DIFF_OPTS环境variables。
  2. 通过git configconfiguration外部diff工具

也可以看看:

在做一个git diff ,Git检查上述环境variables及其.gitconfig文件的设置。

默认情况下,Git将以下七个parameter passing给diff程序:

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

通常只需要旧文件和新文件参数。 当然,大多数diff工具只有两个文件名作为参数。 这意味着你需要编写一个小的包装脚本,它接受Git提供给脚本的参数,并把它们传递给你select的外部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" 

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

 chmod a+x ~/scripts/my_diff.sh 

那么你需要告诉Git如何以及在哪里find你自定义的diff包装器脚本。 你有三个select如何做到这一点:(我更喜欢编辑.gitconfig文件)

  1. 使用GIT_EXTERNAL_DIFFGIT_DIFF_OPTS

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

     GIT_EXTERNAL_DIFF=$HOME/scripts/my_diff.sh export GIT_EXTERNAL_DIFF 
  2. 使用git config

    使用“git config”来定义你的包装器脚本的位置:

     git config --global diff.external ~/scripts/my_diff.sh 
  3. 编辑~/.gitconfig文件

    你可以编辑你的~/.gitconfig文件来添加这些行:

     [diff] external = ~/scripts/my_diff.sh 

注意:

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

请参阅: http : //fredpalma.com/518/visual-diff-and-merge-tool/和http://progit.org/book/ch7-1.html

使用git difftool而不是git diff 。 你永远不会回头。

cdiff可以显示并排增量多彩的差异,请参阅其主页的细节和演示在https://github.com/ymattw/cdiff

你也可以试试git diff --word-diff 。 这不完全是并排的,但有些更好,所以你可能更喜欢它实际的并排需求。

 export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null' 

然后简单地:

 git diff 

我用colordiff 。

在Mac OS X上,使用

 $ sudo port install colordiff 

在Linux上可能会apt get install colordiff或类似的东西,这取决于你的发行版。

然后:

 $ git difftool --extcmd="colordiff -ydw" HEAD^ HEAD 

或者创build一个别名

 $ git alias diffy "difftool --extcmd=\"colordiff -ydw\"" 

那么你可以使用它

 $ git diffy HEAD^ HEAD 

我把它叫做“diffy”,因为diff -y是unix中的并排diff。 Colordiff也增加了更好的颜色。 在选项-ydwy是并排的, w是忽略空格, d是产生最小差异(通常你得到一个更好的结果作为差异)

如果你希望在不涉及GitHub的情况下在浏览器中看到并行的diff,你可能会喜欢git webdiff ,一个替代git diff 插件 :

 $ pip install webdiff $ git webdiff 

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

在这里阅读更多关于它。

你可以使用sdiff做一个并排的diff ,如下所示:

 $ git difftool -y -x sdiff HEAD^ | less 

HEAD^是一个例子,你应该用你想要的任何东西来替代。

我在这里find了这个解决scheme,还有一些其他的build议。 然而,这个答案简洁明了就是OP的问题。

请参阅man git-difftool以获取参数的解释。

我个人非常喜欢icdiff !

如果你在Mac OS X使用HomeBrew ,只需要brew install icdiff

要正确地获取文件标签,加上其他很酷的function,我已经在我的~/.gitconfig

 [pager] difftool = true [diff] tool = icdiff [difftool "icdiff"] cmd = icdiff --head=5000 --highlight --line-numbers -L \"$BASE\" -L \"$REMOTE\" \"$LOCAL\" \"$REMOTE\" 

我使用它: git difftool

这是一个方法。 如果你通过较less的pipe道,xterm宽度设置为80,这是不是太热。 但是如果你继续使用命令,比如COLS = 210,那么你可以使用扩展的xterm。

 gitdiff() { local width=${COLS:-$(tput cols)} GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@" } 

这个问题出现了,当我正在寻找一种快速的方式来使用git内置的方式来find差异。 我的解决scheme标准

  • 快速启动,需要内置选项
  • 可以轻松处理多种格式,xml,不同的编程语言
  • 快速识别大文本文件中的小代码更改

我发现这个答案在git中获取颜色。

为了得到并排的差异,而不是线差异我调整了mb14在这个问题上的优秀答案与以下参数:

 $ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]" 

如果你不喜欢额外的[ – 或{+选项--word-diff=color可以使用。

 $ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]" --word-diff=color 

这有助于正确比较json和xml文本和java代码。

总而言之,当使用较小的行更改浏览大文件时, --word-diff-regex选项与颜色设置一起提供了有用的可见性,与标准行差异相比,可以获得彩色的并行源代码体验。

这个线程有很多很好的答案。 我对这个问题的解决scheme是编写一个脚本。

命名这个'git-scriptname'(并使其可执行并将其放在PATH中,就像任何脚本一样),并且可以像运行普通的git命令一样通过运行

 $ git scriptname 

实际的function只是最后一行。 这是来源:

 #!/usr/bin/env zsh # # Show a side-by-side diff of a particular file how it currently exists between: # * the file system # * in HEAD (latest committed changes) function usage() { cat <<-HERE USAGE $(basename $1) <file> Show a side-by-side diff of a particular file between the current versions: * on the file system (latest edited changes) * in HEAD (latest committed changes) HERE } if [[ $# = 0 ]]; then usage $0 exit fi file=$1 diff -y =(git show HEAD:$file) $file | pygmentize -g | less -R