当我输入git diff时,我希望看到一个并排的diff,就像用diff -y一样,或者像在kdiff3这样的交互式diff工具中显示diff。如何做到这一点呢?


当前回答

这可能是一个有点有限的解决方案,但在没有外部工具的情况下使用系统的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

其他回答

这里有一个方法。如果管道通过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

我最近实现了一个这样做的工具:https://github.com/banga/git-split-diffs

下面是如何使用它:

npm install -g git-split-diffs

git config --global core.pager "git-split-diffs --color | less -RFX"

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

如您所见,它还支持语法高亮显示和行中更改的单词高亮显示

尝试 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

这可能是一个有点有限的解决方案,但在没有外部工具的情况下使用系统的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