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

Nik*_*sev 79 git vim diff highlight word-diff

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

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

小智 52

diff-highlightPerl中的contrib脚本产生输出,类似于Trac的截图,它很可能是Trac的是使用它的:

在此输入图像描述

安装时间:

wget https://raw.githubusercontent.com/git/git/fd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78/contrib/diff-highlight/diff-highlight && chmod +x diff-highlight
Run Code Online (Sandbox Code Playgroud)

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

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

@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'
Run Code Online (Sandbox Code Playgroud)

  • 啊,这是核心git的一部分:https://github.com/git/git/tree/master/contrib/diff-highlight (20认同)
  • 这会错过您通过`git add -p` 看到的差异。另请添加:`git config --global interactive.diffFilter diff-highlight` (4认同)
  • 这不仅是核心git的一部分,还与git一起分发,并且可能已经存在于您的系统中。我在下面的答案中添加了有关如何启用它的详细信息。↓ (3认同)
  • 它现在已经变成了一个模块,我认为最简单的下载版本是在更改之前的那个版本:https://raw.githubusercontent.com/git/git/fd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78/contrib/diff-highlight/diff-highlight (2认同)
  • 人们可能需要在 `/usr/share/doc/git/contrib/diff-highlight` 中运行 `make` 来获取 `/usr/share/doc/git/contrib/diff-highlight/diff-highlight` (参见 [这个](https://github.com/git/git/commit/0c977dbc8180892af42d7ab9235fd3e51d6c4078#diff-85dd20b8c447c2408077fd572f07370d229729275f993f9a7230be05cb0a1112)提交) (2认同)

any*_*dot 37

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

  • 我想在每个更改的行中突出显示更改的行和更改的字节,例如在Trac中.不只是改变了字节,它也不一样. (6认同)
  • 所以,你唯一缺少的是标记颜色/不知何故同时改变了行和字节? (4认同)
  • `--word-diff = color`真的更好(尤其是`git config color.diff.old"red reverse"`和`git config color.diff.new"green reverse"`),但它不是我的意思想:( (2认同)

Tom*_*ale 13

diff-so-fancy是一款diff专为人眼设计的高亮镜.

它删除了前导+/ -哪些是令人烦恼的剪切/粘贴,并在文件之间制作清晰的部分.

彩色git(左)vs diff-so-fancy(右 - 注意角色级别的高光):

差异化的输出

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

dsf() { git diff --no-index --color "$@" | diff-so-fancy; }
Run Code Online (Sandbox Code Playgroud)

例如:

dsf original changed-file
Run Code Online (Sandbox Code Playgroud)

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

如果你不喜欢非标准的格式化diff-so-fancy,但仍然需要字符级git高亮,那么使用diff-highlight哪个将git输出并产生非常漂亮的标准diff格式输出:

diff-highlight截图

要默认使用它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
Run Code Online (Sandbox Code Playgroud)

[pager]部分告诉git管道已经着色的输出到diff-highlight字符级别的颜色,然后用较少的页面输出(如果需要),而不是仅使用默认值less.


dsh*_*erd 11

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

perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less
Run Code Online (Sandbox Code Playgroud)

/usr/share/doc/git/contrib/diff-highlight/diff-highlightUbuntu 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
Run Code Online (Sandbox Code Playgroud)

我添加了这个作为一个新的答案naught101的评论被埋没,因为设置不是应该是那么简单,至少在Ubuntu的版本,我有README中的说明不起作用.

  • 这应该现在在git 2.9.0中工作:`git config interactive.diffFilter diff-highlight` (5认同)

小智 10

我使用--color-words选项,它适用于我:

$ git diff --color-words | less -RS
Run Code Online (Sandbox Code Playgroud)

  • 不,这***显示单词的差异.OP(和我)想要的是正常的逐行差异,突出显示单词差异(因此,不同的行是彩色文本,这些行中的单词差异是普通的彩色文本,带有彩色突出显示或东西).请参阅问题中的示例链接. (5认同)

Cor*_*ein 8

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

查找安装Git的位置

  • 通过Homebrew安装了Git的MacOS :/usr/local/opt/git
  • 带有Windows的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'
Run Code Online (Sandbox Code Playgroud)

在您的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
Run Code Online (Sandbox Code Playgroud)

1这是v1.7.8版本,但此后进行了许多更改

  • 这将是很好的!随时添加该信息。尽管Git确实捆绑了`diff-highlight`,但实际上并没有安装它,因此,符号链接步骤确实是必需的(至少在macOS上如此)。如果发现您的平台不是必需的,请再次更新答案。同时,“ git”通常会起作用,因为Git _does_在路径上的某个位置安装了“ git”二进制文件。 (2认同)
  • 请注意,在 debian stable 中我需要“编译”这个文件,因为我只有一个“.perl”。编译很简单:只需在“diff-highlight”目录中运行“sudo make”即可。 (2认同)

Eug*_*kov 6

正如@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
Run Code Online (Sandbox Code Playgroud)

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

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

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

git diff --color-words=.
Run Code Online (Sandbox Code Playgroud)

更复杂:

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
Run Code Online (Sandbox Code Playgroud)


PDu*_*Dug -1

是的,Vim 会执行此操作,包括突出显示行内更改的文本。有关如何比较文件的更多详细信息,请
参阅:h diff和。:h 08.7

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