设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
- 2.50.1 无更改
- 
        2.50.0
          
            
                                     2025-06-16 2025-06-16
描述
显示通过标准输入提供的文件对的更改。此命令的输入必须是NUL终止的原始输出格式,如git diff-tree -z -r --raw等命令生成的那样。默认情况下,当标准输入关闭时,计算并以补丁格式显示输出的差异。
可以在原始输入行之间向标准输入写入单个NUL字节,以计算截至该点的文件对差异,而不是等待标准输入关闭。输出中也会写入一个NUL字节,以分隔这些批次的差异。
使用此命令可以将传统的差异管道分解为不同的阶段,其中diff-pairs充当输出阶段。其他命令,例如diff-tree,可以作为前端来计算用作输入的原始差异格式。
除了通过git diff-tree -p -M一步计算差异外,diff-tree可以计算文件对和重命名信息,而无需二进制对象差异。此输出可以馈送给diff-pairs以生成底层的二进制对象差异,如下例所示
git diff-tree -z -r -M $a $b | git diff-pairs -z
提前计算包含重命名信息的树差异,允许diff-pairs的补丁输出在多次调用过程中逐步计算。
diff-pairs目前不支持路径规范。路径规范限制应由生成原始差异作为输入的上游命令执行。
目前不支持树对象作为输入,它们将被拒绝。
diff-pairs输入中不支持缩写对象ID。输出的对象ID可以使用--abbrev选项进行缩写。
选项
- -p
- -u
- --patch
- 
生成补丁(参见 使用 -p 生成补丁文本)。 
- -s
- --no-patch
- 
抑制所有差异机制的输出。对于默认显示补丁的命令(如 gitshow)非常有用,可以抑制其输出,或者在别名中取消命令行上早期--patch、--stat等选项的效果。
- -U<n>
- --unified=<n>
- 
生成包含 <n> 行上下文(而不是通常的三行)的 diff。隐含 --patch。
- --output=<file>
- 
输出到特定文件而不是标准输出。 
- --output-indicator-new=<char>
- --output-indicator-old=<char>
- --output-indicator-context=<char>
- 
指定用于指示生成补丁中新行、旧行或上下文行的字符。通常它们分别是 +、-和 ' '。
- --raw
- 
以原始格式生成 diff。这是默认设置。 
- --patch-with-raw
- 
-p--raw的同义词。
- --indent-heuristic
- 
启用启发式算法,该算法会移动差异块边界,使补丁更易于阅读。这是默认设置。 
- --no-indent-heuristic
- 
禁用缩进启发式算法。 
- --minimal
- 
花费额外时间以确保生成最小的差异。 
- --patience
- 
使用“patience diff”算法生成差异。 
- --histogram
- 
使用“histogram diff”算法生成差异。 
- --anchored=<text>
- 
使用“anchored diff”算法生成差异。 此选项可以多次指定。 如果一行在源和目标中都存在,只存在一次,并且以 <text> 开头,则此算法会尝试阻止其在输出中显示为删除或添加。它内部使用“patience diff”算法。 
- --diff-algorithm=(- patience|- minimal|- histogram|- myers)
- 
选择一种差异算法。变体如下: 例如,如果您将 diff.algorithm变量配置为非默认值,但希望使用默认值,则必须使用--diff-algorithm=default选项。
- --stat[- =<宽度>[- ,<名称宽度>[- ,<计数>]]]
- 
生成差异统计。默认情况下,文件名部分将使用所需的最大空间,其余空间用于图表部分。最大宽度默认为终端宽度,如果未连接到终端则为80列,可以通过<width>覆盖。文件名部分的宽度可以通过在逗号后提供另一个宽度<name-width>来限制,或者通过设置 diff.statNameWidth=<name-width>来限制。图表部分的宽度可以通过使用--stat-graph-width=<graph-width>或设置diff.statGraphWidth=<graph-width>来限制。使用--stat或--stat-graph-width会影响所有生成统计图的命令,而设置diff.statNameWidth或diff.statGraphWidth则不会影响gitformat-patch。通过给出第三个参数<count>,可以将输出限制为前<count>行,如果还有更多行,则后面跟着...。这些参数也可以通过 --stat-width=<width>、--stat-name-width=<name-width>和--stat-count=<count>单独设置。
- --compact-summary
- 
输出扩展头信息的精简摘要,例如文件创建或删除(“new”或“gone”,如果是符号链接则可选 +l)以及模式更改(分别用+x或-x表示添加或删除可执行位)在差异统计中。信息置于文件名部分和图表部分之间。隐含--stat。
- --numstat
- 
与 --stat类似,但以十进制表示法显示添加和删除的行数,以及不带缩写的路径名,使其更便于机器读取。对于二进制文件,输出两个-而不是00。
- --shortstat
- 
仅输出 --stat格式的最后一行,其中包含修改文件的总数,以及添加和删除的行数。
- -X[<参数>- ,...]
- --dirstat[- =<参数>- ,...]
- 
输出每个子目录的相对更改量分布。 --dirstat的行为可以通过传递逗号分隔的参数列表进行自定义。默认值由diff.dirstat配置变量控制(参见git-config[1])。以下参数可用- 更改
- 
通过计算从源中删除或添加到目标中的行数来计算目录统计数字。这会忽略文件中纯代码移动的数量。换句话说,文件中行的重新排列不会像其他更改那样被大量计算。这是未给出参数时的默认行为。 
- 行
- 
通过执行常规的基于行的差异分析,并汇总删除/添加的行数来计算目录统计数字。(对于二进制文件,改为计算64字节的块,因为二进制文件没有自然的行概念)。这是一种比 changes行为更昂贵的--dirstat行为,但它确实会像其他更改一样计算文件中重新排列的行。结果输出与您从其他--*stat选项获得的输出一致。
- 文件
- 
通过计算更改的文件数量来计算目录统计数字。每个更改的文件在目录统计分析中同等计数。这是计算成本最低的 --dirstat行为,因为它根本不需要查看文件内容。
- 累计
- 
也计算子目录中对父目录的更改。请注意,当使用 cumulative时,报告的百分比总和可能会超过100%。默认(非累计)行为可以使用noncumulative参数指定。
- <限制>
- 
一个整数参数,指定一个截止百分比(默认为 3%)。对更改贡献低于此百分比的目录不会显示在输出中。 
 示例:以下将计算更改的文件,同时忽略更改文件总数少于10%的目录,并在父目录中累积子目录计数: --dirstat=files,10,cumulative。
