git-diff 控制台默认颜色含义

git-diff console default colors meanings

我现在有点迷失在控制台中 git-diff 默认配色方案中各种颜色的含义。我似乎找不到关于它们的任何文档。我在 Manjaro/XFCE.

中使用 xfce4-terminal

git-diff 的默认配色方案似乎是“斑马”。我的 diff 中显示了八个导入语句,用 7 种不同的颜色表示。这对我来说似乎有点疯狂。

谢谢。

TL;DR

您可能在 Git 配置中设置了 diff.colorMoved(运行 git config --get diff.colorMoved;要查看设置者,请使用 git config --list --show-origin)。默认 if 请求此模式确实是 zebra,这显然让你想起了它对我所做的同样的事情:Angry Fruit Salad.

回到昏暗的时代,没有颜色。我们很感激 Glass TTY 取代了我们的旧打印机。 Plain diff 被发明出来,它提到了三件事:

  • 添加行,由 a 表示;
  • 删除行,用d表示;和
  • 更改行,由 c 表示。

例如:

$ cat old
$ cat old
line one
line two
line three
line four
line five
$ cat new
line one
inserted
line two
line four
line 5
$ diff old new
1a2
> inserted
3d3
< line three
5c5
< line five
---
> line 5

后来,发明了 context diff 作为一种更有用的方式来展示这一点:

$ diff -c old new
*** old 2021-09-13 16:11:48.145950000 -0700
--- new 2021-09-13 16:11:56.597068000 -0700
***************
*** 1,5 ****
  line one
  line two
- line three
  line four
! line five
--- 1,5 ----
  line one
+ inserted
  line two
  line four
! line 5

标记字母 adc 替换为行前标记 +-!分别.

当然,“更改”只是“删除和添加”的意思。在 unified 模式下,plain diff 使用这些代替,所以不再有 !:

$ diff -u old new
--- old 2021-09-13 16:11:48.145950000 -0700
+++ new 2021-09-13 16:11:56.597068000 -0700
@@ -1,5 +1,5 @@
 line one
+inserted
 line two
-line three
 line four
-line five
+line 5

我将跳过“上下文”和“统一”差异之间的确切区别,因为它并不那么有趣,但两者都提供了上下文。 “统一”通常会使输出更小,更易于人类阅读,但代价是使机器解析稍微困难一些。

Colo(u)r 和 Git

最终,我们的黑白显示器让位于彩色、开窗和所有其他花哨的东西。很自然地,有人为 diff 输出添加了颜色:红色代表删除的文本,绿色代表添加的文本,这很常见。毫无疑问,选择它是因为最常见的色盲形式是红绿色。所以,随之而来的是 git diff,它使用这些颜色来抛弃左列(“装订线”)插入以摆脱空格和 +- 标记......哦,等等,它不会:

$ git diff old new
diff --git a/old b/new
index 9864d22..8e331db 100644
--- a/old
+++ b/new
@@ -1,5 +1,5 @@
 line one
+inserted
 line two
-line three
 line four
-line five
+line 5

这解决了色盲问题,对吧?

(它在 Whosebug 上没有以纯文本显示,但是 @@ 大块头是青色的,+inserted 行是绿色的,等等。)

人们对此并不满意,人类视觉系统确实非常擅长发现某些颜色差异(模常见的色盲问题:它影响大约 8% 的男性和 .5% 的女性;例如,参见 https://www.colourblindawareness.org/colour-blindness/;许多人甚至不知道他们拥有它!)。所以人们开发了更多的过滤器和模式。一些网站(特别是 GitHub)采用基本的 red/green 并对其进行标记,以在 一行内显示个别更改的字符 ,这可能相当有时有用。

Git 获得了 post-检测 moved 行的能力。1 以帮助区分从删除和添加的行中移动行,Git 可以为这些行添加不同的颜色。

启用“移动行”检测的开关是 .git/config$HOME/.gitconfig 或其他 Git 配置文件中的 diff.colorMoved,由 [=38= 操作],以及命令行 --color-moved 选项。它们采用可选的 ,这是要使用的配色方案的名称。

如果您在配置中启用颜色移动,您可以使用 --no-color-moved 禁用一次 git diff 调用。如果您尚未在配置中启用它,则可以使用 --color-moved--color-moved=<em>mode[=110 对每个 <code>git diff 调用进行测试=]。有许多 mode 值;有关详细信息,请参阅 the git diff documentation

有关 运行ning git config 的信息,请参阅 the git config documentation,包括如何确定某些系统提供的配置可能来自何处 (--list --show-origin)。


1有差异引擎会在差异期间检测到这个,但是Git仍然主要使用那些不't(虽然 git blame 在这里不同)。相反,Git post - 在各种尝试中处理 diff 输出以使其更符合人类的期望,例如,在空行上同步更多而不是在大括号上或其他什么。这包括当前的移动线检测,它只在每个“diff hunk”中查找。