Git
英语 ▾ 主题 ▾ 最新版本 ▾ git-diff 最后更新于 2.47.0

名称

git-diff - 显示提交之间的更改、提交和工作树之间的更改等

概要

git diff [<options>] [<commit>] [--] [<path>…​]
git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>…​]
git diff [<options>] [--merge-base] <commit> [<commit>…​] <commit> [--] [<path>…​]
git diff [<options>] <commit>…​<commit> [--] [<path>…​]
git diff [<options>] <blob> <blob>
git diff [<options>] --no-index [--] <path> <path>

描述

显示工作树和索引或树之间的更改,索引和树之间的更改,两个树之间的更改,合并产生的更改,两个 Blob 对象之间的更改,或磁盘上两个文件之间的更改。

git diff [<options>] [--] [<path>…​]

此形式用于查看您相对于索引(下次提交的暂存区)所做的更改。换句话说,差异是您可以告诉 Git 进一步添加到索引中的内容,但您还没有这样做。您可以使用 git-add[1] 来暂存这些更改。

git diff [<options>] --no-index [--] <path> <path>

此形式用于比较文件系统上的两个给定路径。当在 Git 控制的工作树中运行命令且至少一个路径指向工作树之外,或者在 Git 控制的工作树之外运行命令时,您可以省略 --no-index 选项。此形式意味着 --exit-code

git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>…​]

此形式用于查看您为下次提交暂存的更改相对于指定的 <commit> 的更改。通常您希望与最新提交进行比较,因此如果您不提供 <commit>,它将默认为 HEAD。如果 HEAD 不存在(例如未创建的分支)且未提供 <commit>,则它将显示所有暂存的更改。--staged 是 --cached 的同义词。

如果提供了 --merge-base,则不使用 <commit>,而是使用 <commit> 和 HEAD 的合并基础。git diff --cached --merge-base A 等效于 git diff --cached $(git merge-base A HEAD)

git diff [<options>] [--merge-base] <commit> [--] [<path>…​]

此形式用于查看您在工作树中相对于指定 <commit> 的更改。您可以使用 HEAD 来将其与最新提交进行比较,或使用分支名称来与其他分支的尖端进行比较。

如果提供了 --merge-base,则不使用 <commit>,而是使用 <commit> 和 HEAD 的合并基础。git diff --merge-base A 等效于 git diff $(git merge-base A HEAD)

git diff [<options>] [--merge-base] <commit> <commit> [--] [<path>…​]

这是为了查看两个任意 <commit> 之间的更改。

如果提供了 --merge-base,则对 "before" 侧使用两个提交的合并基础。git diff --merge-base A B 等效于 git diff $(git merge-base A B) B

git diff [<options>] <commit> <commit>…​ <commit> [--] [<path>…​]

此形式用于查看合并提交的结果。第一个列出的 <commit> 必须是合并本身;剩余的两个或多个提交应该是它的父级。生成所需修订集的便捷方法是使用后缀 ^@^!。如果 A 是一个合并提交,则 git diff A A^@git diff A^!git show A 都会给出相同的合并差异。

git diff [<options>] <commit>..<commit> [--] [<path>…​]

这与早期形式(没有 ..)相同,用于查看两个任意 <commit> 之间的更改。如果省略一方的 <commit>,则它将与使用 HEAD 相同。

git diff [<options>] <commit>...<commit> [--] [<path>…​]

此形式用于查看包含第二个 <commit> 并到第二个 <commit> 的分支上的更改,从两个 <commit> 的共同祖先开始。git diff A...B 等效于 git diff $(git merge-base A B) B。您可以省略任何一个 <commit>,它将与使用 HEAD 相同。

以防您正在执行一些奇特的操作,需要注意的是,上述描述中的所有 <commit>(--merge-base 案例和使用 .. 表示法的最后两种形式除外)可以是任何 <tree>。您感兴趣的树是指向名为 AUTO_MERGE 的引用所指向的树,该引用由 ort 合并策略在遇到合并冲突时写入(请参阅 git-merge[1])。将工作树与 AUTO_MERGE 进行比较将显示您迄今为止为解决文本冲突所做的更改(请参阅下面的示例)。

有关指定 <commit> 的更完整列表,请参阅 gitrevisions[7] 中的 "SPECIFYING REVISIONS" 部分。但是,"diff" 是关于比较两个端点,而不是范围,范围表示法(<commit>..<commit><commit>...<commit>)并不意味着 gitrevisions[7] 中的 "SPECIFYING RANGES" 部分中定义的范围。

git diff [<options>] <blob> <blob>

此形式用于查看两个 Blob 对象的原始内容之间的差异。

选项

-p
-u
--patch

生成补丁(请参阅 使用 -p 生成补丁文本)。这是默认值。

-s
--no-patch

抑制来自差异机制的所有输出。对于像 git show 这样的默认情况下显示补丁的命令,有用的是抑制它们的输出,或者取消命令行中较早的选项(如 --patch--stat)在别名中的效果。

-U<n>
--unified=<n>

生成具有 <n> 行上下文而不是通常的 3 行的差异。意味着 --patch

--output=<file>

输出到特定文件而不是标准输出。