- --cumulative
- 
--dirstat=cumulative的同义词。
- --dirstat-by-file[- =<参数>- ,...]
- 
--dirstat=files,<param>,...的同义词。
- --summary
- 
输出扩展头信息的精简摘要,例如创建、重命名和模式更改。 
- --patch-with-stat
- 
-p--stat的同义词。
- -z
- 
当给出 --raw、--numstat、--name-only或--name-status时,不混淆路径名,并使用NUL作为输出字段终止符。如果没有此选项,包含“不寻常”字符的路径名将按照配置变量 core.quotePath的解释进行引用(参见 git-config[1])。
- --name-only
- 
仅显示后像树中每个已更改文件的名称。文件名通常以 UTF-8 编码。有关更多信息,请参阅 git-log[1] 手册页中关于编码的讨论。 
- --name-status
- 
仅显示每个更改文件的名称和状态。关于状态字母的含义,请参见 --diff-filter选项的描述。与--name-only一样,文件名通常以UTF-8编码。
- --submodule[- =<格式>]
- 
指定如何显示子模块中的差异。当指定 --submodule=short时,使用short格式。此格式仅显示范围开头和结束处的提交名称。当指定--submodule或--submodule=log时,使用log格式。此格式列出范围内的提交,就像git-submodule[1]summary所做的那样。当指定--submodule=diff时,使用diff格式。此格式显示提交范围内子模块内容更改的内联差异。默认为diff.submodule,如果未设置配置选项则为short格式。
- --color[- =<何时>]
- 
显示彩色差异。 --color(即不带=<when>)与--color=always相同。<when>可以是always、never或auto之一。
- --no-color
- 
关闭彩色 diff。它与 --color=never相同。
- --color-moved[- =<模式>]
- 
移动的代码行以不同颜色显示。如果未给出此选项,*<mode>*默认为 no;如果给出不带模式的选项,则默认为zebra。模式必须是以下之一:- 无
- 
移动的行不进行高亮显示。 
- 默认
- 
是 zebra的同义词。未来可能会更改为更合理的模式。
- 普通
- 
在某个位置添加但在另一位置删除的任何行将使用 color.diff.newMoved着色。类似地,在差异中其他地方添加的已删除行将使用color.diff.oldMoved。此模式会捕获任何移动的行,但在审查中判断代码块是否未经置换而移动时,它并不是很有用。
- 块
- 
贪婪地检测至少20个字母数字字符的移动文本块。检测到的块使用 color.diff.(old|new)Moved颜色绘制。相邻块无法区分。
- 斑马
- 
移动文本块的检测方式与 blocks模式相同。这些块使用color.diff.(old|new)Moved颜色或color.diff.(old|new)MovedAlternative颜色绘制。两种颜色之间的变化表示检测到新的块。
- 暗淡斑马
- 
与 zebra类似,但会对移动代码中不重要的部分进行额外的调暗处理。两个相邻块的边界行被认为是重要的,其余部分则不重要。dimmed_zebra是一个已弃用的同义词。
 
