如何提高git的差异突出显示?

Kar*_*ter 4 git highlighting git-diff highlight

git diff针对代码的输出进行了优化,该代码往往每行仅一个语句,而文本(如果像我这样的作者太懒了而无法使用换行符)会导致diff输出,这很难阅读,并且更多地是“ Wally在哪里?” 搜索比读取差异输出

在此处输入图片说明

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

在此处输入图片说明

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

Hi-*_*gel 16

另外值得一提的是diffr。它是用 Rust 编写的,并使用 Myers 最长公共子序列算法。与 git 相比,diff-highlight它提供了更好的结果,请参阅:

吉特的diff-highlight

差异突出显示

diffr

差异

安装后,使用方法与 类似diff-highlight,即编辑~/.gitconfig,并添加到以下[pager]部分:

[pager]
    log  = diffr | less
    show = diffr | less
    diff = diffr | less
Run Code Online (Sandbox Code Playgroud)

  • 可以确认 diffr 提供了比 diff-highlight 更好的行内更改指示。那个屏幕截图并没有说服我,但我想做的第一件事是,整个 500 个字符的文本块通过 diff-highlight 突出显示,而唯一的实际更改 - 两个额外的“\n” - 通过 diffr 突出显示。谢谢你好天使! (2认同)
  • 参见 GitHub 页面 ([`diffr`](https://github.com/mookid/diffr)) 进行安装。对于 Ubuntu,我安装了 `$cargo install diffr`,并按照 [Integration with git](https://github.com/mookid/diffr#integration-with-git) 中的说明修改了 `.gitconfig`。 (2认同)

Ant*_*ica 8

您可以使用该--word-diff[=<mode>]选项更轻松地查看一行中的哪些单词发生了变化。这在手册页中描述为

显示单词差异,使用<mode>来分隔更改的单词。默认情况下,单词由空格分隔;见--word-diff-regex下文。将<mode>默认为平纹,并且必须是以下之一:

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

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

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

  • none – 再次禁用 word diff。

请注意,尽管第一个模式的名称,如果启用,颜色将用于突出显示所有模式中更改的部分。


Hi-*_*gel 5

word-diff在对方的回答表明不完全gitlab / github上做什么。为了获得相同的效果,可以使用git分发的diff-highlight脚本。

首先,您必须在git安装中列出文件,然后找到的路径diff-highlight。它因系统而异,通常不在$ PATH中。例如在我的Archlinux上/usr/share/git/diff-highlight/diff-highlight,但是在Fedora上 /usr/share/git-core/contrib/diff-highlight

然后,编辑〜/ .gitconfig,并将其添加到以下[pager]部分:

[pager]
    # diff-highlight is script provided by git that shows word-by-word diff
    log  = /usr/share/git/diff-highlight/diff-highlight | less
    show = /usr/share/git/diff-highlight/diff-highlight | less
    diff = /usr/share/git/diff-highlight/diff-highlight | less
Run Code Online (Sandbox Code Playgroud)

现在logdiffshow命令应该表现出的差异字的字。屏幕截图:

git log -1 -p

  • 在 Debian 测试(bullseye)中,它位于文档中(?!)并且没有 diff-highlight/diff-highlight;我能看到的最接近的是 diff-highlight/diff-highlight.perl 并返回此错误:未定义的子例程 &amp;DiffHighlight::highlight_stdin 在 /usr/share/doc/git/contrib/diff-highlight/diff-highlight.perl 第 7 行调用。 (4认同)
  • 更新以上有关 Debian 测试的评论: `cd /usr/share/doc/git/contrib/diff-highlight` 然后: `sudo make` 我有可执行的 diff-highlight。 (4认同)
  • 我的答案与你的非常接近,并且有人正确地指出我应该删除它。您可以指示如何找到路径(find -L /usr -name diff-highlight -type f)并使脚本可执行(sudo chmod +x /usr/share/doc/git/contrib/diff-highlight/ diff-highlight)然后我会删除我的答案? (2认同)

MFo*_*ter 5

Delta是其他答案中后处理工具的现代替代品。

它具有高度可配置性(具有和的模拟模式),并包含其他工具中没有的许多功能:并排视图、语法突出显示以及合并冲突输出的着色。diff-highlightdiff-so-fancygit blame

Delta 文档还概述了相关项目,其中提到了一些可以产生类似输出的临时工具。

Delta diff 格式示例