突出显示每个更改行中更改的行和更改的字节

时间:2011-03-16 13:29:24

标签: git vim diff highlight word-diff

开源项目Trac有一个优秀的差异突出显示器 - 它突出显示更改的行并更改了每个更改行中的字节数!有关示例,请参阅herehere

是否可以在bash终端中使用相同的颜色突出显示(即更改的行和更改的字节),gitvim 用于diff输出(补丁文件)吗

12 个答案:

答案 0 :(得分:48)

diff-highlight Perl contrib script生成的输出与Trac截图的输出非常相似,Trac可能正在使用它:

enter image description here

安装时:

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'

答案 1 :(得分:33)

在使用git diffgit log以及可能的其他人时,请使用选项--word-diff=color(还有其他模式用于单词差异BTW)

答案 2 :(得分:12)

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

它删除了对剪切/粘贴感到烦恼的前导+ / -,并在文件之间做了清晰的部分。

有色git(左)vs diff-so-fancy(右 - 请注意字符级高亮):

diff-so-fancy output

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

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

例如:

dsf original changed-file

字符级别突出显示和标准diff格式

如果您不喜欢diff-so-fancy的非标准格式,但仍想要字符级git突出显示,请使用diff-highlightgit输出并生成非常标准的diff - 格式输出:

diff-highlight screenshot

默认情况下,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

答案 3 :(得分:10)

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

$ git diff --color-words | less -RS

答案 4 :(得分:9)

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

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

其中/usr/share/doc/git/contrib/diff-highlight/diff-highlight是Ubuntu 13.10上的突出显示脚本的位置(我不知道为什么它在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的版本上,我有README don'中的说明工作。

答案 5 :(得分:6)

自v1.7.8 1 开始,官方Git便已发布了基于字节的差异的实用程序。您只需要找到计算机上的安装位置并启用它即可。

查找安装Git的位置

  • 通过Homebrew安装了Git的MacOS:它是/usr/local/opt/git
  • 具有Git for Windows的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 version,但此后已经制作了lots of changes

答案 6 :(得分:4)

@dshepherd says

  

您想要的行为现在可以在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
您也可以在最新的git上尝试下一个,无需任何安装:

git diff --color-words=.

更复杂:

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'

答案 7 :(得分: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

答案 8 :(得分:1)

<强> Diffy

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

enter image description here

Diffy使用相同的算法ad Git使diff本身,并支持不同类型的输出,包括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如何添加到更改的字节中。

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

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

vimdiff是包含在vim中的diff工具。 (Vim应该使用+ diff选项编译,以确保您可以使用:version进行检查)

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

答案 11 :(得分:0)

注意:这与这里的How to improve git's diff highlighting?重复。不过,也将我的答案发布在这里,因为这可能对直接找到此线程的某些人有用:)

如先前的回答所述,只有git的东西才有可能。我将其发布,因为根据您的系统,说明可能会更容易遵循,但这与其他几个答案类似。

一种完全依赖git及其贡献的解决方案。除了 git 附带的文件之外,不需要其他文件。所有说明均针对Ubuntu(已在18.04LTS上测试),在其他Linux系统上应具有类似的作用:

  • 找到diff-highlight贡献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
  • 享受结果(注意:这仅用于diff着色+高亮显示,当然,在提示时我也有其他要求:))。

diff-highligh