当我做“git diff”时,怎样才能得到并排的diff?
当我input“git diff”时,我想看到一个并排的diff,就像“diff -y”一样,或者像在“kdiff3”这样的交互式diff工具中显示diff。 如何才能做到这一点?
尽pipeGit有diff的内部实现,但是您可以设置一个外部工具。
有两种不同的方式来指定一个外部diff工具:
- 设置
GIT_EXTERNAL_DIFF
和GIT_DIFF_OPTS
环境variables。 - 通过
git config
configuration外部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文件)
-
使用
GIT_EXTERNAL_DIFF
,GIT_DIFF_OPTS
例如在您可以设置的.bashrc或.bash_profile文件中:
GIT_EXTERNAL_DIFF=$HOME/scripts/my_diff.sh export GIT_EXTERNAL_DIFF
-
使用
git config
使用“git config”来定义你的包装器脚本的位置:
git config --global diff.external ~/scripts/my_diff.sh
-
编辑
~/.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也增加了更好的颜色。 在选项-ydw
, y
是并排的, 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