108

开源项目Trac有一个出色的差异荧光笔 - 它突出显示更改的行和每个更改行中的更改字节!有关示例,请参见此处此处

有没有办法在 bash 终端或diff 输出(补丁文件)中使用相同的颜色突出显示(即更改的行和更改的字节)?gitvim

4

12 回答 12

76

diff-highlightPerl contrib 脚本产生的输出与 Trac 屏幕截图非常相似,Trac 很可能正在使用它:

在此处输入图像描述

安装:

wget https://raw.githubusercontent.com/git/git/fd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78/contrib/diff-highlight/diff-highlight && chmod +x diff-highlight

将文件移动diff-highlight~/bin/目录(或您所在的任何$PATH位置),然后将以下内容添加到您的~/.gitconfig

[pager]
        diff = diff-highlight | less
        log = diff-highlight | less
        show = diff-highlight | less

@cirosantilli 建议的单一复制粘贴安装:

cd ~/bin
curl -O https://raw.githubusercontent.com/git/git/fd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78/contrib/diff-highlight/diff-highlight
chmod +x diff-highlight
git config --global pager.log 'diff-highlight | less'
git config --global pager.show 'diff-highlight | less'
git config --global pager.diff 'diff-highlight | less'
git config --global interactive.diffFilter diff-highlight
于 2013-03-01T02:06:40.653 回答
50

在使用git diffgit log可能还有其他时,使用选项--word-diff=color(顺便说一句,单词差异还有其他模式)

于 2011-03-20T20:01:08.340 回答
23

diff-so-fancydiff专为人类眼球设计的荧光笔。

它删除了对剪切/粘贴来说很烦人的前导+/ -,并在文件之间明确了部分。

彩色git(左)与diff-so-fancy(右 - 注意字符级高光):

diff-so-fancy 输出

如果您想要diff-so-fancy(右侧)输出但不限于git存储库中的文件,请将以下函数添加到您.bashrc以在任何文件上使用它:

dsf() { git diff --no-index --color "$@" | diff-so-fancy; }

例如:

dsf original changed-file

字符级高亮和标准diff格式

如果您不喜欢 的非标准格式diff-so-fancy,但仍想要字符级git突出显示,请使用diff-highlightwhich 将获取git' 的输出并产生非常漂亮的标准diff格式输出:

差异突出屏幕截图

要默认使用它git,请添加到您的.gitconfig

[color "diff-highlight"]
  oldNormal = red bold
  oldHighlight = red bold 52
  newNormal = green bold
  newHighlight = green bold 22

[pager]
  diff = diff-highlight | less -FRXsu --tabs=4

[pager]部分告诉git将其已经着色的输出通过管道传输到diff-highlight字符级别的着色,然后将输出分页到 less (如果需要),而不仅仅是使用 default less

于 2016-09-15T06:16:02.983 回答
16

您想要的行为现在可以在 git 本身中使用(正如 naught101 在评论中指出的那样)。要启用它,您需要将寻呼机设置为

perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less

Ubuntu 13.10 上荧光笔脚本的位置在哪里/usr/share/doc/git/contrib/diff-highlight/diff-highlight(我不知道为什么它在doc文件夹中)。如果您的系统上没有它,请尝试使用locate diff-highlight找到它。请注意,突出显示脚本不可执行(至少在我的机器上),因此需要perl.

要始终将荧光笔用于各种类似 diff 的命令,只需将以下内容添加到您的~/.gitconfig文件中:

[pager]
    log = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less
    show = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less
    diff = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less

我将其添加为新答案 naught101 的评论被埋没了,因为设置并不像应有的那么简单,并且至少在 Ubuntu 版本上,我在自述文件中的说明不起作用。

于 2014-09-15T15:46:21.397 回答
15

自 v1.7.8 1以来,官方 Git 已分发了基于字节的差异的实用程序。您只需找到它在您机器上的安装位置并启用它。

查找 Git 的安装位置

  • 通过Homebrew安装了 Git的 MacOS:它/usr/local/opt/git(更高版本/opt/homebrew/Cellar/git/VERSION:)
  • Windows 与Git for Windows:运行cd / && pwd -W以查找安装目录。
  • Linux:书呆子。如果您还不知道 Git 的安装位置,那么ll $(which git)或者locate git应该提供帮助。

链接diff-highlight到您的 bin 目录,以便您的 PATH 可以找到它

GIT_HOME='/usr/local/opt/git/'  # Use the value from the first step.
ln -s "${GIT_HOME}/share/git-core/contrib/diff-highlight/diff-highlight" \
      '/usr/local/bin/diff-highlight'

在你的 Git 配置中启用它

git config --global interactive.diffFilter diff-highlight # Use on interactive prompts
git config --global pager.diff "diff-highlight | less"    # Use on git diff
git config --global pager.log  "diff-highlight | less"    # Use on git log
git config --global pager.show "diff-highlight | less"    # Use on git show