--output-indicator-new=<char>
--output-indicator-old=<char>
--output-indicator-context=<char>

指定用于指示生成的补丁中的新行、旧行或上下文行的字符。通常它们分别是 +- 和 ' '。

--raw

以原始格式生成差异。

--patch-with-raw

-p --raw 的同义词。

--indent-heuristic

启用将差异代码块边界进行移位以使补丁更易于阅读的启发式算法。这是默认值。

--no-indent-heuristic

禁用缩进启发式算法。

--minimal

花费额外的时间来确保生成尽可能小的差异。

--patience

使用 "patience diff" 算法生成差异。

--histogram

使用 "histogram diff" 算法生成差异。

--anchored=<text>

使用 "anchored diff" 算法生成差异。

此选项可以多次指定。

如果一行同时存在于源和目标中,仅存在一次,并且以该文本开头,则该算法会尝试防止它在输出中显示为删除或添加。它在内部使用 "patience diff" 算法。

--diff-algorithm={patience|minimal|histogram|myers}

选择一个差异算法。选项如下:

default, myers

基本的贪婪差异算法。目前,这是默认算法。

minimal

花费额外的时间来确保生成尽可能小的差异。

patience

在生成补丁时使用“patience diff”算法。

histogram

该算法扩展了 patience 算法以“支持低出现率的公共元素”。

例如,如果您将 diff.algorithm 变量配置为非默认值,并希望使用默认值,则必须使用 --diff-algorithm=default 选项。

--stat[=<width>[,<name-width>[,<count>]]]

生成一个差异统计。默认情况下,文件名部分将使用尽可能多的空间,其余部分将用于图形部分。最大宽度默认为终端宽度,如果未连接到终端则为 80 列,可以通过 <width> 覆盖。文件名部分的宽度可以通过在逗号后给出另一个宽度 <name-width> 或通过设置 diff.statNameWidth=<width> 来限制。图形部分的宽度可以通过使用 --stat-graph-width=<width> 或通过设置 diff.statGraphWidth=<width> 来限制。使用 --stat--stat-graph-width 会影响所有生成统计图的命令,而设置 diff.statNameWidthdiff.statGraphWidth 不会影响 git format-patch。通过给出第三个参数 <count>,您可以将输出限制为前 <count> 行,如果还有更多行,则后面跟 ...

这些参数也可以分别使用 --stat-width=<width>--stat-name-width=<name-width>--stat-count=<count> 设置。

--compact-summary

输出扩展标题信息的简要摘要,例如文件创建或删除(“new” 或 “gone”,如果它是符号链接,则可选地添加 “+l”)和模式更改(“+x” 或 “-x” 分别表示添加或删除可执行位)。信息放在文件名部分和图形部分之间。隐含 --stat

--numstat

类似于 --stat,但以十进制表示法显示添加和删除的行数以及路径名,不进行缩写,使其更易于机器处理。对于二进制文件,输出两个 - 而不是 0 0

--shortstat

仅输出 --stat 格式的最后一行,其中包含修改文件的总数以及添加和删除的行数。

-X[<param1,param2,…​>]
--dirstat[=<param1,param2,…​>]

输出每个子目录中相对更改量的分布。--dirstat 的行为可以通过向其传递一个用逗号分隔的参数列表来定制。默认值由 diff.dirstat 配置变量控制(参见 git-config[1])。以下参数可用:

changes

通过计算从源代码中删除的行或添加到目标中的行来计算 dirstat 数字。这忽略了文件中纯代码移动的数量。换句话说,重新排列文件中的行不会像其他更改那样被计算。当没有给出参数时,这是默认行为。

lines

通过进行常规的基于行的差异分析并对删除/添加的行计数进行求和来计算 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[=<param1,param2>…​]

是 --dirstat=files,<param1>,<param2>…​ 的同义词

--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 时,将使用简短格式。这种格式仅显示范围开始和结束处的提交名称。当指定 --submodule--submodule=log 时,将使用日志格式。这种格式会列出范围内的提交,就像 git-submodule[1]summary 一样。当指定 --submodule=diff 时,将使用差异格式。这种格式会显示提交范围内的子模块内容更改的内联差异。默认为 diff.submodule,如果配置选项未设置,则默认为简短格式。

--color[=<when>]

显示彩色差异。--color(即不带 =<when>)与 --color=always 相同。<when> 可以是 alwaysneverauto 之一。它可以通过 color.uicolor.diff 配置设置更改。

--no-color

关闭彩色差异。这可以用来覆盖配置设置。它与 --color=never 相同。

--color-moved[=<mode>]

移动的代码行以不同的颜色显示。它可以通过 diff.colorMoved 配置设置更改。如果未给出选项,则 <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=<modes>

这配置了在对 --color-moved 执行移动检测时如何忽略空格。它可以通过 diff.colorMovedWS 配置设置设置。这些模式可以作为逗号分隔的列表给出:

no

在执行移动检测时不忽略空格。

ignore-space-at-eol

忽略行尾的空格更改。

ignore-space-change

忽略空格数量的更改。这会忽略行尾的空格,并将所有其他一个或多个空格字符序列视为等效。

ignore-all-space

在比较行时忽略空格。这会忽略差异,即使一行有空格而另一行没有空格。

