"git diff"中的"diff --git"输出是指什么?

JHZ*_*JHZ 20 git

当我运行时git diff,输出开始于:

diff --git a/foo/bar b/foo/bar
Run Code Online (Sandbox Code Playgroud)

如果我尝试运行普通的旧版本diff --git,我会被告知该--git选项不存在(显然,我认为,对于低级别工具来说,了解特定的DVCS似乎很愚蠢).man页面中也没有提到它.这是从哪里来的?

Kei*_*son 20

它是一个"虚构的差异选项",用于向读者表明它不仅仅是运行diff命令的输出.例如,在git自己的git repo中:

$ git diff HEAD~1..HEAD | head
diff --git Documentation/git.txt Documentation/git.txt
index bd659c4..7913fc2 100644
--- Documentation/git.txt
+++ Documentation/git.txt
@@ -43,6 +43,11 @@ unreleased) version of Git, that is available from the 'master'
 branch of the `git.git` repository.
 Documentation for older releases are available here:

+* link:v2.10.0/git.html[documentation for release 2.10]
+
$ 
Run Code Online (Sandbox Code Playgroud)

diff命令本身,如果你使用相同的文件名调用它两次,会显示无显着差异.git可能会创建对应于两个不同版本的临时文件Documentation/git.txt并将其提供给diff- 但这些临时文件的名称不会有用.我认为git diff按摩输出diff会使读者更有意义.

潜入git源代码,diff.c将字符串"diff --git"硬连接为字符串文字:

strbuf_addf(&header, "%s%sdiff --git %s %s%s\n", line_prefix, meta, a_one, b_two, reset);
Run Code Online (Sandbox Code Playgroud)

并查看diff.c包含该字符串的最早版本的历史记录:

$ git log -n 1 b58f23b3
commit b58f23b38a9a9f28d751311353819d3cdf6a86da
Author: Junio C Hamano <junkio@cox.net>
Date:   2005-05-18 09:10:47 -0700

    [PATCH] Fix diff output take #4.

    This implements the output format suggested by Linus in
    <Pine.LNX.4.58.0505161556260.18337@ppc970.osdl.org>, except the
    imaginary diff option is spelled "diff --git" with double dashes as
    suggested by Matthias Urlichs.

    Signed-off-by: Junio C Hamano <junkio@cox.net>
    Signed-off-by: Linus Torvalds <torvalds@osdl.org>
$ 
Run Code Online (Sandbox Code Playgroud)

可能<Pine.LNX...>是某个邮件列表中某些电子邮件的消息ID.在任何情况下,这个提交消息都清楚地表明它diff --git是一个"虚构的diff选项".

这篇由nos在评论中引用的电子邮件似乎是导致这一点的讨论的一部分.