1这里是v1.7.8 版本,但从那时起已经进行了很多更改。

于 2019-01-17T16:59:38.293 回答
13

我使用--color-words选项,它对我来说很好:

$ git diff --color-words | less -RS
于 2011-05-11T10:49:23.303 回答
7

正如@dshepherd 所说

您想要的行为现在可以在 git 本身中使用

diff-highlight位于 DOC 中,不能从 shell 获得。
要安装diff-highlight到您的~/bin目录中,请按照以下步骤操作(这将节省您的输入):

$ locate diff-highlight
$ cd /usr/share/doc/git/contrib/diff-highlight  #or path you locate
$ sudo make
$ mv diff-highlight ~/bin

然后配置你.gitconfig的官方文档说:

[pager]
    log  = diff-highlight | less
    show = diff-highlight | less
    diff = diff-highlight | less

UPD你也可以在没有任何安装的情况
下尝试 next :git

git diff --color-words=.

更复杂:

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
于 2018-01-26T14:50:46.823 回答
1

比较

GitLab 正在使用 Diffy https://github.com/samg/diffy (Ruby) 来实现类似于 GitHub 和 diff-highlight 的输出:

在此处输入图像描述

Diffy 使用与 Git 相同的算法制作差异本身,并支持不同类型的输出,包括 GitLab 使用的 HTML 输出:

gem install diffy
echo '
  require "diffy"    
  puts Diffy::Diff.new("a b c\n", "a B c\n").to_s(:html)
' | ruby

输出:

<div class="diff">
  <ul>
    <li class="del"><del>a <strong>b</strong> c</del></li>
    <li class="ins"><ins>a <strong>B</strong> c</ins></li>
  </ul>
</div>

请注意如何strong添加到更改的字节中。

于 2014-07-19T07:50:58.083 回答
1

Emacs 具有 ediff-patch-buffer 功能,应该可以满足您的需求。

在 emacs 中打开未打补丁的文件,键入 ESC-x,ediff-patch-buffer。

按照提示操作,您应该会看到文件的修补版本和原始版本的突出显示比较。

根据您的评论,以下将为您提供仅需要 dwdiff 的 bash 解决方案:

#!/bin/bash
paste -d'\n' <(dwdiff -2 -L -c <(cat $2) <(patch $2 -i $1 -o -)) <(dwdiff -1 -L -c <(cat $2) <(patch $2 -i $1 -o -))| uniq
于 2011-03-20T23:29:14.603 回答
1

注意:这是在此处找到的内容的副本:如何改进 git 的差异突出显示?. 不过,也在这里发布我的答案,因为它可能对直接找到此线程的某些人有所帮助:)

正如在之前的一些答案中所说,这只有 git 的东西是可能的。我发布此内容是因为根据您的系统,说明可能更容易遵循,但这与其他几个答案相似。

一种完全依赖 git 及其贡献的解决方案。这不需要比git附带的其他文件。所有解释都是针对 Ubuntu(在 18.04LTS 上测试),应该在其他 linux 系统上类似地工作:

  • 找到 diff-highlight contrib git 片段:
find -L /usr -name diff-highlight -type f

在我的系统上,唯一有效的答案是:

/usr/share/doc/git/contrib/diff-highlight/diff-highlight
  • 使相应的 perl 脚本可执行。就我而言,我需要这样做:
sudo chmod +x /usr/share/doc/git/contrib/diff-highlight/diff-highlight
  • 通过添加来更新您~/.gitconfig以获得所需的结果(注意这些是 TABS,而不是 4 个空格):
[color "diff-highlight"]
    oldNormal = red
    oldHighlight = red 52
    newNormal = green
    newHighlight = green 22
  • 享受结果(注意:这仅适用于差异着色+突出显示,当然,我还有其他事情在此处用于提示:))。

差异高亮

于 2020-04-01T12:29:04.083 回答
0

是的,Vim 这样做包括突出显示一行内更改的文本。有关如何区分文件的更多详细信息,
请参阅:h diff和。:h 08.7

Vim 使用一种相当简单的算法来突出显示。它在该行中搜索第一个更改的字符,然后是最后一个更改的字符,并简单地突出显示它们之间的所有字符。
这意味着每行不能有多个亮点 - Vim 中的许多设计决策优先考虑效率。

于 2011-03-16T13:58:03.533 回答
0

vimdiff file1 file2将显示两个文件之间的字符差异。

vimdiff 是一个包含在 vim 中的 diff 工具。(Vim 应该用 +diff 选项编译,以确保你可以检查:version

您也可以从 vim 内部启动它。有关:help diff更多信息和命令,请参阅。

于 2011-03-16T13:58:14.607 回答