allow-indentation-change

在移动检测中最初忽略任何空白,然后仅当每行的空白变化相同的情况下,才将移动的代码块分组到一个块中。这与其他模式不兼容。

--no-color-moved-ws

在执行移动检测时不忽略空白。这可用于覆盖配置设置。它与 --color-moved-ws=no 相同。

--word-diff[=<mode>]

显示单词差异,使用 <mode> 来分隔更改的单词。默认情况下,单词由空格分隔;请参见下面的 --word-diff-regex。<mode> 默认值为 plain,并且必须是以下之一:

color

仅使用颜色突出显示更改的单词。意味着 --color

plain

将单词显示为 [-removed-]{+added+}。如果分隔符出现在输入中,则不会尝试转义分隔符,因此输出可能不明确。

porcelain

使用专为脚本使用而设计的特殊基于行的格式。添加/删除/未更改的运行以通常的统一差异格式打印,从行首的 +/-/` ` 字符开始,并扩展到行尾。输入中的换行符由单独一行上的波浪号 ~ 表示。

none

再次禁用单词差异。

请注意,尽管第一个模式的名称为“color”,但在所有模式中都使用颜色突出显示更改的部分(如果已启用)。

--word-diff-regex=<regex>

使用 <regex> 来决定什么是单词,而不是将非空格运行视为单词。除非已启用 --word-diff,否则也意味着 --word-diff

<regex> 的每个非重叠匹配都被视为一个单词。为了找到差异,这些匹配之间的任何内容都被视为空格并被忽略(!) 。您可能希望将 |[^[:space:]] 附加到您的正则表达式,以确保它匹配所有非空格字符。包含换行的匹配将被默默地截断(!) 在换行处。

例如,--word-diff-regex=. 将把每个字符都视为一个单词,并且相应地按字符显示差异。

正则表达式也可以通过差异驱动程序或配置选项设置,请参见 gitattributes[5]git-config[1]。明确提供它将覆盖任何差异驱动程序或配置设置。差异驱动程序会覆盖配置设置。

--color-words[=<regex>]

等同于 --word-diff=color 以及(如果指定了正则表达式)--word-diff-regex=<regex>

--no-renames

关闭重命名检测,即使配置文件指定默认执行此操作。

--[no-]rename-empty

是否使用空 Blob 作为重命名源。

--check

如果更改引入了冲突标记或空白错误,则发出警告。什么是空白错误由 core.whitespace 配置控制。默认情况下,尾随空白(包括仅包含空白的行)以及在行首缩进中紧随制表符的空格字符被视为空白错误。如果发现问题,则以非零状态退出。与 --exit-code 不兼容。

--ws-error-highlight=<kind>

突出显示差异的 contextoldnew 行中的空白错误。多个值用逗号分隔,none 重置先前的值,default 将列表重置为 newallold,new,context 的简写。如果没有给出此选项,并且未设置配置变量 diff.wsErrorHighlight,则仅突出显示 new 行中的空白错误。空白错误使用 color.diff.whitespace 着色。

--full-index

在生成补丁格式输出时,不是显示前几个字符,而是显示“index”行上的完整前后映像 Blob 对象名称。

--binary

除了 --full-index 之外,还会输出一个可以使用 git-apply 应用的二进制差异。意味着 --patch

--abbrev[=<n>]

在差异原始格式输出和差异树标题行中,不是显示完整的 40 字节十六进制对象名称,而是显示至少为 <n> 个十六进制数字长的最短前缀,该前缀唯一地引用该对象。在差异补丁输出格式中,--full-index 优先级更高,即如果指定了 --full-index,则无论 --abbrev 如何,都将显示完整的 Blob 名称。可以使用 --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 之间的差异。生成的补丁不打算使用 patchgit apply 应用;这仅仅是为了那些只想集中审查更改后的文本的人。此外,输出显然缺少足够的信息来反向应用此类补丁,即使是手动应用也是如此,因此是选项的名称。

当与 -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 排除添加和删除的路径。

请注意,并非所有差异都包含所有类型。例如,如果禁用了对这些类型的检测,则不会出现已复制和已重命名的条目。

-S<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> 之前的文件(即跳过到),或将它们移动到输出的末尾(即旋转到)。这些选项主要是为 git difftool 命令的用途而发明的,否则可能不太有用。

-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=<lines>

显示 diff 段落之间的上下文,最多指定行数,从而融合彼此靠近的段落。默认为 diff.interHunkContext 或 0(如果未设置配置选项)。

-W
--function-context

对每个更改显示整个函数作为上下文行。函数名称的确定方式与 git diff 确定补丁段落标头的方式相同(请参阅 gitattributes[5] 中的定义自定义段落标头)。

--exit-code

使程序以类似于 diff(1) 的代码退出。也就是说,如果有差异,它将退出代码为 1,而 0 意味着没有差异。

--quiet

禁用程序的所有输出。暗示 --exit-code。禁用其退出代码不可信的外部 diff 帮助程序的执行,即它们各自的配置选项 diff.trustExitCodediff.<driver>.trustExitCode 或环境变量 GIT_EXTERNAL_DIFF_TRUST_EXIT_CODE 为 false。

--ext-diff

