当我输入git diff时,我希望看到一个并排的diff,就像用diff -y一样,或者像在kdiff3这样的交互式diff工具中显示diff。如何做到这一点呢?
尝试 git difftool
使用git difftool而不是git diff,你将永远不会回到过去。
UPDATE添加一个示例用法:
这是另一个关于git difftool的stackoverflow的链接:我如何用我喜欢的diff工具/查看器查看'git diff'输出?
对于较新版本的git, difftool命令支持许多即时可用的外部diff工具。例如vimdiff是自动支持的,可以通过以下方式从命令行打开:
cd /path/to/git/repo
git difftool --tool=vimdiff
其他支持的外部diff工具通过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
尽管Git有一个diff的内部实现,但是您可以设置一个外部工具。
有两种不同的方法来指定外部差异工具:
设置GIT_EXTERNAL_DIFF和GIT_DIFF_OPTS环境变量。 通过git config配置外部diff工具
Ymattw的答案也非常简洁,使用ydiff
参见:
https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration Git diff——救命 http://www.pixelbeat.org/programming/diffs/
在执行git diff时,git会检查上述环境变量的设置及其.gitconfig文件。
默认情况下,Git将以下七个参数传递给diff程序:
path old-file old-hex old-mode new-file new-hex new-mode
通常只需要old-file和new-file参数。当然,大多数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"
然后你需要使该脚本可执行:
chmod a+x ~/scripts/my_diff.sh
然后,您需要告诉Git如何以及在哪里找到您的自定义差异包装器脚本。 你有三个选择如何做到这一点:(我更喜欢编辑.gitconfig文件)
使用GIT_EXTERNAL_DIFF, GIT_DIFF_OPTS 例如,在你的.bashrc或.bash_profile文件中,你可以设置: GIT_EXTERNAL_DIFF = $ HOME /脚本/ my_diff.sh 出口GIT_EXTERNAL_DIFF 使用git配置 使用“git config”来定义你的包装器脚本可以在哪里找到: Git配置——global diff.external ~/scripts/my_diff.sh 编辑~/。gitconfig文件 您可以编辑~/。Gitconfig文件添加这些行: (diff) External = ~/scripts/my_diff.sh
注意:
与安装自定义diff工具类似,您还可以安装一个自定义合并工具,它可以是一个可视化的合并工具,以更好地帮助可视化合并。(参见progit.org页面)
参见:http://fredpalma.com/518/visual-diff-and-merge-tool/和https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
伊迪夫
这个工具以前称为cdiff,可以并排显示、增量显示和彩色显示差异。
而不是做git diff,做:
ydiff -s -w0
这将为每个有差异的文件以并排显示模式启动ydiff。
安装:
python3 -m pip install --user ydiff
-or-
brew install ydiff
对于git日志,您可以使用:
ydiff -ls -w0
-w0自动检测终端宽度。有关详细信息和演示,请参阅ydiff GitHub存储库页面。
在Git 2.18.0, ydiff 1.1中测试。
我用色差。
在Mac OS X上,使用
$ sudo port install colordiff
在Linux上可能会安装colordiff或类似的东西,这取决于你的发行版。
然后:
$ git difftool --extcmd="colordiff -ydw" HEAD^ HEAD
或者创建别名
$ git alias diffy "difftool --extcmd=\"colordiff -ydw\""
然后你就可以使用它了
$ git diffy HEAD^ HEAD
我称它为“diffy”,因为diff -y是unix中并排的diff。Colordiff还添加了更好的颜色。 在选项-ydw中,y表示并排,w表示忽略空白,d表示产生最小的diff(通常作为diff会得到更好的结果)
如果你想在不涉及GitHub的情况下在浏览器中看到并排的差异,你可能会喜欢git webdiff,它是git diff的替代品:
$ pip install webdiff
$ git webdiff
与传统的GUI差异工具(如tkdiff)相比,这提供了许多优势,因为它可以为您提供语法高亮显示和显示图像差异。
点击这里阅读更多信息。
当我在寻找一种使用git内置方式来定位差异的快速方法时,这个问题出现了。我的解决方案标准:
快速启动,需要内置选项 可以处理多种格式,xml,不同的编程语言 快速识别大文本文件中的小代码更改
我找到这个答案是为了给git上色。
为了获得并排diff而不是行diff,我调整了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选项与颜色设置一起具有非常有用的可见性,与标准行差异相比,当浏览带有小行更改的大文件时,可以获得彩色的并排源代码体验。
我个人非常喜欢icdiff !
如果你在Mac OS X上使用HomeBrew,只需安装icdiff即可。
为了获得正确的文件标签,加上其他很酷的功能,我在~/.gitconfig中有:
[pager]
difftool = true
[diff]
tool = icdiff
[difftool "icdiff"]
cmd = icdiff --head=5000 --highlight --line-numbers -L \"$BASE\" -L \"$REMOTE\" \"$LOCAL\" \"$REMOTE\"
我用git difftool
在这个帖子里有很多很好的答案。对于这个问题,我的解决方案是编写一个脚本。
将其命名为“git-scriptname”(并使其可执行并将其放在您的PATH中,就像任何脚本一样),您可以像正常的git命令一样通过运行调用它
$ git scriptname
实际的功能在最后一行。来源如下:
#!/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
这里有一个方法。如果管道通过less, xterm宽度设置为80,这不是很热。但是如果继续执行命令,例如COLS=210,则可以使用扩展的xterm。
gitdiff()
{
local width=${COLS:-$(tput cols)}
GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@"
}
你可以使用sdiff做一个并排的diff,如下所示:
$ git difftool -y -x sdiff HEAD^ | less
其中HEAD^是一个例子,你应该用任何你想要反对的东西来替换它。
我在这里找到了这个解决方案,还有一些其他的建议。然而,这一个答案是OP的问题简洁而清楚。
有关这些论点的解释,请参阅man git-difftool。
把注释记在板上,你可以通过编写以下可执行脚本创建一个方便的git sdiff命令:
#!/bin/sh
git difftool -y -x "sdiff -w $(tput cols)" "${@}" | less
保存为/usr/bin/git-sdiff并chmod +x它。然后你就可以这样做了:
$ git sdiff HEAD^
额外的小费
正如评论中所建议的,你可以使用icdiff来做sdiff对彩色输出所做的事情:
$ more /usr/bin/git-sdiff
#!/bin/sh
git difftool -y -x "icdiff --cols $(tput cols)" "${@}" | less --raw-control-chars
打开Intellij IDEA,在“版本控制”工具窗口中选择单个或多个提交,浏览更改的文件,然后双击它们,并排检查每个文件的更改。
使用捆绑的命令行启动器,您可以在任何地方使用简单的IDEA some/path启动IDEA
其他几个人已经提到了用于git的cdiff,但没有人给出它的完整实现。
设置cdiff:
git clone https://github.com/ymattw/cdiff.git
cd cdiff
ln -s `pwd`/cdiff ~/bin/cdiff
hash -r # refresh your PATH executable in bash (or 'rehash' if you use tcsh)
# or just create a new terminal
编辑~ /。Gitconfig插入这些行:
[pager]
diff = false
show = false
[diff]
tool = cdiff
external = "cdiff -s $2 $5 #"
[difftool "cdiff"]
cmd = cdiff -s \"$LOCAL\" \"$REMOTE\"
[alias]
showw = show --ext-dif
关闭寻呼机是cdiff与Diff一起工作所必需的,它本质上是一个寻呼机,所以这很好。不管这些设置,Difftool都能正常工作。
需要show别名,因为git show仅通过参数支持外部差异工具。
diff external命令后面的“#”很重要。Git的diff命令向diff命令追加了一个$@(所有可用的diff变量),但我们只想要这两个文件名。因此,我们用$2和$5显式地调用这两个,然后将$@隐藏在注释后面,否则会使sdiff混淆。导致如下错误:
fatal: <FILENAME>: no such path in the working tree
Use 'git <command> -- <path>...' to specify paths that do not exist locally.
Git命令现在产生并排差异:
git diff <SHA1> <SHA2>
git difftool <SHA1> <SHA2>
git showw <SHA>
Cdiff usage:
'SPACEBAR' - Advances the page of the current file.
'Q' - Quits current file, thus advancing you to the next file.
你现在通过git diff和difftool得到了并行的diff。如果需要,还可以使用cdiff python源代码进行高级用户定制。
对于unix,只组合git和内置的diff:
git show HEAD:path/to/file | diff -y - path/to/file
当然,您可以用任何其他git引用替换HEAD,并且您可能希望在diff命令中添加-W 170之类的东西。
这里假设您只是将您的目录内容与过去的提交进行比较。两个提交之间的比较比较复杂。如果你的shell是bash,你可以使用“进程替换”:
diff -y -W 170 <(git show REF1:path/to/file) <(git show REF2:path/to/file)
其中REF1和REF2是git引用-标签,分支或哈希。
这可能是一个有点有限的解决方案,但在没有外部工具的情况下使用系统的diff命令完成工作:
diff -y <(git show from-rev:the/file/path) <(git show to-rev:the/file/path)
仅过滤更改行使用——suppress-common-lines(如果您的diff支持该选项)。 在这种情况下,没有颜色,只有通常的不同标记 可以调整列宽度-width=term-width;在Bash中可以获取宽度为$COLUMNS或tput cols。
为了更方便,这也可以被包装到一个helper git-script中,例如,这样使用:
git diffy the/file/path --from rev1 --to rev2
我最近实现了一个这样做的工具:https://github.com/banga/git-split-diffs
下面是如何使用它:
npm install -g git-split-diffs
git config --global core.pager "git-split-diffs --color | less -RFX"
这是它在终端中的外观(使用默认主题):
如您所见,它还支持语法高亮显示和行中更改的单词高亮显示