- --no-color-moved
- 
关闭移动检测。这可以用于覆盖配置设置。它与 --color-moved=no相同。
- --color-moved-ws=<模式>- ,...
- 
这配置了在执行 --color-moved的移动检测时如何忽略空白。这些模式可以作为逗号分隔的列表给出:
- --no-color-moved-ws
- 
执行移动检测时不忽略空白。这可以用于覆盖配置设置。它与 --color-moved-ws=no相同。
- --word-diff[- =<模式>]
- 
默认情况下,单词由空白分隔;参见下面的 --word-diff-regex。<mode> 默认为plain,并且必须是以下之一:请注意,尽管第一个模式的名称如此,如果启用,所有模式都使用颜色高亮显示更改的部分。 
- --word-diff-regex=<正则表达式>
- 
使用 <regex> 来决定什么是单词,而不是将非空白字符的连续序列视为一个单词。除非已启用,否则这也隐含 --word-diff。<regex>的每个不重叠匹配都被视为一个单词。这些匹配之间的任何内容都被视为空格并被忽略(!)以便查找差异。您可能希望将|[ ^[:space:]]附加到您的正则表达式中,以确保它匹配所有非空白字符。包含换行符的匹配会在换行符处被静默截断(!)例如, --word-diff-regex=.会将每个字符视为一个单词,并相应地逐字符显示差异。正则表达式也可以通过差异驱动程序或配置选项设置,参见gitattributes[5]或git-config[1]。显式给出它会覆盖任何差异驱动程序或配置设置。差异驱动程序会覆盖配置设置。 
- --color-words[- =<正则表达式>]
- 
相当于 --word-diff=color加上(如果指定了正则表达式)--word-diff-regex=<regex>。
- --no-renames
- 
关闭重命名检测,即使配置文件默认开启。 
- --[- no-]- rename-empty
- 
是否使用空 blob 作为重命名源。 
- --check
- 
如果更改引入了冲突标记或空白错误,则发出警告。空白错误由 core.whitespace配置控制。默认情况下,行尾空白(包括仅由空白组成的行)以及行初始缩进中紧跟制表符的空格字符被视为空白错误。如果发现问题,则以非零状态退出。与--exit-code不兼容。
- --ws-error-highlight=<类型>
- 
突出显示差异的 context、old或new行中的空白错误。多个值用逗号分隔,none重置先前的值,default将列表重置为new,而all是old,new,context的简写。如果未给出此选项,并且未设置配置变量diff.wsErrorHighlight,则仅突出显示new行中的空白错误。空白错误将用color.diff.whitespace着色。
- --full-index
- 
在生成补丁格式输出时,不在“index”行上显示前几个字符,而是显示完整的原图像和后图像 blob 对象名称。 
- --binary
- 
除了 --full-index之外,还输出一个二进制 diff,该 diff 可以用git-apply应用。隐含--patch。
- --abbrev[- =<n>]
- 
在差异原始格式输出和差异树头行中,不显示完整的40字节十六进制对象名称,而是显示至少<n>个十六进制数字长的最短前缀,该前缀唯一引用该对象。在差异补丁输出格式中, --full-index具有更高的优先级,即如果指定了--full-index,则无论--abbrev如何,都将显示完整的二进制对象名称。非默认的数字位数可以通过--abbrev=<n>指定。
- -B[<n>][- /<m>]
- --break-rewrites[- =[<n>][- /<m>]]
- 
将完整的重写更改分解为删除和创建对。这有两个目的: 它影响文件完全重写的更改方式,不是作为一系列删除和插入与少量文本上匹配的上下文行混合在一起,而是作为对所有旧内容的单个删除,然后是所有新内容的单个插入,数字<m>控制 -B选项的这一方面(默认为60%)。-B/70%指定结果中少于30%的原始内容应保留,Git才会将其视为完全重写(即,否则生成的补丁将是一系列删除和插入与上下文行混合在一起)。当与 -M一起使用时,完全重写的文件也被视为重命名的源(通常-M仅将消失的文件视为重命名的源),数字<n>控制-B选项的这一方面(默认为50%)。-B20%指定,与文件大小的20%或更多相比,有添加和删除的更改有资格被视为重命名到另一个文件的可能源。
- -M[<n>]
- --find-renames[- =<n>]
- 
检测重命名。如果指定了<n>,它将作为相似性索引的阈值(即与文件大小相比的添加/删除量)。例如, -M90%表示如果文件有超过90%未更改,Git应将删除/添加对视为重命名。没有%符号时,数字应读作小数,小数点在其前面。即,-M5变为0.5,因此与-M50%相同。类似地,-M05与-M5%相同。要将检测限制为精确重命名,请使用-M100%。默认相似性索引为50%。
- -C[<n>]
- --find-copies[- =<n>]
- 
检测复制和重命名。另请参见 --find-copies-harder。如果指定了 <n>,其含义与-M<n> 相同。
- --find-copies-harder
- 
出于性能原因,默认情况下, -C选项仅在复制的原始文件在同一变更集中被修改时才查找副本。此标志使命令检查未修改的文件作为复制源的候选。这对于大型项目来说是非常昂贵的操作,因此请谨慎使用。给出多个-C选项具有相同的效果。
- -D
- --irreversible-delete
- 
省略删除的原始图像,即只打印头信息,而不打印原始图像与 /dev/null之间的差异。生成的补丁不适用于patch或gitapply;这仅适用于希望专注于审查更改后文本的人。此外,输出显然缺乏足够的信息来反向应用此类补丁,即使是手动操作也一样,因此得名此选项。与 -B一起使用时,也会省略删除/创建对的删除部分中的原始图像。
- -l<数量>
- 
-M和-C选项包含一些初步步骤,可以廉价地检测重命名/复制的子集,然后是详尽的后备部分,将所有剩余的未配对目标与所有相关源进行比较。(对于重命名,只有剩余的未配对源是相关的;对于复制,所有原始源都是相关的。)对于N个源和目标,此详尽检查的时间复杂度为O(N^2)。如果涉及的源/目标文件数量超过指定数量,此选项会阻止重命名/复制检测的详尽部分运行。默认为diff.renameLimit。请注意,0值被视为无限制。
- --diff-filter=[(- A|- C|- D|- M|- R|- T|- U|- X|- B)- ...[- *]]
- 
仅选择以下文件:添加的( A)、复制的(C)、删除的(D)、修改的(M)、重命名的(R)、类型(即常规文件、符号链接、子模块等)已更改的(T)、未合并的(U)、未知的(X)或配对已损坏的(B)。可以使用任何过滤字符组合(包括无)。当组合中添加*(全部或无)时,如果比较中有任何文件匹配其他条件,则选择所有路径;如果没有文件匹配其他条件,则不选择任何内容。此外,这些大写字母可以小写以进行排除。例如, --diff-filter=ad会排除已添加和已删除的路径。请注意,并非所有 diff 都能包含所有类型。例如,如果禁用对这些类型的检测,则不会出现已复制和已重命名条目。 
- -S<字符串>
- 
查找更改文件中指定 <string> 出现次数(即添加/删除)的差异。供脚本编写者使用。 当您正在寻找精确的代码块(例如结构体),并想了解该代码块自诞生以来的历史时,这很有用:迭代使用此功能,将原始图像中有趣的代码块重新输入到 -S中,然后继续直到获得该代码块的第一个版本。二进制文件也会被搜索。 
- -G<正则表达式>
- 
查找其补丁文本包含与 <regex> 匹配的添加/删除行的差异。 为了说明 -S<regex>--pickaxe-regex和-G<regex>之间的区别,请考虑一个在同一文件中具有以下差异的提交+ return frotz(nitfol, two->ptr, 1, 0); ... - hit = frotz(nitfol, mf2.ptr, 1, 0); 虽然git log -G"frotz\(nitfol"会显示此提交,但git log -S"frotz\(nitfol" --pickaxe-regex不会(因为该字符串的出现次数没有改变)。 除非提供了 --text,否则没有 textconv 过滤器的二进制文件的补丁将被忽略。有关更多信息,请参见 gitdiffcore[7] 中的 *pickaxe* 条目。 
- --find-object=<对象ID>
- 
查找更改指定对象出现次数的差异。类似于 -S,只是参数不同,它不搜索特定字符串,而是搜索特定对象 ID。该对象可以是 blob 或子模块提交。它隐含了 git-log中的-t选项,以也查找树。
- --pickaxe-all
- 
当 -S或-G找到更改时,显示该变更集中所有更改,而不仅仅是包含 <string> 更改的文件。
- --pickaxe-regex
- 
将提供给 -S的 <string> 视为扩展的 POSIX 正则表达式进行匹配。
- -O<顺序文件>
- 
控制文件在输出中出现的顺序。这会覆盖 diff.orderFile配置变量(参见git-config[1])。要取消diff.orderFile,请使用-O/dev/null。输出顺序由<orderfile>中全局模式的顺序决定。所有路径名与第一个模式匹配的文件首先输出,所有路径名与第二个模式匹配(但不与第一个模式匹配)的文件其次输出,依此类推。所有路径名不匹配任何模式的文件最后输出,就像文件末尾有一个隐式匹配所有模式一样。如果多个路径名具有相同的等级(它们匹配相同的模式但没有更早的模式),则它们相对于彼此的输出顺序是正常顺序。 <orderfile> 解析如下: - 
空行被忽略,因此它们可以用作分隔符以提高可读性。 
- 
以井号(" #")开头的行被忽略,因此它们可以用作注释。如果模式以井号开头,请在模式开头添加反斜杠("\")。
- 
其他每行包含一个模式。 
 模式具有与 fnmatch(3)使用的模式相同的语法和语义,但没有FNM_PATHNAME标志,除了路径名如果删除任意数量的最终路径名组件后与模式匹配,也匹配该模式。例如,模式“foo*bar”匹配“fooasdfbar”和“foo/bar/baz/asdf”,但不匹配“foobarx”。
- 
- --skip-to=<文件>
- --rotate-to=<文件>
- 
从输出中丢弃命名为<file>之前的文件(即*跳过至*),或将它们移动到输出末尾(即*旋转至*)。这些选项主要是为 gitdifftool命令的使用而发明,否则可能不太有用。
- -R
- 
交换两个输入;即,显示从索引或磁盘文件到树内容的差异。 
- --relative[- =<路径>]
- --no-relative
- 
当从项目的子目录运行时,可以使用此选项指示其排除目录外的更改并显示相对于该目录的路径名。当您不在子目录中(例如,在裸仓库中)时,可以通过提供<path>作为参数来指定输出相对于哪个子目录。 --no-relative可用于抵消diff.relative配置选项和先前的--relative。
- -a
- --text
- 
将所有文件视为文本。 
- --ignore-cr-at-eol
- 
进行比较时忽略行尾的回车符。 
- --ignore-space-at-eol
- 
忽略行尾空格的更改。 
- -b
- --ignore-space-change
- 
忽略空格数量的变化。这会忽略行尾的空格,并将所有其他一个或多个空格序列视为等效。 
- -w
- --ignore-all-space
- 
比较行时忽略空格。即使一行有空格而另一行没有,这也忽略了差异。 
- --ignore-blank-lines
- 
忽略所有空行的更改。 
- -I<正则表达式>
- --ignore-matching-lines=<正则表达式>
- 
忽略所有行都匹配 <regex> 的更改。此选项可以多次指定。 
- --inter-hunk-context=<数字>
- 
在差异块之间显示上下文,最多达指定行数 <number>,从而合并彼此接近的块。默认为 diff.interHunkContext,如果未设置配置选项则为 0。
- -W
- --function-context
- 
将整个函数作为每个更改的上下文行显示。函数名称的确定方式与 gitdiff计算补丁块头的方式相同(参见gitattributes[5]中的“定义自定义块头”)。
- --exit-code
- 
使程序以类似于 diff(1) 的代码退出。也就是说,如果存在差异,则以 1 退出,0 表示无差异。
- --quiet
- 
禁用程序的所有输出。隐含 --exit-code。禁用外部差异帮助程序的执行,其退出代码不被信任,即其各自的配置选项diff.trustExitCode或diff.<driver>.trustExitCode或环境变量GIT_EXTERNAL_DIFF_TRUST_EXIT_CODE为假。
- --ext-diff
- 
允许执行外部差异辅助程序。如果您使用 gitattributes[5] 设置了外部差异驱动程序,则需要与 git-log[1] 等命令一起使用此选项。 
- --no-ext-diff
- 
禁止外部差异驱动程序。 
- --textconv
- --no-textconv
- 
在比较二进制文件时,允许(或不允许)运行外部文本转换过滤器。有关详细信息,请参见gitattributes[5]。由于textconv过滤器通常是单向转换,因此生成的差异适合人类阅读,但无法应用。因此,textconv过滤器默认仅对git-diff[1]和git-log[1]启用,而不对git-format-patch[1]或差异底层命令启用。 
- --ignore-submodules[- =(- none|- untracked|- dirty|- all)]
- 
在生成差异时忽略对子模块的更改。 all是默认值。使用none会认为子模块已修改,如果它包含未跟踪或已修改的文件,或者其HEAD与主项目中记录的提交不同,并且可用于覆盖git-config[1]或gitmodules[5]中ignore选项的任何设置。当使用untracked时,如果子模块仅包含未跟踪内容,则不将其视为脏(但仍会扫描其修改内容)。使用dirty会忽略子模块工作树的所有更改,仅显示主项目中存储的提交更改(这是1.7.0之前的行为)。使用all会隐藏对子模块的所有更改。
- --src-prefix=<前缀>
- 
显示给定的源前缀 <prefix> 而不是 "a/"。 
- --dst-prefix=<前缀>
- 
显示给定的目标前缀 <prefix> 而不是 "b/"。 
- --no-prefix
- 
不显示任何源或目标前缀。 
- --default-prefix
- 
使用默认的源和目标前缀(“a/”和“b/”)。这会覆盖诸如 diff.noprefix、diff.srcPrefix、diff.dstPrefix和diff.mnemonicPrefix等配置变量(参见git-config[1])。
- --line-prefix=<前缀>
- 
在每行输出前面添加一个额外的 <prefix>。 
- --ita-invisible-in-index
- 
默认情况下,通过 gitadd-N添加的条目在gitdiff中显示为已存在的空文件,在gitdiff--cached中显示为新文件。此选项使条目在gitdiff中显示为新文件,在gitdiff--cached中显示为不存在。此选项可以使用--ita-visible-in-index恢复。这两个选项都是实验性的,将来可能会被移除。
有关这些通用选项的更详细说明,另请参见 gitdiffcore[7]。
使用 -p 生成补丁文本
运行带有-p选项的git-diff[1]、git-log[1]、git-show[1]、git-diff-index[1]、git-diff-tree[1]或git-diff-files[1]会生成补丁文本。您可以通过GIT_EXTERNAL_DIFF和GIT_DIFF_OPTS环境变量(参见git[1])以及diff属性(参见gitattributes[5])自定义补丁文本的创建。
-p 选项生成的输出与传统的 diff 格式略有不同:
- 
它前面是“git diff”头,看起来像这样: diff --git a/file1 b/file2 a/和b/文件名是相同的,除非涉及重命名/复制。特别是,即使是创建或删除,也不会使用/dev/null来代替a/或b/文件名。当涉及重命名/复制时, file1和file2分别显示重命名/复制的源文件名称和重命名/复制生成的文件名称。
- 
后面跟着一个或多个扩展头行: oldmode<mode>newmode<mode>deletedfilemode<mode>newfilemode<mode>copyfrom<path>copyto<path>renamefrom<path>renameto<path>similarityindex<number>dissimilarityindex<number>index<hash>..<hash> <mode>文件模式 <mode> 以 6 位八进制数字打印,包括文件类型和文件权限位。 扩展头中的路径名不包含 a/和b/前缀。相似度索引是未更改行的百分比,而差异度索引是已更改行的百分比。它是一个向下取整的整数,后跟一个百分号。因此,相似度索引值100%保留给两个相同的文件,而100%差异度意味着旧文件中没有一行进入新文件。 索引行包括更改前后的 blob 对象名称。如果文件模式没有更改,则包含 <mode>;否则,单独的行指示旧模式和新模式。 
- 
包含“不寻常”字符的路径名将按照配置变量 core.quotePath的解释进行引用(参见 git-config[1])。
- 
输出中所有的 file1文件指代提交之前的文件,所有file2文件指代提交之后的文件。顺序地将每个更改应用到每个文件是不正确的。例如,这个补丁将交换a和bdiff --git a/a b/b rename from a rename to b diff --git a/b b/a rename from b rename to a 
- 
Hunk 头会提及 hunk 应用到的函数名称。有关如何根据特定语言进行调整的详细信息,请参见 gitattributes[5] 中的“定义自定义 hunk-header”。 
组合 diff 格式
任何生成差异的命令都可以接受-c或--cc选项,以便在显示合并时生成*组合差异*。这是使用git-diff[1]或git-show[1]显示合并时的默认格式。另请注意,您可以向这些命令中的任何一个提供合适的--diff-merges选项,以强制生成特定格式的差异。
“组合 diff”格式如下所示:
diff --combined describe.c
index fabadb8,cc95eb0..4866510
--- a/describe.c
+++ b/describe.c
@@@ -98,20 -98,12 +98,20 @@@
	return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1;
  }