允许执行外部 diff 帮助程序。如果您使用 gitattributes[5] 设置了外部 diff 驱动程序,则需要将此选项与 git-log[1] 及其相关命令一起使用。

--no-ext-diff

禁止外部 diff 驱动程序。

--textconv
--no-textconv

允许(或禁止)在比较二进制文件时运行外部文本转换过滤器。有关详细信息,请参阅 gitattributes[5]。由于 textconv 过滤器通常是单向转换,因此生成的 diff 适合人工查看,但不能应用。因此,textconv 过滤器默认情况下仅对 git-diff[1]git-log[1] 启用,而不对 git-format-patch[1] 或 diff 管道命令启用。

--ignore-submodules[=<when>]

在 diff 生成中忽略对子模块的更改。<when> 可以是 "none"、"untracked"、"dirty" 或 "all","all" 是默认值。使用 "none" 将在子模块包含未跟踪或修改的文件,或者其 HEAD 与超级项目中记录的提交不同时,将子模块视为已修改,并且可用于覆盖 git-config[1]gitmodules[5] 中任何忽略选项的设置。使用 "untracked" 时,如果子模块仅包含未跟踪的内容,则不会将子模块视为脏的(但它们仍然会被扫描以查找修改的内容)。使用 "dirty" 将忽略对子模块工作树的所有更改,仅显示对超级项目中存储的提交的更改(这是 1.7.0 之前的行为)。使用 "all" 隐藏对子模块的所有更改。

--src-prefix=<prefix>

显示给定的源前缀,而不是 "a/"。

--dst-prefix=<prefix>

显示给定的目标前缀,而不是 "b/"。

--no-prefix

不显示任何源或目标前缀。

--default-prefix

使用默认源和目标前缀("a/" 和 "b/")。这将覆盖配置变量,例如 diff.noprefixdiff.srcPrefixdiff.dstPrefixdiff.mnemonicPrefix(请参阅 git-config(1))。

--line-prefix=<prefix>

在输出的每一行开头添加额外的前缀。

--ita-invisible-in-index

默认情况下,通过 "git add -N" 添加的条目在 "git diff" 中显示为现有的空文件,在 "git diff --cached" 中显示为新文件。此选项使条目在 "git diff" 中显示为新文件,在 "git diff --cached" 中显示为不存在。此选项可以通过 --ita-visible-in-index 恢复。这两个选项都处于实验阶段,可能会在将来删除。

有关这些常用选项的更详细说明,请参阅 gitdiffcore[7]

-1 --base
-2 --ours
-3 --theirs

