如何改进git';s差异突出显示?

如何改进git';s差异突出显示?,git,highlight,highlighting,git-diff,Git,Highlight,Highlighting,Git Diff,git diff的输出被优化为每行一条语句的代码,而文本(如果像我这样的作者懒得使用换行符)会导致diff输出,这很难阅读,更像是“Where's Wally?”搜索,而不是阅读diff输出 而在GitLab或GitHub的web前端上突出显示则立即显示出差异 我知道我在比较HTML和纯文本(苹果和橘子),但是应该可以通过使用不同的颜色或在更改周围添加标记字符来改进git diff输出(JUnit在插入周围使用[],这不是很好阅读,但我的意思是一个示例)这将是我第一次希望在git中有一些实际

git diff
的输出被优化为每行一条语句的代码,而文本(如果像我这样的作者懒得使用换行符)会导致diff输出,这很难阅读,更像是“Where's Wally?”搜索,而不是阅读diff输出

而在GitLab或GitHub的web前端上突出显示则立即显示出差异

我知道我在比较HTML和纯文本(苹果和橘子),但是应该可以通过使用不同的颜色或在更改周围添加标记字符来改进
git diff
输出(JUnit在插入周围使用
[]
,这不是很好阅读,但我的意思是一个示例)这将是我第一次希望在git中有一些实际不可用的东西。

您可以使用
--word diff[=]
选项,以便更容易地查看一行中哪些单词发生了更改。这在手册页中描述为

显示单词diff,使用
分隔已更改的单词。默认情况下,单词由空格分隔;请参见下面的
--word diff regex
默认为普通,并且必须是以下选项之一:

  • color
    –仅使用颜色突出显示更改的单词。暗示
    --颜色

  • plain
    –将单词显示为
    [-removed-]
    {+added+}。
    如果分隔符出现在输入中,则不会尝试转义,因此输出可能不明确

  • 陶瓷
    –使用专门用于脚本使用的基于行的特殊格式。添加/删除/未更改的运行以通常的统一差异格式打印,从行首的
    +/-/`
    字符开始,一直延伸到行尾。输入中的换行符由其自身行上的波浪号
    ~
    表示

  • none
    –再次禁用word diff

请注意,尽管第一个模式的名称不同,但如果启用,颜色将用于高亮显示所有模式中已更改的零件


另一个答案中建议的diff这个词与gitlab/github所做的并不完全一样。要获得相同的效果,可以使用
diff highlight
脚本

  • 首先找到
    diff highlight
    脚本的路径。它因系统而异,通常不在$PATH中。您可以通过软件包管理器找到它,例如:

  • Fedora:
    rpm-ql git|grep diff highlight
  • Debian/Ubuntu/Mint:
    dpkg-L git | grep diff highlight
  • Archlinux:
    pacman-qlgit | grep diff highlight
  • 编辑
    ~/.gitconfig
    ,并将以下内容添加到
    [pager]
    部分(替换路径):

    [寻呼机]
    #diff highlight是git提供的脚本,它逐字显示diff
    log=perl/usr/share/git/diff highlight/diff highlight | less
    show=perl/usr/share/git/diff highlight/diff highlight | less
    diff=perl/usr/share/git/diff highlight/diff highlight | less
    
    我在这里使用的是
    perl
    ,而不是直接调用脚本,因为有些发行版似乎没有在脚本上设置可执行位。IMO这是一个包错误,应该报告。不管怎么说,不管怎样,这个答案应该是有效的

  • 现在,
    log
    diff
    show
    命令应该逐字显示差异。截图:

    同样值得一提的是。它是用Rust编写的,并使用Myers最长的通用子序列算法。与git的
    diff highlight
    相比,它提供了更好的结果,请参见:

    git的
    差异突出显示

    衍射

    安装后,使用它类似于
    diff highlight
    ,即编辑~/.gitconfig,并添加到
    [pager]
    部分,如下所示:

    [寻呼机]
    对数=衍射小于
    显示=衍射小于
    diff=衍射|小于
    
    我的答案与你的答案非常接近,有人正确地指出我可能应该删除它。您是否可以指示如何找到路径(find-L/usr-name diff highlight-type f)并使脚本可执行(sudo chmod+x/usr/share/doc/git/contrib/diff highlight/diff highlight),然后我将删除我的答案?@Zorglub29好的,因此,我采纳了您的建议。我正在考虑使用
    find
    命令和一些技巧来获得路径,这将是我们的
    /usr
    ,并将在更广泛的发行版上工作。但是在我运行了
    find/usr
    之后,直到我停止它,它才在10秒钟内返回,我认为使用
    find
    是个坏主意。它速度很慢,而且会无缘无故地污染文件缓存。我添加了几个使用包管理器的示例。关于未设置的可执行位,请注意,在git包更新之后,您的更改将丢失。为了解决这个问题,我在答案中直接调用了
    perl
    。最近的编辑确实改进了这个答案。值得一提的是,我使用了
    locate
    实用程序来获取
    diff highlight
    脚本的路径(它已经在最近的Fedora上可执行了,但在Ubuntu 16.04上没有)。在Debian测试(bullseye)中,它在doc(?)中,没有diff highlight/diff highlight;我能看到的最近的是diff-highlight/diff-highlight.perl,它返回这个错误:未定义的子例程&DiffHighlight::highlight\u stdin在/usr/share/doc/git/contrib/diff-highlight/diff-highlight.perl第7行调用。关于Debian测试的上述注释更新:
    cd/usr/share/doc/git/contrib/diff-highlight
    制作,我就有了可执行的diff-highlight。另请参阅,我可以确认diff提供了比diff highlight更好的行内更改指示。那张截图没有卖给我,但是