214

当我输入“git diff”时,我希望看到一个并排的差异,例如“diff -y”,或者希望在交互式差异工具中显示差异,例如“kdiff3”。如何才能做到这一点?

4

17 回答 17

222

试试 git difftool

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

更新以添加示例用法:

这是另一个讨论的stackoverflow的链接git difftool如何使用我喜欢的差异工具/查看器查看'git diff'输出?

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

cd /path/to/git/repo
git difftool --tool=vimdiff

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
于 2011-10-06T03:11:26.197 回答
98

尽管 Git 有一个 diff 的内部实现,但您可以设置一个外部工具来代替。

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

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

ymattw的答案也很简洁,使用ydiff

也可以看看:

执行 a 时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 文件)

  1. 使用GIT_EXTERNAL_DIFF,GIT_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/https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration

于 2011-10-06T03:14:03.527 回答
75

你也可以试试git diff --word-diff。它并不完全是并排的,但不知何故更好,因此您可能更喜欢它而不是实际的并排需要。

于 2013-11-11T12:01:54.540 回答
56

ydiff

以前叫cdiff,这个工具可以并排显示,增量显示和彩色差异。

而不是做git diff,做:

ydiff -s -w0

这将为ydiff每个有差异的文件以并排显示模式启动。

安装:

python3 -m pip install --user ydiff

-或者-

brew install ydiff

对于git log,您可以使用:

ydiff -ls -w0

-w0自动检测您的终端宽度。有关详细信息和演示,请参阅ydiff GitHub 存储库页面

在 Git 2.18.0、ydiff 1.1 中测试。

于 2013-02-01T15:14:40.247 回答
28

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

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

whereHEAD^是一个示例,您应该将其替换为您想要比较的任何内容。

我在这里找到了这个解决方案,其中还有一些其他建议。但是,这个答案简洁明了地是OP的问题。

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


考虑到船上的评论,您可以git sdiff通过编写以下可执行脚本来创建一个方便的命令:

#!/bin/sh
git difftool -y -x "sdiff -w $(tput cols)" "${@}" | less

将其保存为/usr/bin/git-sdiffchmod +x它。然后你就可以这样做了:

$ git sdiff HEAD^

额外提示

正如评论中所建议的,您可以使用icdiffsdiff彩色输出执行的操作:

$ more /usr/bin/git-sdiff
#!/bin/sh
git difftool -y -x "icdiff --cols=$(tput cols)" "${@}" | less
于 2016-08-30T10:57:45.783 回答
10

对于 unix,结合 justgit和 built-in diff

git show HEAD:path/to/file | diff -y - path/to/file

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

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

diff -y -W 170 <(git show REF1:path/to/file) <(git show REF2:path/to/file)

git 引用的位置REF1和位置——标签、分支或哈希。REF2

于 2018-05-07T18:49:20.237 回答
9
export GIT_EXTERNAL_DIFF='meld $2 $5; echo >/dev/null'

然后简单地说:

git diff
于 2012-10-12T08:22:28.893 回答
9

如果您想在不涉及 GitHub 的情况下在浏览器中查看并排差异,您可能会喜欢git webdiff,它是git diff

$ pip install webdiff
$ git webdiff

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

在此处阅读更多相关信息。

于 2014-11-20T20:43:46.407 回答
8

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

以下是如何使用它:

npm install -g git-split-diffs

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

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

并排差异预览

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

于 2021-05-10T02:58:15.127 回答
7

我使用colordiff

在 Mac OS X 上,安装它

$ sudo port install colordiff

在 Linux 上可能是apt get install colordiff或类似的,这取决于您的发行版。

然后:

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

或者创建一个别名

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

然后你就可以使用它了

$ git diffy HEAD^ HEAD

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

于 2014-07-17T14:05:22.333 回答
6

我个人真的很喜欢icdiff

如果你坚持下去Mac OS X,那就HomeBrew去做吧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\"

我像这样使用它:git difftool

于 2015-10-29T13:45:02.727 回答
4

当我在寻找一种使用 git 内置方式来定位差异的快速方法时,出现了这个问题。我的解决方案标准:

  • 快速启动,需要内置选项
  • 可以轻松处理多种格式,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与标准行差异相比,当浏览具有小行更改的大文件时,这些选项与颜色设置一起具有有用的可见性,以获得彩色的并排源代码体验。

于 2015-07-20T12:27:28.147 回答
2

这是一种方法。如果你通过更少的管道,xterm 宽度设置为 80,这不是那么热。但是,如果您继续执行命令,例如 COLS=210,您可以使用扩展的 xterm。

gitdiff()
{
    local width=${COLS:-$(tput cols)}
    GIT_EXTERNAL_DIFF="diff -yW$width \$2 \$5; echo >/dev/null" git diff "$@"
}
于 2016-06-27T09:14:11.593 回答
2

打开Intellij IDEA,在“版本控制”工具窗口中选择单个或多个提交,浏览更改的文件,然后双击它们以并排检查每个文件的更改。

使用捆绑的命令行启动器,您可以在任何地方使用简单的idea some/path

版本控制视图 差异视图

于 2017-12-05T15:29:26.817 回答
2

其他几个人已经提到了用于 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 都将起作用。

需要显示别名,因为 git show 仅通过参数支持外部差异工具。

diff 外部命令末尾的“#”很重要。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 用法:

'SPACEBAR' - Advances the page of the current file.
'Q'        - Quits current file, thus advancing you to the next file.

您现在可以通过 git diff 和 difftool 获得并排差异。如果需要,您还拥有用于高级用户自定义的 cdiff python 源代码。

于 2018-02-02T06:23:38.953 回答
2

这可能是一个有点有限的解决方案,但是使用系统diff命令而不需要外部工具来完成这项工作:

diff -y  <(git show from-rev:the/file/path) <(git show to-rev:the/file/path)
  • 仅过滤使用的更改线--suppress-common-lines(如果您diff支持该选项)。
  • 在这种情况下没有颜色,只有常用的diff标记
  • 可以调整列宽--width=term-width;在 Bash 中可以得到宽度为$COLUMNStput cols

为了更方便,也可以将其包装到辅助 git-script 中,例如,如下用法:

git diffy the/file/path --from rev1 --to rev2
于 2020-07-18T19:27:57.060 回答
1

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

将此命名为“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
于 2016-01-02T20:10:24.173 回答