将工作树与 "base" 版本(阶段 #1)、"our branch"(阶段 #2)或 "their branch"(阶段 #3)进行比较。索引仅包含未合并条目的这些阶段,即在解决冲突时。有关详细信息,请参阅 git-read-tree[1] 部分“3 路合并”。

-0

省略对未合并条目的 diff 输出,只显示 "Unmerged"。仅当将工作树与索引进行比较时才可以使用。

<path>…​

当给出 <paths> 参数时,它们用于将 diff 限制在命名的路径中(您可以给出目录名,并获取所有文件下的 diff)。

原始输出格式

"git-diff-index"、"git-diff-tree"、"git-diff-files" 和 "git diff --raw" 的原始输出格式非常相似。

这些命令都比较两组东西;比较的内容不同

git-diff-index <tree-ish>

比较 <tree-ish> 和文件系统上的文件。

git-diff-index --cached <tree-ish>

比较 <tree-ish> 和索引。

git-diff-tree [-r] <tree-ish-1> <tree-ish-2> [<pattern>…​]

比较两个参数命名的树。

git-diff-files [<pattern>…​]

比较索引和文件系统上的文件。

"git-diff-tree" 命令首先打印正在比较的内容的哈希值以开始输出。之后,所有命令都会为每个更改的文件打印一行输出。

输出行的格式如下

in-place edit  :100644 100644 bcd1234 0123456 M file0
copy-edit      :100644 100644 abcd123 1234567 C68 file1 file2
rename-edit    :100644 100644 abcd123 1234567 R86 file1 file3
create         :000000 100644 0000000 1234567 A file4
delete         :100644 000000 1234567 0000000 D file5
unmerged       :000000 000000 0000000 0000000 U file6

也就是说,从左到右

  1. 一个冒号。

  2. "src" 的模式;如果创建或未合并,则为 000000。

  3. 一个空格。

  4. "dst" 的模式;如果删除或未合并,则为 000000。

  5. 一个空格。

  6. "src" 的 sha1;如果创建或未合并,则为 0{40}。

  7. 一个空格。

  8. "dst" 的 sha1;如果删除、未合并或 "工作树与索引不同步",则为 0{40}。

  9. 一个空格。

  10. 状态,后面可以跟可选的 "分数" 数字。

  11. 当使用 -z 选项时,为一个制表符或一个 NUL。

  12. "src" 的路径

  13. 当使用 -z 选项时,为一个制表符或一个 NUL;仅存在于 C 或 R 中。

  14. "dst" 的路径;仅存在于 C 或 R 中。

  15. 当使用 -z 选项时,为一个 LF 或一个 NUL,用于终止记录。

可能的 status 字母为

  • A: 添加文件

  • C: 将文件复制到新文件

  • D: 删除文件

  • M: 修改文件的内容或模式

  • R: 重命名文件

  • T: 更改文件类型(普通文件、符号链接或子模块)

  • U: 文件未合并(您必须在提交之前完成合并)

  • X: "未知" 更改类型(很可能是 bug,请报告)

状态字母 C 和 R 始终后跟一个分数(表示移动或复制的源和目标之间的相似度百分比)。状态字母 M 可能后跟一个分数(表示文件重写的不相似度百分比)。

如果文件系统上的文件与索引不同步,则 "dst" 的 sha1 将显示为全 0。

示例

:100644 100644 5be4a4a 0000000 M file.c

如果没有 -z 选项,具有“非标准”字符的路径名将按配置变量 core.quotePath 中解释的那样被引用(参见 git-config[1])。使用 -z,文件名将原样输出,行以 NUL 字节结尾。

合并的 diff 格式

"git-diff-tree"、"git-diff-files" 和 "git-diff --raw" 可以接受 -c--cc 选项,以生成合并提交的 diff 输出。输出与上面描述的格式不同,具体如下:

  1. 每个父节点都有一个冒号

  2. 有更多 "src" 模式和 "src" sha1

  3. 状态是每个父节点的连接状态字符

  4. 没有可选的“分数”数字

  5. 以制表符分隔的文件路径名

对于 -c--cc,即使文件在历史记录的任何一方都被重命名,也只显示目标路径或最终路径。使用 --combined-all-paths,将显示每个父节点中的路径名称,然后是合并提交中的路径名称。

-c--cc 没有 --combined-all-paths 的示例

::100644 100644 100644 fabadb8 cc95eb0 4866510 MM	desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM	bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR	phooey.c

--combined-all-paths 添加到 -c--cc 的示例

::100644 100644 100644 fabadb8 cc95eb0 4866510 MM	desc.c	desc.c	desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM	foo.sh	bar.sh	bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR	fooey.c	fuey.c	phooey.c

请注意,组合 diff 只列出从所有父节点修改的文件。

使用 -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_DIFFGIT_DIFF_OPTS 环境变量(参见 git[1])以及 diff 属性(参见 gitattributes[5])自定义补丁文本的创建。

-p 选项生成的输出与传统的 diff 格式略有不同

  1. 它前面有一个 "git diff" 头,看起来像这样

    diff --git a/file1 b/file2

    a/b/ 文件名相同,除非涉及重命名/复制。特别地,即使对于创建或删除,/dev/null不会用作 a/b/ 文件名的替代。

    当涉及重命名/复制时,file1file2 分别显示重命名/复制的源文件名和重命名/复制生成的的文件名。

  2. 它后面是一个或多个扩展标题行

    old mode <mode>
    new mode <mode>
    deleted file mode <mode>
    new file mode <mode>
    copy from <path>
    copy to <path>
    rename from <path>
    rename to <path>
    similarity index <number>
    dissimilarity index <number>
    index <hash>..<hash> <mode>

    文件模式以 6 位八进制数字打印,包括文件类型和文件权限位。

    扩展标题中的路径名称不包括 a/b/ 前缀。

    相似度指数是不变行的百分比,不相似度指数是更改行的百分比。它是一个四舍五入的整数,后面跟着一个百分号。因此,100% 的相似度指数值保留给两个相等的文件,而 100% 的不相似度意味着旧文件中没有一行进入新文件。

    索引行包括更改前后 Blob 对象的名称。如果文件模式没有改变,则包含 <mode>;否则,单独的行将指示旧模式和新模式。

  3. 具有“非标准”字符的路径名将按配置变量 core.quotePath 中解释的那样被引用(参见 git-config[1])。

  4. 输出中的所有 file1 文件都指的是提交之前的文件,所有 file2 文件都指的是提交之后的的文件。按顺序将每个更改应用于每个文件是不正确的。例如,此补丁将交换 a 和 b

    diff --git a/a b/b
    rename from a
    rename to b
    diff --git a/b b/a
    rename from b
    rename to a
  5. 块标题会提到块适用的函数名称。有关如何根据特定语言定制此功能的详细信息,请参阅 gitattributes[5] 中的“定义自定义块标题”。

组合 diff 格式

任何生成 diff 的命令都可以接受 -c--cc 选项,以便在显示合并时生成组合 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);
  1. 它前面有一个 "git diff" 头,看起来像这样(使用 -c 选项时)

    diff --combined file

    或者这样(使用 --cc 选项时)

    diff --cc file
  2. 它后面是一个或多个扩展标题行(此示例显示具有两个父节点的合并)

    index <hash>,<hash>..<hash>
    mode <mode>,<mode>..<mode>
    new file mode <mode>
    deleted file mode <mode>,<mode>

    mode <mode>,<mode>..<mode> 行只有在至少一个 <mode> 与其他 <mode> 不同时才会出现。包含有关检测到的内容移动(重命名和复制检测)信息的扩展标题旨在与两个 <tree-ish> 的 diff 一起使用,组合 diff 格式不使用它们。

  3. 它后面是一个两行从文件/到文件的标题

    --- a/file
    +++ b/file

    与传统统一 diff 格式的两行标题类似,/dev/null 用于表示创建或删除的文件。

    但是,如果提供 --combined-all-paths 选项,您将获得 N+1 行从文件/到文件的标题,而不是两行从文件/到文件的标题,其中 N 是合并提交中的父节点数量

    --- a/file
    --- a/file
    --- a/file
    +++ b/file

    如果重命名或复制检测处于活动状态,此扩展格式很有用,因为它可以让您查看不同父节点中文件的原始名称。

  4. 块标题格式已修改,以防止人们不小心将其提供给 patch -p1。组合 diff 格式是为了审查合并提交更改而创建的,而不是为了应用而创建的。更改类似于扩展索引标题中的更改

    @@@ <from-file-range> <from-file-range> <to-file-range> @@@

    在组合 diff 格式的块标题中,有(父节点数量 + 1)个 @ 字符。

