如何使diff像git-diff一样工作?


148

我喜欢的输出格式git diff。颜色和行之间更改的+/ -表示比GNU diff更易于阅读。

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

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

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


1
为了使对增加绿色,变革的蓝色newtext/etc/colordiff。我认为git使用绿色?
Rudie 2015年

1
到目前为止,我从未听说过--no-index标志。我只是用它来比较git show和两个文件的差异输出-谢谢!
AJM-恢复-莫妮卡

Answers:


175

我不知道该怎么做颜色,但这会做+/-而不是<>

diff -u file1 file2

6
太酷了,这与colordiff结合使我足够接近我想要的东西。猜猜我下次需要进一步滚动手册页...谢谢!
Mzzzzzz'2

13
一个简单的方法来获得着色与差异-u,也是管道输出到TIG,命令行的git回购观众:diff -u file1 file2 | tig
塞缪尔·兰帕

3
安装colordiff从易/荫/吃豆子库,并使用它。
iBug

需要实现额外的企业版Linux(EPEL)在亚马逊的Linux软件包安装colordiffdocs.aws.amazon.com/AWSEC2/latest/UserGuide/...
帕特迈伦

1
此外colordiff,您还可以vim通过定义来获得色彩cdiff() { diff -u $@ | vim -R -; }
Syrtis Major

94

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


1
+1,但遗憾的是,如果其中一个文件是符号链接,则此操作将无效。
埃米尔·伦德伯格

2
+1这是非常有用的,因为它展示了如何git的报告,其中两个跟踪文件 A,并B在比较不同与彼此,而不是每个文件已经相对于他们的最后修订各自的修改。
J. Katzwinkel,2015年

@EmilLundberg:在Linux上的git 1.9.1中通过符号链接为我工作。我不知道早期版本是否损坏。
kkm

3
git diff --no-index很棒,但是正如OP所指出的那样,它没有--exclude标志,因此其用途通常非常有限。
肯·威廉姆斯

25
  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用于递归比较路径。

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


18

这是我的建议,非常接近

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; }

4
要为此具有单个bash函数,请添加到.bashrc中:function gdiff () { diff -u $@ | colordiff | less -R; }
CiprianTomoiagă14年

4

根据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在那种情况下为我修复它。


3

仅使用bashdifftput,和less,我们可以非常接近的输出git diff。但是,由于diff程序员的目光短浅,将存在一些明显的差异。

将以下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如果愿意,您可以尝试传递不同的选项以更好地处理空白。


2

将此放置在您的.bashrc或中.zshrc

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

要求:git并且colordiff应事先安装。

用法: diff file1 file2

例如:$diff .tmux.conf .zshrc.pre-oh-my-zsh

diff函数示例


0

另一个选择是从存储库外部执行此操作,以便git知道在文件之间进行区分。例如。一个shell函数,例如:

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}

0

使用colordiff

安装:

sudo apt-get install colordiff

用法:

colordiff -u file_one file_two

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


0

如果您没有colordiffgit diff,则可以通过获得颜色vim

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

或简单地

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

0

由于bat具有很好的着色效果,因此我测试了该效果是否也可以使用,diff并且令人惊讶的是,它开箱即用地效果很好。

$ diff file1 file2 | bat 要么 $ diff -u file1 file2 | bat

因此,我想您可以使下面的函数更高效:

function bdiff () { diff -u $@ | bat;}


-2

我认为配置设置:

[color]
     ui = true

结合“ diff”命令的--relative=<path>选项可以完成您想要的操作。你试过了吗 ?


3
这是针对的差异git。他要求提供 diff程序选项
tr33hous,2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.