- static void describe(char *arg)
 -static void describe(struct commit *cmit, int last_one)
++static void describe(char *arg, int last_one)
  {
 +	unsigned char sha1[20];
 +	struct commit *cmit;
	struct commit_list *list;
	static int initialized = 0;
	struct commit_name *n;
 +	if (get_sha1(arg, sha1) < 0)
 +		usage(describe_usage);
 +	cmit = lookup_commit_reference(sha1);
 +	if (!cmit)
 +		usage(describe_usage);
 +
	if (!initialized) {
		initialized = 1;
		for_each_ref(get_name);
- 
它前面是“git diff”头,看起来像这样(使用 -c选项时):diff --combined file 或者像这样(使用 --cc选项时):diff --cc file 
- 
后面跟着一个或多个扩展头行(此示例显示了一个包含两个父级的合并): index<hash>,<hash>..<hash>mode<mode>,<mode>..<mode>newfilemode<mode>deletedfilemode<mode>,<mode>mode<mode>,<mode>..<mode>行仅在至少一个<mode>与其他不同时出现。带有检测到的内容移动(重命名和复制检测)信息的扩展头旨在与两个<tree-ish>的差异一起使用,并且不用于组合差异格式。
- 
后面跟着一个两行的“源文件/目标文件”头: --- a/file +++ b/file 类似于传统 unified diff 格式的两行头, /dev/null用于指示已创建或已删除的文件。然而,如果提供了 --combined-all-paths 选项,您将得到一个 N+1 行的“源文件/目标文件”头,而不是两行的“源文件/目标文件”头,其中 N 是合并提交中父级的数量: --- a/file --- a/file --- a/file +++ b/file 如果重命名或复制检测处于活动状态,这种扩展格式会很有用,可以让您查看不同父级中文件的原始名称。 
- 
块头格式已修改,以防止人们意外将其馈送给 patch-p1。组合差异格式是为了审查合并提交更改而创建的,并非用于应用。该更改类似于扩展索引头中的更改@@@ <from-file-range> <from-file-range> <to-file-range> @@@ 组合 diff 格式的块头中有(父级数量 + 1)个 @字符。
与传统的*统一*差异格式不同,后者显示两个文件A和B,其中单列带有-(减号——出现在A中但在B中删除)、+(加号——在A中缺失但添加到B中)或" "(空格——未更改)前缀,此格式将两个或更多文件file1, file2,…与一个文件X进行比较,并显示X与每个文件N的区别。每个文件N都有一列附加到输出行前,以指示X的行与它的不同之处。
列N中的-字符表示该行出现在文件N中,但未出现在结果中。列N中的+字符表示该行出现在结果中,而文件N没有该行(换句话说,从该父级的角度来看,该行已添加)。
在上述示例输出中,函数签名从两个文件都发生了更改(因此从file1和file2都删除了两个-,加上++表示添加的一行未出现在file1或file2中)。此外,还有八行与file1相同但未出现在file2中(因此以+为前缀)。
当通过git diff-tree -c显示时,它将合并提交的父级与合并结果进行比较(即file1..fileN是父级)。当通过git diff-files -c显示时,它将两个未解决的合并父级与工作树文件进行比较(即file1是阶段2,又称“我们的版本”,file2是阶段3,又称“他们的版本”)。