与显示两个文件 A 和 B 以及包含 -(减号 - 出现在 A 中但在 B 中被删除)、+(加号 - 在 A 中缺失但在 B 中被添加)或 " "(空格 - 不变)前缀的单个列的传统统一 diff 格式不同,此格式比较两个或多个文件 file1、file2、…​ 与一个文件 X,并显示 X 与每个 fileN 的不同之处。在输出行之前为每个 fileN 预留一个列,以记录 X 的行与它的不同之处。

列 N 中的 - 字符表示该行出现在 fileN 中,但没有出现在结果中。列 N 中的 + 字符表示该行出现在结果中,并且 fileN 没有该行(换句话说,从该父节点的角度来看,该行已被添加)。

在上面的示例输出中,函数签名已从两个文件中更改(因此两个 - 从 file1 和 file2 中删除,加上 ++ 表示没有出现在 file1 或 file2 中的一行已添加)。此外,其他八行与 file1 相同,但没有出现在 file2 中(因此以 + 为前缀)。

当使用 git diff-tree -c 显示时,它会将合并提交的父节点与合并结果进行比较(即,file1..fileN 是父节点)。当使用 git diff-files -c 显示时,它会将两个未解决的合并父节点与工作树文件进行比较(即,file1 是阶段 2,也称为“我们的版本”,file2 是阶段 3,也称为“他们的版本”)。

其他 diff 格式

--summary 选项描述新添加、删除、重命名和复制的文件。--stat 选项将 diffstat(1) 图表添加到输出。这些选项可以与其他选项(例如 -p)组合使用,并且旨在供人类使用。

当显示涉及重命名或复制的更改时,--stat 输出会通过组合路径名的公共前缀和后缀,以紧凑的方式格式化路径名。例如,将 arch/i386/Makefile 移动到 arch/x86/Makefile 并同时修改 4 行的更改将显示如下

arch/{i386 => x86}/Makefile    |   4 +--

--numstat 选项会提供 diffstat(1) 信息,但设计用于更易于机器使用。--numstat 输出中的条目看起来像这样

1	2	README
3	1	arch/{i386 => x86}/Makefile

也就是说,从左到右

  1. 添加行的数量;

  2. 制表符;

  3. 删除行的数量;

  4. 制表符;

  5. 路径名(可能包含重命名/复制信息);

  6. 换行符。

-z 输出选项生效时,输出将以这种方式格式化

1	2	README NUL
3	1	NUL arch/i386/Makefile NUL arch/x86/Makefile NUL

也就是说

  1. 添加行的数量;

  2. 制表符;

  3. 删除行的数量;

  4. 制表符;

  5. NUL(只有在重命名/复制时才会存在);

  6. 原像中的路径名;

  7. NUL(只有在重命名/复制时才会存在);

  8. 后像中的路径名(只有在重命名/复制时才会存在);

  9. NUL。

重命名情况下原像路径之前的额外 NUL 用于允许读取输出的脚本在不提前读取的情况下确定当前正在读取的记录是单路径记录还是重命名/复制记录。在读取添加和删除的行后,读取直到 NUL 会生成路径名,但如果它是 NUL,则记录将显示两个路径。

示例

检查工作树的各种方法
$ git diff            (1)
$ git diff --cached   (2)
$ git diff HEAD       (3)
$ git diff AUTO_MERGE (4)
  1. 工作树中尚未暂存以供下次提交的更改。

  2. 索引与上次提交之间的更改;如果您在没有 -a 选项的情况下运行 git commit,您将提交的内容。

  3. 自上次提交以来,工作树中发生的更改;如果您运行 git commit -a,您将提交的内容。

  4. 您为解决文本冲突而进行的工作树更改。

与任意提交进行比较
$ git diff test            (1)
$ git diff HEAD -- ./test  (2)
$ git diff HEAD^ HEAD      (3)
  1. 不要使用当前分支的顶端,而是与 "test" 分支的顶端进行比较。

  2. 不要与 "test" 分支的顶端进行比较,而是与当前分支的顶端进行比较,但将比较限制在 "test" 文件。

  3. 比较上次提交之前的版本和上次提交。

比较分支
$ git diff topic master    (1)
$ git diff topic..master   (2)
$ git diff topic...master  (3)
  1. 主题分支和主分支顶端的差异。

  2. 与上面相同。

  3. 自主题分支从主分支创建后,主分支上发生的更改。

