设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
-
2.52.0
2025-11-17
- 2.51.1 → 2.51.2 无更改
-
2.51.0
2025-08-18
- 2.50.1 无更改
-
2.50.0
2025-06-16
描述
显示标准输入上提供的文件对的更改。此命令的输入必须是 NUL 终止的原始输出格式,如 git diff-tree -z -r --raw 等命令生成的格式。默认情况下,输出的 diff 在标准输入关闭时会以补丁格式计算和显示。
可以在原始输入行之间向标准输入写入单个 NUL 字节,以在此时计算文件对 diff,而不是等待标准输入关闭。输出中也会写入 NUL 字节,以分隔这些 diff 批次。
使用此命令可以打破传统的 diff 管道,将其分解为单独的阶段,其中 diff-pairs 作为输出阶段。其他命令,如 diff-tree,可以作为前端来计算用作输入的原始 diff 格式。
而不是一步通过 git diff-tree -p -M 计算 diff,diff-tree 可以计算文件对和重命名信息,而不进行 blob diff。此输出可以馈送给 diff-pairs 来生成底层 blob diff,如下例所示
git diff-tree -z -r -M $a $b | git diff-pairs -z
预先计算带有重命名信息的树 diff,允许 diff-pairs 的补丁输出在可能多次调用期间逐步计算。
diff-pairs 目前不支持路径规范。路径规范限制应由生成用作输入的原始 diff 的上游命令执行。
目前不支持将树对象作为输入,并且会被拒绝。
diff-pairs 输入中的缩写对象 ID 不受支持。可以使用 --abbrev 选项缩写输出的对象 ID。
选项
-p-u--patch-
生成补丁(参见 使用 -p 生成补丁文本)。
-s--no-patch-
禁止 diff 引擎的所有输出。这对于像
gitshow这样默认显示 patch 的命令很有用,可以抑制其输出,或者取消命令行中别名(alias)中像--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[=<width>[,<name-width>[,<count>]]]-
生成 diffstat。默认情况下,文件名部分将使用尽可能多的空间,其余部分用于图部分。最大宽度默认为终端宽度,如果未连接到终端则为 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)在 diffstat 中。该信息位于文件名部分和图形部分之间。隐含--stat。 --numstat-
类似于
--stat,但以十进制显示添加和删除的行数,并省略路径名缩写,以便更易于机器处理。对于二进制文件,输出两个-而不是说00。 --shortstat-
仅输出
--stat格式的最后一行,其中包含修改文件的总数,以及添加和删除的行数。 -X[<param>,...]--dirstat[=<param>,...]-
输出每个子目录相对更改量的分布。可以通过传递一个逗号分隔的参数列表来定制
--dirstat的行为。默认值由diff.dirstat配置变量控制(参见 git-config[1])。以下参数可用:changes-
通过计算源文件中删除的行数或目标文件中添加的行数来计算 dirstat 数字。这会忽略纯代码移动 within a file 的量。换句话说,重新排列文件中的行不如其他更改计数多。这是未提供任何参数时的默认行为。
lines-
通过进行常规的基于行的 diff 分析,并对删除/添加的行数进行求和来计算 dirstat 数字。(对于二进制文件,则计算 64 字节块,因为二进制文件没有自然的行概念)。这是比
changes行为更耗时的--dirstat行为,但它会像其他更改一样计算文件中重新排列的行。生成的输出与其他--*stat选项的输出一致。 files-
通过计算已更改文件的数量来计算 dirstat 数字。在 dirstat 分析中,每个已更改的文件都同等重要。这是计算上最便宜的
--dirstat行为,因为它根本不需要查看文件内容。 cumulative-
将子目录中的更改也计入父目录。请注意,在使用
cumulative时,报告的百分比总和可能超过 100%。可以使用noncumulative参数指定默认(非累积)行为。 - <limit>
-
一个整数参数,指定一个截止百分比(默认为 3%)。对更改贡献低于此百分比的目录不会显示在输出中。
例如:以下命令将计算更改的文件数,同时忽略更改文件总数小于 10% 的目录,并将子目录计数累加到父目录中:
--dirstat=files,10,cumulative。 --cumulative-
--dirstat=cumulative的同义词。 --dirstat-by-file[=<param>,...]-
--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[=<format>]-
指定如何显示子模块的差异。当指定
--submodule=short时,使用short格式。此格式仅显示范围开始和结束时的提交名称。当指定--submodule或--submodule=log时,使用log格式。此格式列出范围内的提交,类似于 git-submodule[1]summary。当指定--submodule=diff时,使用diff格式。此格式显示提交范围内的子模块内容更改的内联 diff。默认为diff.submodule或short格式(如果配置选项未设置)。 --color[=<when>]-
显示彩色 diff。
--color(即没有=<when>)等同于--color=always。<when> 可以是always、never或auto之一。 --no-color-
关闭彩色 diff。它与
--color=never相同。 --color-moved[=<mode>]-
移动的代码行将以不同的颜色显示。如果不提供选项,<mode> 默认为
no;如果提供不带模式的选项,则默认为zebra。模式必须是以下之一:no-
移动的行不进行高亮显示。
default-
是
zebra的同义词。未来可能会更改为更合理的模式。 plain-
任何在一处添加、在另一处移除的行都将使用
color.diff.newMoved颜色显示。类似地,添加到其他地方的移除行将使用color.diff.oldMoved颜色显示。此模式可以识别所有移动的行,但在审查时,很难确定代码块是否在不改变顺序的情况下被移动。 blocks-
将至少 20 个字母数字字符的移动代码块贪婪地检测出来。检测到的块使用
color.diff.(old|new)Moved颜色进行绘制。相邻的块无法区分。 zebra-
移动代码块的检测方式与
blocks模式相同。块使用color.diff.(old|new)Moved颜色或color.diff.(old|new)MovedAlternative颜色绘制。两种颜色之间的变化表示检测到一个新的块。 dimmed-zebra-
与
zebra类似,但对移动代码中不重要的部分进行了额外的调暗处理。相邻块的边界线被认为是重要的,其余部分是不重要的。dimmed_zebra是一个已弃用的同义词。
--no-color-moved-
关闭移动检测。这可以用于覆盖配置设置。它与
--color-moved=no相同。 --color-moved-ws=<mode>,...-
这配置了在执行
--color-moved的移动检测时如何忽略空白。这些模式可以作为逗号分隔的列表给出: --no-color-moved-ws-
执行移动检测时不忽略空白。这可以用于覆盖配置设置。它与
--color-moved-ws=no相同。 --word-diff[=<mode>]-
默认情况下,单词由空白分隔;参见下面的
--word-diff-regex。<mode> 默认为plain,并且必须是以下之一:请注意,尽管第一个模式的名称如此,如果启用,所有模式都使用颜色高亮显示更改的部分。
--word-diff-regex=<regex>-
使用 <regex> 来决定什么是单词,而不是将非空白字符的连续序列视为一个单词。除非已启用,否则这也隐含
--word-diff。<regex> 的每个非重叠匹配都被视为一个单词。这些匹配之间的任何内容都被视为空格并被忽略(!) 以用于查找差异。你可能希望在正则表达式后追加 |[
^[:space:]] 以确保它匹配所有非空格字符。包含换行符的匹配会被静默截断(!) 在换行符处。例如,
--word-diff-regex=.会将每个字符视为一个单词,并相应地逐字符显示差异。正则表达式也可以通过 diff 驱动程序或配置选项设置,参见 gitattributes[5] 或 git-config[1]。显式给出它会覆盖任何 diff 驱动程序或配置设置。diff 驱动程序优先于配置设置。
--color-words[=<regex>]-
相当于
--word-diff=color加上(如果指定了正则表达式)--word-diff-regex=<regex>。 --no-renames-
关闭重命名检测,即使配置文件默认开启。
--rename-empty--no-rename-empty-
是否使用空 blob 作为重命名源。
--check-
当引入冲突标记或空格错误时发出警告。空格错误被认为是受
core.whitespace配置控制的。默认情况下,行尾的空格(包括仅由空格组成的行)以及行开头缩进中紧跟在制表符后面的空格字符被视为空格错误。如果发现问题,退出状态将非零。与--exit-code不兼容。 --ws-error-highlight=<kind>-
在 diff 的
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>]-
在 diff-raw 格式输出和 diff-tree 头行中,不显示完整的 40 位十六进制对象名称,而是显示最短的前缀,该前缀至少有<n>个十六进制数字且能唯一标识对象。在 diff-patch 输出格式中,
--full-index具有更高的优先级,即如果指定了--full-index,则无论--abbrev如何,都会显示完整的 blob 名称。可以使用--abbrev=<n> 指定非默认的数字。 -B[<n>][/<m>]--break-rewrites[=[<n>][/<m>]]-
将完整的重写更改分解为删除和创建对。这有两个目的:
它影响了将文件完全重写(rewrite)的更改的处理方式,而不是将其视为一系列删除和插入,其中只有少量文本碰巧与上下文匹配。它将其视为一次性的全部删除后一次性的全部插入,并且数字<m>控制
-B选项的这一方面(默认为 60%)。-B/70%指定,如果结果中保留的原始部分少于 30%,Git 将认为这是一次完全重写(即,否则生成的 patch 将是一系列删除和插入,并带有上下文行)。当与
-M一起使用时,完全重写的文件也被视为重命名(rename)的源头(通常-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选项仅在复制的原始文件在同一更改集(changeset)中被修改时才查找复制。此标志使命令检查未修改的文件作为复制源的候选。对于大型项目,这是一项非常耗时的操作,因此请谨慎使用。给出多个-C选项具有相同的效果。 -D--irreversible-delete-
省略删除的原始文件(preimage),即只打印标头,而不打印原始文件与
/dev/null之间的差异。生成的补丁不适用于patch或gitapply;这仅适用于那些只想专注于查看更改后文本的人。此外,输出显然缺乏足够的信息来手动甚至手动反向应用此类补丁,因此得名于该选项。与
-B一起使用时,也会省略删除/创建对的删除部分中的原始图像。 -l<num>-
-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>-
查找更改文件中指定 <string> 出现次数(即添加/删除)的差异。供脚本编写者使用。
当您正在寻找一段确切的代码(如结构体)并想了解该代码块自首次出现以来的历史记录时,这很有用:迭代地使用该功能将感兴趣的代码块从原始文件中反馈到
-S,然后继续直到找到该代码块的第一个版本。二进制文件也会被搜索。
-G<regex>-
查找其补丁文本包含与 <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=<object-id>-
查找更改指定对象出现次数的差异。类似于
-S,只是参数不同,它不搜索特定字符串,而是搜索特定对象 ID。该对象可以是 blob 或子模块提交。它隐含了
git-log中的-t选项,以也查找树。 --pickaxe-all-
当
-S或-G找到更改时,显示该变更集中所有更改,而不仅仅是包含 <string> 更改的文件。 --pickaxe-regex-
将提供给
-S的 <string> 视为扩展的 POSIX 正则表达式进行匹配。 -O<orderfile>-
控制文件中输出的顺序。这将覆盖
diff.orderFile配置变量(参见 git-config[1])。要取消diff.orderFile,请使用-O/dev/null。输出顺序由 <orderfile> 中 glob 模式的顺序决定。所有路径名匹配第一个模式的文件首先输出,所有路径名匹配第二个模式(但不匹配第一个)的文件接下来输出,依此类推。所有路径名不匹配任何模式的文件最后输出,就好像文件末尾有一个隐式的匹配所有模式一样。如果多个路径名具有相同的秩(它们匹配相同的模式但不是更早的模式),它们之间的相对输出顺序是正常顺序。
<orderfile> 解析如下:
-
空行被忽略,因此它们可以用作分隔符以提高可读性。
-
以井号("
#")开头的行被忽略,因此它们可以用作注释。如果模式以井号开头,请在模式开头添加反斜杠("\")。 -
其他每行包含一个模式。
模式具有与
fnmatch(3) 中使用的模式相同的语法和语义,不带FNM_PATHNAME标志,不同之处在于,如果移除路径名的任何数量的最终组件匹配模式,则路径名也与模式匹配。例如,模式 "foo*bar" 匹配 "fooasdfbar" 和 "foo/bar/baz/asdf",但不匹配 "foobarx"。 -
--skip-to=<file>--rotate-to=<file>-
从输出中丢弃指定 <file> 之前的(即 *skip to*)文件,或将它们移至输出末尾(即 *rotate to*)。这些选项主要用于
gitdifftool命令,可能在其他情况下不太有用。 -R-
交换两个输入;即,显示从索引或磁盘文件到树内容的差异。
--relative[=<path>]--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<regex>--ignore-matching-lines=<regex>-
忽略所有行都匹配 <regex> 的更改。此选项可以多次指定。
--inter-hunk-context=<number>-
在差异块之间显示上下文,最多达指定行数 <number>,从而合并彼此接近的块。默认为
diff.interHunkContext,如果未设置配置选项则为 0。 -W--function-context-
显示整个函数作为每个更改的上下文行。函数名称的确定方式与
gitdiff生成补丁块标头的方式相同(参见 gitattributes[5] 中“定义自定义块标头”)。 --exit-code-
使程序以类似于
diff(1) 的代码退出。也就是说,如果存在差异,则以 1 退出,0 表示无差异。 --quiet-
禁用程序的所有输出。隐含
--exit-code。禁用外部 diff 辅助程序(其退出代码不受信任)的执行,即其相应的配置选项diff.trustExitCode或diff.<driver>.trustExitCode或环境变量GIT_EXTERNAL_DIFF_TRUST_EXIT_CODE为 false。 --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] 或 diff 管道命令启用。
--ignore-submodules[=(none|untracked|dirty|all)]-
在 diff 生成中忽略子模块的更改。
all是默认值。使用none时,当子模块包含未跟踪或已修改文件,或者其HEAD与超级项目中记录的提交不同时,将被视为已修改,并且可以用来覆盖 git-config[1] 或 gitmodules[5] 中ignore选项的任何设置。使用untracked时,当子模块仅包含未跟踪内容时(但仍会扫描已修改内容),不会将其视为脏。使用dirty时,将忽略子模块工作树的所有更改,只显示超级项目中记录的提交更改(这是 1.7.0 之前的行为)。使用all时,将隐藏子模块的所有更改。 --src-prefix=<prefix>-
显示给定的源前缀 <prefix> 而不是 "a/"。
--dst-prefix=<prefix>-
显示给定的目标前缀 <prefix> 而不是 "b/"。
--no-prefix-
不显示任何源或目标前缀。
--default-prefix-
使用默认的源和目标前缀("a/" 和 "b/")。这将覆盖配置变量,如
diff.noprefix、diff.srcPrefix、diff.dstPrefix和diff.mnemonicPrefix(参见 git-config[1])。 --line-prefix=<prefix>-
在每行输出前面添加一个额外的 <prefix>。
--ita-invisible-in-index-
默认情况下,由
gitadd-N添加的条目在gitdiff中显示为现有空文件,在gitdiff--cached中显示为新文件。此选项使条目在gitdiff中显示为新文件,在gitdiff--cached中显示为不存在。此选项可以用--ita-visible-in-index恢复。这两个选项都是实验性的,未来可能会被删除。 - --max-depth=<depth>
-
对于命令行上给出的每个路径说明符,最多向下递归 <depth> 层目录。值为
-1表示无限制。不能与路径说明符中的通配符组合使用。给定一个包含foo/bar/baz的树,以下列表显示了每个选项集生成的匹配项-
--max-depth=0--foo:foo -
--max-depth=1--foo:foo/bar -
--max-depth=1--foo/bar:foo/bar/baz -
--max-depth=1--foofoo/bar:foo/bar/baz -
--max-depth=2--foo:foo/bar/baz
如果没有给出路径说明符,则深度测量方式就好像所有顶级条目都被指定一样。请注意,这与从根开始测量不同,因为
--max-depth=0仍将返回foo。这允许您在要求顶级条目子集的同时仍然限制深度。请注意,此选项仅支持树对象之间的差异,不支持与索引或工作树的差异。
-
有关这些通用选项的更详细说明,另请参见 gitdiffcore[7]。
使用 -p 生成补丁文本
运行 git-diff[1]、git-log[1]、git-show[1]、git-diff-index[1]、git-diff-tree[1] 或 git-diff-files[1] 并带 -p 选项会产生补丁文本。您可以通过 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 格式
任何生成 diff 的命令都可以接受 -c 或 --cc 选项,以便在显示合并时生成 *combined diff*。这是使用 git-diff[1] 或 git-show[1] 显示合并时的默认格式。另请注意,您可以向这些命令中的任何一个提供适当的 --diff-merges 选项来强制以特定格式生成 diff。
“组合 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> 的 diff 设计的,并且不用于 combined diff 格式。 -
后面跟着一个两行的“源文件/目标文件”头:
--- a/file +++ b/file
类似于传统 unified diff 格式的两行头,
/dev/null用于指示已创建或已删除的文件。然而,如果提供了 --combined-all-paths 选项,您将得到一个 N+1 行的“源文件/目标文件”头,而不是两行的“源文件/目标文件”头,其中 N 是合并提交中父级的数量:
--- a/file --- a/file --- a/file +++ b/file
如果重命名或复制检测处于活动状态,这种扩展格式会很有用,可以让您查看不同父级中文件的原始名称。
-
块头格式已修改,以防止人们意外地将其馈送给
patch-p1。Combined diff 格式是为审查合并提交更改而创建的,不用于应用。更改类似于扩展的 index 标头中的更改。@@@ <from-file-range> <from-file-range> <to-file-range> @@@
组合 diff 格式的块头中有(父级数量 + 1)个
@字符。
与传统的 *unified* diff 格式(显示两个文件 A 和 B,并带有一个单列,该列有 -(减号 — 出现在 A 中但从 B 中移除)、+(加号 — 在 A 中缺失但添加到 B 中),或 " "(空格 — 未更改)前缀)不同,此格式比较两个或多个文件 file1、file2、…… 和一个文件 X,并显示 X 与 fileN 的不同之处。文件 fileN 的数量加上每行输出中的一个列,用于指示 X 的行与该文件有何不同。
列 N 中的 - 字符表示该行出现在 fileN 中,但不在结果中。列 N 中的 + 字符表示该行出现在结果中,但 fileN 没有该行(换句话说,从该父级的角度来看,该行已被添加)。
在上面的示例输出中,函数签名与两个文件都不同(因此从 file1 和 file2 都移除了两个 -,加上 ++ 表示一个添加到两个文件中都不存在的行)。此外,八行与 file1 相同,但未出现在 file2 中(因此前缀为 +)。
当由 git diff-tree -c 显示时,它比较合并提交的父级与合并结果(即 file1..fileN 是父级)。当由 git diff-files -c 显示时,它比较两个未解析的合并父级与工作树文件(即 file1 是阶段 2,也称为“我们的版本”,file2 是阶段 3,也称为“他们的版本”)。