git diff-files (Git) – Git 中文开发手册
git diff-files (Git) - Git 中文开发手册
名称(Name)
git-diff-files - 比较工作树和索引中的文件
概要
git diff-files [-q] [-0|-1|-2|-3|-c|--cc] [] [ …]
描述
比较工作树中的文件和索引。当指定路径时,只比较那些命名的路径。否则,将比较索引中的所有条目。输出格式是一样的git diff-index和git diff-tree。
选项
-p -u --patch
生成补丁(请参阅生成补丁一节)。
-s --no-patch
抑制差异输出。对于像git show这样的命令很有用,默认显示补丁,或者取消--patch效果。
-U
使用
--raw
以原始格式生成差异。这是默认设置。
--patch-with-raw
-p --raw的同义词。
- 缩进 - 启发式 - 不缩进 - 启发式 ( --indent-heuristic --no-indent-heuristic)
这些是为了帮助调试和调整实验启发式(默认情况下是关闭的),这些启发式技术改变了差异边界以使修补程序更易于阅读。
--minimal
花费额外的时间来确保生成最小可能的差异。
--patience
使用“耐心差异”算法生成差异。
--histogram
使用“直方图差异”算法生成差异。
--diff-algorithm={patience|minimal|histogram|myers}
选择一种差异算法。变体如下:
default, myers
基本的贪婪 diff 算法。目前,这是默认设置。
minimal
花费额外的时间来确保生成最小可能的差异。
patience
生成补丁时使用“耐心差异”算法。
histogram
该算法将耐心算法扩展为“支持低出现率的通用元素”。
例如,如果您将 diff.algorithm 变量配置为非默认值并且想要使用默认值,那么您必须使用--diff-algorithm=default选项。
--stat[=
生成一个 diffstat。默认情况下,文件名部分使用尽可能多的空间,其余部分使用图形部分。最大宽度默认为终端宽度,如果未连接到终端,则最大宽度为80列,并且可以被覆盖
这些参数也可以单独设置--stat-width=
--numstat
类似于--stat,但显示十进制表示法中添加和删除的行数以及不带缩写的路径名,以使其更加机器友好。对于二进制文件,输出两个-而不是说0 0。
--shortstat
只输出--stat包含修改文件总数的格式的最后一行,以及添加和删除行的数量。
--dirstat=
输出每个子目录的相对变化量分布。--dirstat可以通过传递逗号分隔的参数列表来定制行为。默认值由diff.dirstat配置变量控制(请参阅 git-config [1])。以下参数可用:
changes
通过计算已从源中删除或添加到目标的行来计算 dirstat 数字。这会忽略文件中纯代码移动的数量。换句话说,重新排列文件中的行数不会与其他更改一样多。这是没有给出参数时的默认行为。
lines
通过执行常规基于行的差异分析来计算dirstat数字,并将删除/添加的行数相加。(对于二进制文件,取而代之的是计算64字节的块,因为二进制文件没有自然的行概念)。这是一种--dirstat比changes行为更为昂贵的行为,但它可以像其他更改一样计算文件中重新排列的行数。结果输出与您从其他--*stat选项中获得的结果一致。
files
通过计算更改的文件数量来计算 dirstat 数字。dirstat 分析中每个更改的文件都相同。这是计算上最便宜的--dirstat行为,因为它不必查看文件内容。
cumulative
计数父目录的子目录中的更改。请注意,使用时cumulative,报告的百分比总和可能超过100%。默认(非累积)行为可以用noncumulative参数指定。
整数参数指定截断百分比(默认为3%)。输出中不显示贡献小于此百分比的目录。
示例:以下内容将计数已更改的文件,同时忽略占已更改文件总数少于10%的目录,并累积父目录中的子目录计数:--dirstat=files,10,cumulative。
--summary
输出扩展头信息的精简摘要,如创建,重命名和模式更改。
--patch-with-stat
-p --stat的同义词。
-z
当--raw,--numstat,--name-only或--name-status已给出,非 Munge 时间路径名,并使用完全无效的输出字段终止符。
如果没有这个选项,带有“不寻常”字符的路径名将按照配置变量的说明引用core.quotePath(请参阅 git-config [1])。
--name-only
仅显示已更改文件的名称。
--name-status
仅显示已更改文件的名称和状态。有关--diff-filter状态字母的含义,请参阅选项说明。
--submodule=
指定如何显示子模块中的差异。指定使用--submodule=short的short格式时。这种格式只显示范围开始和结束处的提交名称。当--submodule或者--submodule=log被指定时,使用log格式。这种格式列出了像 git-submodule [1] summary那样的提交。当--submodule=diff指定时,使用diff格式。这种格式显示了提交范围内子模块内容变化的内嵌比较。如果配置选项未设置,则默认为diff.submodule或short格式。
--color=
显示有色差异。--color(即没有=
--no-color
关闭有色差异。它和--color=never一样。
--word-diff=
显示一个单词 diff,使用
颜色(color )
仅使用颜色突出显示更改的词。意味着--color。
plain
将单词显示为[-removed-]和{+added+}。如果输入中出现分隔符,则不会尝试跳过分隔符,因此输出可能不明确。
porcelain
使用专门用于脚本消费的基于行的格式。以通常的统一差异格式打印已添加/已删除/未更改的运行,以行开头处的+/ -/字符开始并延伸至行尾。输入中~的换行符通过它自己的一行代字符表示。
没有 (none)
再次禁用字差异。
请注意,尽管第一个模式的名称,如果启用,颜色将用于突出显示所有模式中更改的部分。
--word-diff-regex=
使用
每个
例如,--word-diff-regex=.将每个字符看作单词,并相应地逐个字符地显示差异。
正则表达式也可以通过 diff 驱动程序或配置选项来设置,请参阅 gitattributes [5]或 git-config [1]。显式给予它将覆盖任何diff驱动程序或配置设置。差异驱动程序覆盖配置设置
--color-words=
相当于--word-diff=color加号(如果指定了正则表达式)--word-diff-regex=
--no-renames
关闭重命名检测,即使配置文件提供了默认设置。
--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
在生成补丁格式输出时,在“索引”行上显示完整的映像前和映像后blob对象名称,而不是第一批字符。
--binary
除了--full-index输出可以应用的二进制差异git-apply。
--abbrev=
不是在 diff-raw 格式输出和 diff-tree标题行中显示完整的40字节十六进制对象名称,只显示部分前缀。这与 --full-index上面的选项无关,后者控制 diff-patch 输出格式。非默认的位数可以用指定--abbrev=
-B
将完全重写更改分解为删除和创建对。这有两个目的:
它影响到一种改变的方式,这种改变相当于整个文件的重写,而不是像一系列删除和插入混合在一起,只有几行文本与上下文相匹配,但是作为一个单一的删除旧的一切,随后是一个单次插入所有新事物,并且数字m控制-B选项的这个方面(默认为60%)。-B/70%指定只有少于30%的原始数据应保留在Git的结果中,以便将其视为全部重写(否则结果补丁将是一系列与上下文行混合的删除和插入)。
与-M 一起使用时,完全重写的文件也被认为是重命名的来源(通常-M 仅考虑作为重命名源消失的文件),并且该数字n控制着-B选项的这个方面(默认为50%)。-B20%指定添加和删除相对于文件大小的20%或更多的更改有资格作为重命名为其他文件的可能来源。
-M
检测重命名。如果n被指定,则它是相似度指数的阈值(即与文件大小相比的添加/删除量)。例如,-M90%如果超过90%的文件没有改变,Git应该考虑删除/添加对是一个重命名。如果没有%符号,该数字应作为分数读取,并在其前面加小数点。即,-M5变成0.5,并且因此是相同的-M50%。同样的,-M05也是一样的-M5%。要将检测限制为精确重命名,请使用-M100%。默认相似度指数为50%。
-C
检测副本以及重命名。另见--find-copies-harder。如果n被指定,它的含义与-M
--find-copies-harder
出于性能原因,默认情况下,-C只有当副本的原始文件在相同的变更集中被修改时,选项才会查找副本。该标志使命令检查未修改的文件作为复制源的候选项。对于大型项目来说这是一项非常昂贵的操作,因此请谨慎使用。给予多个-C选项具有相同的效果。
-D --irreversible-delete
省略原图像进行删除,即仅打印标题,但不打印原像和之间的差异/dev/null。由此产生的补丁不适用于patch或git apply; 这仅适用于那些想专注于更改后查看文本的人。另外,输出显然缺乏足够的信息来反向应用这样的补丁,甚至是手动的,因此也就是选项的名称。
在与-B删除/创建对的删除部分一起使用时,还要省略原像。
-l
在-M和-C选项需要为O(n ^ 2)的处理时间,其中n是/复制目标潜在的重命名的数目。如果重命名/复制目标的数量超过指定的数量,则此选项可防止重命名/复制检测运行。
--diff-filter=[(A|C|D|M|R|T|U|X|B)…*]
选择仅添加(A),复制(C),删除(D),修改(M),重命名(R),其类型(即常规文件,符号链接,子模块,...)更改(T),Unmerged(U),未知(X)或已配对Broken(B)。可以使用任何过滤字符的组合(包括无)。当*(全部或无)添加到组合中时,如果有任何文件与比较中的其他条件匹配,则选择所有路径; 如果没有与其他标准匹配的文件,则不会选择任何内容。
此外,这些大写字母可以降低排除。例如--diff-filter=ad排除添加和删除的路径。
-S
查找改变文件中指定字符串出现次数(即添加/删除)的差异。旨在供剧本使用。
当你寻找一个精确的代码块(比如一个结构体)并且想知道该块自第一次出现以来的历史记录时,它非常有用:迭代地使用该特征将原始图像中的有趣块返回到-S,并继续前进,直到获得该块的第一个版本。
-G
寻找补丁文本包含与
为了说明之间的区别-S
+ return !regexec(regexp, two->ptr, 1, ®match, 0); ... - hit = !regexec(regexp, mf2.ptr, 1, ®match, 0);
虽然git log -G"regexec\(regexp"会显示此提交,但git log -S"regexec\(regexp" --pickaxe-regex不会(因为该字符串的出现次数没有改变)。
有关pickaxe更多信息,请参阅 gitdiffcore [7]中的条目。
--pickaxe-all
当-S或-G发现更改时,显示该更改集中的所有更改,而不仅仅是包含
--pickaxe-regex
将给定的
-O
控制文件在输出中出现的顺序。这覆盖了diff.orderFile配置变量(请参阅 git-config [1])。取消diff.orderFile,使用-O/dev/null。
输出顺序由
按以下方式解析
空白行被忽略,所以它们可以用作分隔符以提高可读性。以散列(“ #”)开头的行会被忽略,因此它们可以用于注释。\如果以散列开头,则在模式的开头添加反斜杠(“ ”)。每个其他行都包含一个pattern.atterns与没有FNM_PATHNAME标志的fnmantch(3)使用的模式具有相同的语法和语义,除非路径名也匹配模式,如果删除任何数量的最终路径名组件都与该模式匹配。例如,模式“ foo*bar”匹配“ fooasdfbar”和“ foo/bar/baz/asdf”但不是“foobarx即使一行有空白,而另一行没有空白,这也会忽略差异。--ignore-blank-lines忽略其行全部空白的更改。--inter-hunk-context =
可能的状态字母是:
A:添加一个文件C:将文件复制到新文件中D:删除文件M:修改文件的内容或模式R:重命名文件T:改变文件的类型U:文件未合并(必须先完成合并,然后才能提交)X:“未知”更改类型(最可能是一个错误,请报告)状态字母 C 和 R 总是跟着一个分数(表示移动或复制的来源和目标之间的相似百分比)。状态字母 M 后可以跟一个文件重写的分数(表示不相似性的百分比)。
如果文件是文件系统上的新文件并且与索引不同步,则
示例:
:100644 100644 5be4a4...... 000000...... M file.c
如果没有这个-z选项,带有“不寻常”字符的路径名将按照配置变量的说明引用core.quotePath(请参阅 git-config [1])。使用-z文件名是逐字输出的,并且该行由 NUL 字节终止。
比较格式的合并
"git-diff-tree", "git-diff-files" and "git-diff --raw" 可以采取-c或--cc选项,也产生差异输出合并提交。输出与上述格式的不同之处在于:
每个父母都有一个冒号还有更多的“src”模式和“src”sha1状态是每个父级的连接状态字符没有可选的“分数”号码单个路径,仅适用于“dst”示例::: 100644 100644 100644 fabadb8 ... cc95eb0 ... 4866510 ... MM describe.c 注意:combined diff仅列出所有父母修改过的文件。使用-p 生成补丁程序当使用“git- diff-index“,”git-diff-tree“或者”git-diff-files“可以通过-p选项运行,”git diff“不带--raw选项,或者”git log“用”-p“选项运行不产生上述输出; 相反,他们生成一个补丁文件。您可以通过GIT_EXTERNAL_DIFF和GIT_DIFF_OPTS环境变量自定义这些修补程序的创建。-p选项生成的内容与传统的diff格式略有不同:它前面有一个“git diff”头,看起来像这样:
diff --git a/file1 b/file2
在a/和b/文件名是,除非重命名/副本所涉及的相同。尤其是,即使是创建或删除,/dev/null也可not用于替换文件名a/或b/文件名。
当重命名/复制参与,file1和file2示出了重命名/复制的源文件的名称和重命名/复制分别产生,该文件的名称。
它后跟一个或多个扩展标题行:旧模式
差异diff --组合文件
或者像这样(当使用--cc选项时):
diff --cc 文件
它后面跟着一个或多个扩展标题行(此示例显示与两个父级合并):index
--- a /文件+++ b /文件
类似于传统unified差异格式的双行标题,/dev/null用于表示创建或删除的文件。
块头格式被修改以防止人们意外地将其提供给patch -p1。组合的差异格式是为了审查合并提交更改而创建的,并不适用于应用。这个改变类似于扩展index头中的改变:@@@ <从文件范围到<从文件范围到<到文件范围> @@@有(父数+ 1)个@字符不同于传统的unifieddiff格式,它显示两个文件A和B,其中一个列有-(减号 - 出现在A中,但在B中删除),+(加 - 在A中丢失,但添加到B中) , 要么" "(空格不变)前缀,此格式将两个或多个文件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 aka“我们的版本”,file2是阶段3 aka“他们的版本”)其他diff格式该--summary选项描述新添加,删除,重命名并复制文件。该--stat选项将diffstat(1)图添加到输出。这些选项可以与其他选项结合使用,如-p用于人类消费。当显示涉及重命名或复制的更改时,--stat输出通过结合路径名的通用前缀和后缀来紧凑地格式化路径名。例如,移动的改变arch/i386/Makefile,以arch/x86/Makefile在修改4线将示出这样的:拱/ {I386 => 86} /生成文件| 4 + - 该--numstat选项提供了diffstat(1)信息,但设计用于更简单的机器消耗。--numstat输出中的条目如下所示:1 2自述文件3 1 arch / {i386 => x86} / Makefile即从左至右:增加的行数;标签;删除的行数;标签;路径名(可能带有重命名/复制信息);一个换行符。当-z输出选项有效时,输出格式如下:1 2 README NUL 3 1 NUL arch / i386 / Makefile NUL arch / x86 / Makefile NULThat 是:增加的行数;标签;删除的行数;标签;NUL(只有在重命名/复制时才存在);preimage 中的路径名;NUL(只有在重命名/复制时才存在);postimage 中的路径名(只有在重命名/复制时才存在);a NUL.
NUL重命名之前的 preimage 路径之前的额外内容是允许读取输出的脚本判断当前正在读取的记录是单路径记录还是重命名/复制记录,而不提前读取。阅读添加和删除的行后,读取NUL会产生路径名,但如果是这样NUL,该记录将显示两个路径。
Git 中文开发手册