限制 diff 输出
$ git diff --diff-filter=MRC            (1)
$ git diff --name-status                (2)
$ git diff arch/i386 include/asm-i386   (3)
  1. 仅显示修改、重命名和复制,但不显示添加或删除。

  2. 仅显示名称和更改类型,但不显示实际 diff 输出。

  3. 将 diff 输出限制为指定的子树。

混淆 diff 输出
$ git diff --find-copies-harder -B -C  (1)
$ git diff -R                          (2)
  1. 花费额外的时间来寻找重命名、复制和完整的重写(非常昂贵)。

  2. 以相反的顺序输出 diff。

配置

本节中此行以下的所有内容都是从 git-config[1] 文档中选择性地包含的。内容与在那里找到的内容相同。

diff.autoRefreshIndex

当使用 git diff 与工作树文件进行比较时,不要将仅状态更改视为已更改。而是静默运行 git update-index --refresh 来更新工作树中内容与索引中内容匹配的路径的缓存状态信息。此选项默认为 true。请注意,这仅影响 git diff Porcelain,而不影响更低级别的 diff 命令,例如 git diff-files

diff.dirstat

一个逗号分隔的 --dirstat 参数列表,指定 git-diff[1] 及其相关命令的 --dirstat 选项的默认行为。默认值可以在命令行中被覆盖(使用 --dirstat=<param1,param2,...>)。回退默认值(当未被 diff.dirstat 更改时)为 changes,noncumulative,3。以下参数可用

changes

通过计算从源代码中删除的行或添加到目标中的行来计算 dirstat 数字。这忽略了文件中纯代码移动的数量。换句话说,重新排列文件中的行不会像其他更改那样被计算。当没有给出参数时,这是默认行为。

lines

通过进行常规的基于行的差异分析并对删除/添加的行计数进行求和来计算 dirstat 数字。(对于二进制文件,改为计算 64 字节块,因为二进制文件没有自然的行概念)。这比 changes 行为更昂贵的 --dirstat 行为,但它将文件中重新排列的行与其他更改一样多地计算在内。生成的输出与您从其他 --*stat 选项中获得的一致。

files

通过计算更改的文件数量来计算 dirstat 数字。每个更改的文件在 dirstat 分析中都具有相同的权重。这是计算成本最低的 --dirstat 行为,因为它根本不需要查看文件内容。

cumulative

还为父目录计算子目录中的更改。请注意,当使用 cumulative 时,报告的百分比之和可能会超过 100%。可以使用 noncumulative 参数指定默认(非累积)行为。

<limit>

一个整型参数指定一个截止百分比(默认值为 3%)。贡献小于此百分比更改的目录不会显示在输出中。

示例:以下将计算更改的文件,同时忽略更改文件总数不到 10% 的目录,并在父目录中累积子目录计数:files,10,cumulative

diff.statNameWidth

限制 --stat 输出中文件名部分的宽度。如果设置,则适用于所有生成 --stat 输出的命令,除了 format-patch。

diff.statGraphWidth

限制 --stat 输出中图形部分的宽度。如果设置,则适用于所有生成 --stat 输出的命令,除了 format-patch。

diff.context

生成具有 <n> 行上下文而不是默认的 3 行的 diff。此值将被 -U 选项覆盖。

diff.interHunkContext

显示 diff 代码块之间的上下文,最多指定行数,从而将彼此靠近的代码块合并在一起。此值用作 --inter-hunk-context 命令行选项的默认值。

diff.external

如果此配置变量已设置,则 diff 生成不是使用内部 diff 机制执行的,而是使用给定的命令执行的。可以使用 ‘GIT_EXTERNAL_DIFF’ 环境变量覆盖。该命令以参数调用,如 git[1] 中的“git Diffs”部分所述。注意:如果你只想对文件子集使用外部 diff 程序,你可能想使用 gitattributes[5] 而不是。

diff.trustExitCode

如果此布尔值设置为 true,则 diff.external 命令预计如果认为输入文件相等则返回退出代码 0,如果认为输入文件不同则返回 1,就像 diff(1) 一样。如果它设置为 false(默认值),则该命令预计无论是否相等都返回退出代码 0。任何其他退出代码都会导致 Git 报告致命错误。

diff.ignoreSubmodules

设置 --ignore-submodules 的默认值。请注意,这仅影响 git diff Porcelain,而不影响更低级别的 diff 命令,例如 git diff-filesgit checkoutgit switch 在报告未提交的更改时也会遵守此设置。将其设置为 all 将禁用 git commitgit status 通常显示的子模块摘要(当 status.submoduleSummary 设置时),除非使用 --ignore-submodules 命令行选项覆盖。git submodule 命令不受此设置的影响。默认情况下,它被设置为 untracked,以便忽略任何未跟踪的子模块。

diff.mnemonicPrefix

如果已设置,git diff 将使用与标准“a/”和“b/”不同的前缀对,具体取决于比较的对象。当此配置生效时,反向 diff 输出也会交换前缀的顺序。

git diff

比较(i)ndex 和(w)ork tree;

git diff HEAD

比较(c)ommit 和(w)ork tree;

git diff --cached

