167

我喜欢git diff. 行间变化的颜色和+/-表示比 GNU diff 更容易阅读。

我可以在git repo 之外git diff使用flag 运行,它工作正常。--no-index但是,它似乎缺少--exclude从递归中排除文件或子目录的选项diff

有没有办法两全其美?(GNU diff 的颜色选项和+/-格式git diff--exclude选项)。

我已经尝试过colordiff,但我仍然更喜欢的输出格式git diff

4

15 回答 15

212

这将做+/-而不是<>

diff -u file1 file2

自 GNU diffutils 3.4 以来,该标志--color已被添加。将两者结合起来会产生以下效果:

diff --color -u file1 file2

该标志--color还接受一个参数,有效选项是neveralwaysauto。当您想更明确地说明需要做什么时很有用。

于 2011-01-31T23:40:10.940 回答
105

您也可以使用git diff --no-index -- A B(通过manpage)。

于 2013-07-02T19:16:19.403 回答
26
  1. 安装colordiff

  2. 更新您的 ~/.colordiffrc(如有必要,首先复制 /etc/colordiffrc):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. 用于colordiff -u file1 file2两个文件或colordiff -ruN path1 path2递归比较路径。

它不完全相同,但非常接近。

于 2013-11-29T14:56:25.437 回答
20

这就是我的建议,而且非常接近

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff: 你必须安装这个
    • brew install colordiff在我的 Mac 上。
    • port install colordiff在某些 Mac 上。
    • sudo apt-get install colordiff在 Debian 或 Ubuntu 上
    • 对于其他平台,请从主页GitHub下载源代码并按照安装说明进行操作
  • -R:这告诉 Less 显示颜色而不是原始代码。

我最终使用-w了,因为我不想看到空格差异。

diff -w -u FILE1 FILE2 | colordiff | less -R

编辑:正如@Ciprian Tomoiaga 在评论中所建议的,您可以将其设为一个函数并将其也放入您的~/.bashrc文件中。

function gdiff () { diff -u $@ | colordiff | less -R; }
于 2014-08-21T15:33:17.293 回答
8

根据Unix SE 上的这个答案, GNU从 2016 年末的 3.4 版diff开始有一个选项。旁边应该足以模仿以下输出:--color-ugit diff

diff -u --color=always file1 file2 | less -r

--color必须always在管道中使用时,auto将关闭管道中的颜色。

我只在 Windows 上使用 Git Bash 尝试过这个,less -R它只会给大块的第一行着色。less -r在那种情况下为我修好了。

于 2018-06-12T18:53:28.873 回答
3

仅使用bashdifftputless,我们可以非常接近 的输出git diffdiff但是,由于程序员的短视,会有一些显着的差异。

将以下 Bash 函数定义放在某个由您的用户帐户自动获取的文件中,您将能够从命令行访问该函数:

function gdiff()
{
    local REG=`tput op`
    local GRP=`tput setaf 6`
    local ADD=`tput setaf 2`
    local REM=`tput setaf 1`

    local NL=$'\n'
    local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"

    local UNCH_GRP_FMT=''

    [[ "${1}" == '@full' ]] && {

        UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
        shift
    }

    diff \
        --new-line-format="${ADD}+%L${REG}" \
        --old-line-format="${REM}-%L${REG}" \
        --unchanged-line-format=" %L${REG}" \
        --new-group-format="${GRP_LABEL}${NL}%>" \
        --old-group-format="${GRP_LABEL}${NL}%<" \
        --changed-group-format="${GRP_LABEL}${NL}%<%>" \
        --unchanged-group-format="${UNCH_GRP_FMT}" \
            "${@}" | less -FXR
}

此功能的工作原理如下:

  1. 最终,diff使用各种格式选项调用以指定如何显示文件中的更改。
  2. tput用于将 ANSI 颜色代码插入到这些格式选项中。请注意,当使用非 ANSI 终端时,您可能必须替换tput setaftput setf.
  3. 的输出通过diff管道传输到less. -R允许保留 ANSI 颜色。 -X防止less退出时清除屏幕。 -F如果输出适合一个屏幕,则阻止less其作为寻呼机运行。
  4. 如果第一个参数是@full,该函数将显示除了添加和删除的行之外的所有未更改的行。

请注意此方法与 之间的以下差异git diff

  1. git diff报告围绕每个更改的三行上下文。不幸的是,diff如果您想指定上下文行数同时还指定格式选项,似乎会抱怨并退出。(至少在 Mac OS X Yosemite 中是这样)。感谢diff程序员。因此,您可以请求不围绕每个更改的上下文行(这是默认行为),或者您可以通过指定@full为第一个参数来请求也报告文件中所有未更改的行。
  2. 由于上下文的行与 不同git diff,此函数报告的行号也会与 报告的行号不同git diff
  3. 您可能会看到报告的单行更改的存在,这是正确的行为,但是当您更改的文件包含单个空行的插入时很烦人。我认为git diff通过它的上下文可以更好地处理这个问题。如果您愿意,可以尝试传递不同的选项以diff更好地处理空格。
于 2015-10-21T21:40:28.130 回答
3

把它放在你的 rc 文件中,最常见的是它是.bashrcor .zshrc

diff() { git diff --no-index "$1" "$2" | colordiff; }

要求:git并且colordiff应该已经安装。

用法 :diff file1 file2

于 2017-11-28T17:31:37.597 回答
2

您正在寻找colordiff

sudo apt-get install colordiff
于 2013-01-17T15:45:44.540 回答
1

由于bat具有很好的着色效果,我已经测试过它是否也适用,diff并且令人惊讶的是它开箱即用的效果非常好。

$ diff file1 file2 | bat或者$ diff -u file1 file2 | bat

所以我想你可以使下面这样的函数更有效:

function bdiff () { diff -u $@ | bat;}
于 2020-01-25T18:05:30.197 回答
1

在 debian 9 中测试 diff -u --color=always file1 file2

于 2020-06-26T14:57:16.110 回答
0

另一种选择是从存储库外部执行此操作,以便 git 知道文件之间的差异。例如。一个shell函数类似于:

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}
于 2011-02-03T00:50:26.173 回答
0

如果没有colordiffgit diff,可以通过 获取颜色vim

cdiff() { diff -u $@ | vim -R -; }

或者干脆

cdiff() { diff -u $@ | view -; }
于 2019-09-04T03:05:47.877 回答
0

使用colordiff

安装:

sudo apt-get install colordiff

用法:

colordiff -u file_one file_two

给出与 所示完全相同的差异git diff

于 2018-08-23T11:25:42.917 回答
0

添加

别名 diff="git diff --no-index --"

到 ~/.zshrc 或 ~/.bashrc

这使用 git diff 来做两个文件之间的普通差异

于 2021-08-30T18:31:58.767 回答
-2

我认为配置设置:

[color]
     ui = true

结合“diff”命令的--relative=<path>选项会做你想要的。你试过了吗 ?

于 2011-02-01T02:27:36.933 回答