Git 中文参考(二)(3)https://developer.aliyun.com/article/1565795
在一个位置添加并在另一个位置删除的任何行都将使用 color.diff.newMoved 进行着色。类似地, color.diff.oldMoved 将用于在 diff 中的其他位置添加的已删除行。此模式选择任何已移动的行,但在检查中确定是否在没有置换的情况下移动了代码块时,它不是很有用。
blocks
贪婪地检测至少 20 个字母数字字符的移动文本块。使用 color.diff.{old,new} Moved 颜色绘制检测到的块。相邻的块不能分开。
zebra
在 block 模式中检测移动文本块。使用 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
忽略 EOL 中的空白更改。
ignore-space-change
忽略空格量的变化。这会忽略行尾的空格,并将一个或多个空白字符的所有其他序列视为等效。
ignore-all-space
比较线条时忽略空格。即使一行有空格而另一行没有空格,这也会忽略差异。
allow-indentation-change
最初忽略移动检测中的任何空格,然后如果每行的空白变化相同,则仅将移动的代码块分组到块中。这与其他模式不兼容。
--no-color-moved-ws
执行移动检测时不要忽略空格。这可用于覆盖配置设置。它与--color-moved-ws=no
相同。
--word-diff[=<mode>]
使用< mode>显示单词 diff。划定改变的单词。默认情况下,单词由空格分隔;见下面的--word-diff-regex
。 默认为 plain ,或者是以下之一:
color
仅使用颜色突出显示更改的单词。意味着--color
。
plain
将单词显示为[-removed-]
和{+added+}
。如果它们出现在输入中,则不会尝试转义分隔符,因此输出可能不明确。
porcelain
使用特殊的基于行的格式用于脚本使用。添加/删除/未更改的运行以通常的统一 diff 格式打印,从行开头的+
/ -
/``字符开始并延伸到行尾。输入中的换行符由其自身行上的波浪号~
表示。
none
再次禁用字差异。
请注意,如果启用了颜色,在所有模式中将使用第一个模式的名称,颜色突出显示已更改的部分。
--word-diff-regex=<regex>
使用决定一个单词是什么,而不是将非空格的运行视为一个单词。除非已经启用,否则还暗示--word-diff
。
的每个非重叠匹配被认为是一个词。这些匹配之间的任何内容都被视为空格并被忽略(!)以查找差异。您可能希望将|[^[:space:]]
附加到正则表达式,以确保它匹配所有非空白字符。包含换行符的匹配项会在换行符处以静默方式截断(!)。
例如,--word-diff-regex=.
会将每个字符视为一个单词,并相应地逐个字符地显示差异。
正则表达式也可以通过 diff 驱动程序或配置选项设置,参见 gitattributes [5] 或 git-config [1] 。明确地覆盖任何差异驱动程序或配置设置。 Diff 驱动程序覆盖配置设置。
--color-words[=<regex>]
相当于--word-diff=color
加(如果指定了正则表达式)--word-diff-regex=
。
--no-renames
关闭重命名检测,即使配置文件提供默认值也是如此。
--check
如果更改引入冲突标记或空白错误,则发出警告。什么被认为是空白错误由core.whitespace
配置控制。默认情况下,尾随空格(包括仅由空格组成的行)和在行的初始缩进内紧跟着制表符的空格字符被视为空格错误。如果发现问题,则退出非零状态。与–exit-code 不兼容。
--ws-error-highlight=<kind>
突出显示差异的context
,old
或new
行中的空白错误。多个值用逗号分隔,none
重置先前的值,default
将列表重置为new
,all
是old,new,context
的简写。如果未指定此选项,并且未设置配置变量diff.wsErrorHighlight
,则仅突出显示new
行中的空白错误。空白错误用color.diff.whitespace
着色。
--full-index
在生成补丁格式输出时,在“索引”行上显示完整的前映像和后映像 blob 对象名称,而不是第一个字符。
--binary
除--full-index
外,还可输出可用git-apply
输出二进制差异,--patch
也可以。
--abbrev[=<n>]
不是在 diff-raw 格式输出和 diff-tree 标题行中显示完整的 40 字节十六进制对象名称,而是仅显示部分前缀。这与上面的--full-index
选项无关,后者控制 diff-patch 输出格式。可以使用--abbrev=
指定非默认位数。
-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
的含义相同。
--find-copies-harder
出于性能原因,默认情况下,仅当在同一变更集中修改了副本的原始文件时,-C
选项才会查找副本。此标志使命令检查未修改的文件作为副本源的候选者。对于大型项目来说,这是一项非常昂贵的操作,因此请谨慎使用。提供多个-C
选项具有相同的效果。
-D
--irreversible-delete
省略删除的原像,即只打印标题而不打印原像和/dev/null
之间的差异。得到的 patch 不适用于patch
或git apply
;这仅适用于那些希望在更改后专注于检视文本的人。此外,输出显然缺乏足够的信息来反向应用这样的补丁,甚至手动,因此选项的名称。
与-B
一起使用时,也省略删除/创建对的删除部分中的原像。
-l<num>
-M
和-C
选项需要 O(n²)处理时间,其中 n 是潜在的重命名/复制目标的数量。如果重命名/复制目标的数量超过指定的数量,此选项可防止重命名/复制检测运行。
--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>
查找补丁文本包含与匹配的添加/删除行的差异。
为了说明-S --pickaxe-regex
和-G
之间的区别,请考虑在同一文件中使用以下 diff 进行提交:
+ 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
不会(因为该字符串的出现次数没有改变)。
除非提供--text
,否则将忽略没有 textconv 过滤器的二进制文件的补丁。
有关详细信息,请参阅 gitdiffcore [7] 中的 pickaxe 条目。
--find-object=<object-id>
查找更改指定对象出现次数的差异。与-S
类似,只是参数的不同之处在于它不搜索特定的字符串,而是搜索特定的对象 id。
该对象可以是 blob 或子模块提交。它意味着git-log
中的-t
选项也可以找到树。
--pickaxe-all
当-S
或-G
找到更改时,显示该更改集中的所有更改,而不仅仅是包含< string>中更改的文件。
--pickaxe-regex
对待< string>赋予-S
作为扩展的 POSIX 正则表达式以匹配。
-O<orderfile>
控制文件在输出中的显示顺序。这会覆盖diff.orderFile
配置变量(参见 git-config [1] )。要取消diff.orderFile
,请使用-O/dev/null
。
输出顺序由< orderfile>中的 glob 模式的顺序决定。首先输出所有与第一个模式匹配的路径名的文件,然后输出所有与第二个模式(但不是第一个模式)匹配的路径名的文件,依此类推。路径名与任何模式都不匹配的所有文件都是最后输出的,就好像文件末尾有一个隐式匹配所有模式一样。如果多个路径名具有相同的等级(它们匹配相同的模式但没有早期模式),则它们相对于彼此的输出顺序是正常顺序。
解析如下:
- 空行被忽略,因此可以将它们用作分隔符以提高可读性。
- 以哈希(“
#
”)开头的行将被忽略,因此它们可用于注释。如果以哈希开头,则将反斜杠(“\
”)添加到模式的开头。 - 每个其他行包含一个模式。
模式与没有 FNM_PATHNAME 标志的 fnmatch(3)使用模式具有相同的语法和语义,除匹配的路径名之外,如果删除任意数量的与模式匹配的最终路径名组件。例如,模式“foo*bar
”匹配“fooasdfbar
”和“foo/bar/baz/asdf
”而不匹配“foobarx
”。
-R
交换两个输入;也就是说,显示从索引或磁盘文件到树内容的差异。
--relative[=<path>]
从项目的子目录运行时,可以告诉它除目录外的更改并使用此选项显示相对于它的路径名。当您不在子目录中时(例如,在裸存储库中),您可以通过给出 作为一个参数来命名哪个子目录以使输出相对。
-a
--text
将所有文件视为文本。
--ignore-cr-at-eol
进行比较时,忽略行尾的回车。
--ignore-space-at-eol
忽略 EOL 中的空白更改。
-b
--ignore-space-change
忽略空格量的变化。这会忽略行尾的空格,并将一个或多个空白字符的所有其他序列视为等效。
-w
--ignore-all-space
比较线条时忽略空格。即使一行有空格而另一行没有空格,这也会忽略差异。
--ignore-blank-lines
忽略其行全部为空的更改。
--inter-hunk-context=<lines>
显示差异之间的上下文,直到指定的行数,从而融合彼此接近的内容。如果未设置配置选项,则默认为diff.interHunkContext
或 0。
-W
--function-context
显示整个周围的变化功能。
--exit-code
使用类似于 diff(1)的代码退出程序。也就是说,如果存在差异则退出 1,0 表示没有差异。
--quiet
禁用程序的所有输出。意味着--exit-code
。
--ext-diff
允许执行外部 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[=<when>]
忽略差异生成中子模块的更改。可以是“none”,“untracked”,“dirty”或“all”,这是默认值。使用“none”时,如果子模块包含未跟踪或修改的文件,或者其 HEAD 与超级项目中记录的提交不同,则可以使用“none”来修改子模块,并可用于覆盖git-config [1] 或 gitmodules [5]中 ignore 选项的任何设置。当使用“untracked”时,如果子模块仅包含未跟踪的内容(但仍会扫描修改的内容),则子模块不会被视为 dirty。使用“dirty”忽略对子模块工作树的所有更改,仅显示存储在超级项目中的提交的更改(这是 1.7.0 之前的行为)。使用“all”隐藏子模块的所有更改。
--src-prefix=<prefix>
显示给定的源前缀而不是“a/”。
--dst-prefix=<prefix>
显示给定的目标前缀而不是“b/”。
--no-prefix
不显示任何源或目标前缀。
--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
将工作树与“基础”版本(阶段#1),“我们的分支”(阶段#2)或“他们的分支”(阶段#3)进行比较。索引仅包含针对未合并条目的这些阶段,即在解决冲突时。有关详细信息,请参阅 git-read-tree [1] 部分“3-Way Merge”。
-0
省略未合并条目的差异输出,只显示“未合并”。仅在将工作树与索引进行比较时才能使用。
<path>…
<路径>参数,当给定时,用于将 diff 限制为命名路径(您可以为其下的所有文件提供目录名称和获取差异)。
原始输出格式
来自“git-diff-index”,“git-diff-tree”,“git-diff-files”和“git diff -raw”的原始输出格式非常相似。
这些命令都比较了两组东西;比较的不同之处是:
git-diff-index <tree-ish>
比较以及文件系统上的文件。
git-diff-index --cached <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
也就是说,从左到右:
- 一个冒号。
- “src”模式;如果创建或未合并,则为 000000。
- 空格。
- “dst”模式;如果删除或未合并,则为 000000。
- 空格。
- sha1 为“src”; 如果创建或未合并,则显示 0{40}。
- 空格。
- sha1 为“dst”; 如果创建,未合并或“查看工作树”,则显示 0{40}。
- 空格。
- 状态,后跟可选的“数字”编号。
- 使用
-z
选项时的选项卡或 NUL。 - “src”的路径
- 使用
-z
选项时的选项卡或 NUL;仅适用于 C 或 R. - “dst”的路径;仅适用于 C 或 R.
- 使用
-z
选项时,LF 或 NUL 终止记录。
可能的状态字母是:
- A:添加文件
- C:将文件复制到新文件中
- D:删除文件
- M:修改文件的内容或模式
- R:重命名文件
- T:更改文件类型
- U:文件已取消合并(您必须先完成合并才能提交)
- X:“未知”更改类型(最有可能是错误,请报告)
状态字母 C 和 R 后面总是跟一个分数(表示移动或复制的源和目标之间的相似性百分比)。状态字母 M 之后可以是文件重写的分数(表示不相似的百分比)。
如果文件系统上的文件是新文件并且它与索引不同步,则显示为全 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 输出。输出与上述格式的不同之处如下:
- 每个父母都有一个冒号
- 还有更多“src”模式和“src”sha1
- status 是每个父级的连接状态字符
- 没有可选的“分数”数字
- 单路径,仅适用于“dst”
例:
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.
请注意,_ 组合 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
_ 不是用来 _ 代替a/
或b/
的文件名。
当涉及重命名/复制时,file1
和file2
分别显示重命名/复制的源文件的名称和重命名/复制的文件的名称。 - 它后跟一个或多个扩展标题行:
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%的相异性意味着旧文件中的任何行都不会成为新文件。
索引行包括更改前后的 SHA-1 校验和。如果文件模式没有改变,则包括在内;否则,单独的行表示旧模式和新模式。 - 具有“异常”字符的路径名被引用,如配置变量
core.quotePath
所述(参见 git-config [1] )。 - 输出中的所有
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
Git 中文参考(二)(5)https://developer.aliyun.com/article/1565797