比较(c)ommit 和(i)ndex;

git diff HEAD:file1 file2

比较(o)bject 和(w)ork tree 实体;

git diff --no-index a b

比较两个非 Git 东西(1)和(2)。

diff.noPrefix

如果已设置,git diff 不会显示任何源或目标前缀。

diff.srcPrefix

如果已设置,git diff 将使用此源前缀。默认为“a/”。

diff.dstPrefix

如果已设置,git diff 将使用此目标前缀。默认为“b/”。

diff.relative

如果设置为 truegit diff 不会显示目录外的更改,并显示相对于当前目录的路径名。

diff.orderFile

指示如何在 diff 中对文件排序的文件。有关详细信息,请参阅 git-diff[1]-O 选项。如果 diff.orderFile 是一个相对路径名,则将其视为相对于工作树的顶部。

diff.renameLimit

在复制/重命名检测的详尽部分中要考虑的文件数量;相当于 git diff 选项 -l。如果未设置,则当前默认值为 1000。如果重命名检测被关闭,此设置将不起作用。

diff.renames

Git 是否以及如何检测重命名。如果设置为“false”,则禁用重命名检测。如果设置为“true”,则启用基本重命名检测。如果设置为“copies”或“copy”,Git 将检测复制。默认为 true。请注意,这仅影响 git diff Porcelain(如 git-diff[1]git-log[1]),而不影响更低级别的命令(如 git-diff-files[1])。

diff.suppressBlankEmpty

一个布尔值,用于抑制打印每个空输出行之前的空格的标准行为。默认为 false。

diff.submodule

指定显示子模块差异的格式。“short”格式仅显示范围开始和结束时的提交名称。“log”格式像 git-submodule[1] summary 一样列出范围内的提交。“diff”格式显示子模块内容更改的内联 diff。默认为“short”。

diff.wordRegex

一个 POSIX 扩展正则表达式,用于在执行逐字差异计算时确定什么是“单词”。匹配正则表达式的字符序列是“单词”,所有其他字符都是可忽略的空格。

diff.<driver>.command

自定义 diff 驱动程序命令。有关详细信息,请参阅 gitattributes[5]

diff.<driver>.trustExitCode

如果此布尔值设置为 true,则 diff.<driver>.command 命令预计如果认为输入文件相等则返回退出代码 0,如果认为输入文件不同则返回 1,就像 diff(1) 一样。如果它设置为 false(默认值),则该命令预计无论是否相等都返回退出代码 0。任何其他退出代码都会导致 Git 报告致命错误。

diff.<driver>.xfuncname

diff 驱动程序应使用以识别代码块头的正则表达式。也可以使用内置模式。有关详细信息,请参阅 gitattributes[5]

diff.<driver>.binary

将此选项设置为 true 以使 diff 驱动程序将文件视为二进制文件。有关详细信息,请参阅 gitattributes[5]

diff.<driver>.textconv

diff 驱动程序应调用的命令,以生成文件的文本转换版本。转换的结果用于生成人类可读的 diff。有关详细信息,请参阅 gitattributes[5]

diff.<driver>.wordRegex

diff 驱动程序应使用以分割一行中的单词的正则表达式。有关详细信息,请参阅 gitattributes[5]

diff.<driver>.cachetextconv

将此选项设置为 true 以使 diff 驱动程序缓存文本转换输出。有关详细信息,请参阅 gitattributes[5]

  • araxis

  • bc

  • codecompare

  • deltawalker

  • diffmerge

  • diffuse

  • ecmerge

  • emerge

  • examdiff

  • guiffy

  • gvimdiff

  • kdiff3

  • kompare

  • meld

  • nvimdiff

  • opendiff

  • p4merge

  • smerge

  • tkdiff

  • vimdiff

  • vscode

  • winmerge

  • xxdiff

diff.indentHeuristic

将此选项设置为 false 以禁用默认启发式方法,这些方法会将 diff 代码块边界移位以使补丁更易于阅读。

diff.algorithm

选择一个差异算法。选项如下:

default, myers

基本的贪婪差异算法。目前,这是默认算法。

minimal

花费额外的时间来确保生成尽可能小的差异。

patience

在生成补丁时使用“patience diff”算法。

histogram

该算法扩展了 patience 算法以“支持低出现率的公共元素”。

diff.wsErrorHighlight

突出显示 diff 的 contextoldnew 行中的空格错误。多个值用逗号分隔,none 重置先前值,default 将列表重置为 newallold,new,context 的简写。空格错误将使用 color.diff.whitespace 着色。命令行选项 --ws-error-highlight=<kind> 会覆盖此设置。

diff.colorMoved

如果设置为有效的 <mode> 或 true 值,则 diff 中的移动行将以不同的颜色显示,有关有效模式的详细信息,请参阅 git-diff[1] 中的 --color-moved。如果简单地设置为 true,则将使用默认颜色模式。设置为 false 时,移动行不会着色。

diff.colorMovedWS

当使用例如 diff.colorMoved 设置对移动行进行着色时,此选项控制 <mode> 如何处理空格。有关有效模式的详细信息,请参阅 git-diff[1] 中的 --color-moved-ws

Git

git[1] 套件的一部分

scroll-to-top