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

时间:2016-10-03 15:05:40

标签: git

当我运行git diff时,输出以:

开头
diff --git a/foo/bar b/foo/bar

如果我尝试运行普通的diff --git,我会被告知--git选项不存在(显然,我想,对于低级工具来说,知道它似乎很愚蠢关于特定的DVCS)。 man页面中也没有提及它。这是从哪里来的?

3 个答案:

答案 0 :(得分:17)

这是一个“虚构的差异选项”,用于向读者表明它不是只是运行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]
+
$ 

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);

查看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>
$ 

据推测,<Pine.LNX...>是某个邮件列表中某些电子邮件的消息ID。无论如何,这个提交消息清楚地表明diff --git是一个“虚构的差异选项”。

nos在评论中引用的{p> This email message似乎是导致这种情况的讨论的一部分。

答案 1 :(得分:1)

--git意味着差异在&#34; git&#34;差异格式。它没有引用/usr/bin/diff命令和选项您可以找到diff format文档列表。其他格式是:

  • diff --combined
  • diff --cc
  • diff --summary

答案 2 :(得分:0)

正如Keith所提到的,在GNU diff(使用diff -v检查版本)中,您可以使用--label来获得git样式的补丁,如下所示:

备份中的单个文件

diff -u --label a/path/to/file.ext --label b/path/to/file.ext path/to/file.ext~ path/to/file.ext

或来自STDIN

command_that_outputs_previous_version | diff -u --label a/path/to/file.ext --label b/path/to/file.ext - path/to/file.ext

您可以在find等文件的循环中使用这些命令。在不存在比较一侧的情况下,例如新文件,然后与/dev/null进行比较。