git diff查看文件在工作树和历史提交中的修改
1 git diff 概要
git diff [<options>] [<commit>] [--] [<path>...]
git diff [<options>] --cached [<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>...]
此格式用于查看相对于索引(下一次提交的暂存区域)所做的更改。意思就是,查看未暂存区与暂存区或者树的更改。这些diff可以通过git add
来添加到索引暂存区中。git diff [<options>] --no-index [--] <path> <path>
比较文件系统给定的两条路径。使用--no-index
来表示不要与索引树进行比较,而是两个路径进行比较。git diff [<options>] --cached [<commit>] [--] [<path>...]
将索引暂存区的更改与<commit>
进行比较,如果没有指定<commit>
则默认是HEAD
。git diff [<options>] <commit> [--] [<path>...]
将当前工作树与指定<commit>
比较,也可以使用HEAD^
这种语法与较近提交比较,也可以指定branch
与指定分支比较。git diff [<options>] <commit> <commit> [--] [<path>...]
比较任意两笔<commit>
之间的差异。git diff [<options>] <commit>..<commit> [--] [<path>...]
与上一个命令功能一样,只是省略..
前或者后的<commit>
时,默认为HEAD
。git diff [<options>] <commit>...<commit> [--] [<path>...]
比较从第一个<commit>
到第二个<commit>
之间的所有更改,比较是从两者的共同祖先提交开始的,省略任意一个<commit>
都会默认指向为HEAD
。
注意:除了<commit>
..<commit>
格式的git diff
,其余的<commit>
可以是任意树分支。
选项:
-
[-p, -u, --patch]
以补丁形式显示,这是默认值。 -
[-s, --no-patch]
抑制diff
的补丁形式输出,对于git show
很有效,可以不展示具体修改而是只显示默认补丁信息,显示添加--patch
会覆盖-s
的效果。 -
[-U<n>, --unified=<n>]
默认比较只显示差异的前后三行,使用此命令可以指定显示差异的前后行数,对应着选项-p
。 -
[--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
算法生成一个差异。 -
[--diff-algorithm={patience|minimal|histogram|myers}]
指定一个差异算法,myers
是默认的,具体算法差异可通过man手册来查看。 -
[--stat[=<width>[,<name-width>[,<count>]]]]
以一个图形表格的形式展示差异,统计哪些文件被改变,改变了多少。还可选的添加一些其他信息来指定格式,具体使用可看man
手册。 -
[--compact-summary]
输出拓展头信息的压缩摘要,详情请看man
手册。 -
[--numstat]
类似于--stat
,但是显示了添加和删除的行数,以十进制计数和没有缩写的路径名,使其对机器可读更友好,方便编写脚本等。 -
[--shortstat]
只输出--stat
的最后一行,只包含修改的文件总数,以及添加和删除的行数。 -
[-X[<param1,param2,...>], --dirstat[=<param1,param2,...>]]
输出每个子目录更改的相对数量分布,可以通过向它传递一个用逗号分隔的参数列表。默认值可以由diff.dirstat来配置。可选参数如下:changes
计算从源删除或者添加到目标的行数,这将忽略文件中的纯代码移动量,意思就是,重新排列文件中的行不会被计算在内,这是默认的行为。lines
通过基于常规行差分析计算dirstat
数字,并将删除添加行数相加。files
通过计算更改文件的数量来计算dirstat
数量,这个不需要具体查看问价内容,因为只比较被更改的文件数量。cumulative
同时计算父目录的子目录中的更改。注意,报告的百分比总和可能超过百分之百。<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
时,使用NULs作为输出字段的终止符。 -
[--name-only]
仅显示改变的文件。 -
[--name-status]
仅显示改变的文件,不过会添加过滤字符,如M
表示被修改等。 -
[--submodule[=<format>]]
显示子模块的差异,详细使用方式参看man
手册。 -
[--color[=<when>]]
用于改变ui显示,默认值即可,详细使用可参看man
手册。 -
[--no-color]
类似于--color=never
。 -
[--color-moved[=<mode>]]
移动的代码行不同颜色显示模式,详情参看man
手册。 -
[--no-color-moved]
类似于--color-moved=no
-
[--color-moved-ws=<modes>]
配置了在执行--color-moved的移动检测时如何忽略空格
,具体使用参看man
手册。 -
[--no-color-moved-ws]
类似于--color-moved-ws=no
。 -
[--word-diff[=<mode>]]
以不同方式显示差异的展示方式,可通过颜色区分,文本区分等,详情使用man
手册查看。 -
[--word-diff-regex=<regex>]
决定表达式的单词以什么形式展示,详情使用<man>
手册查看。 -
[--color-words[=<regex>]]
等于--word-diff=color
。 -
[--no-renames]
关闭重命名检测,即使配置文件提供了默认的重命名检测。 -
[--[no-]rename-empty]
是否使用空的blob作为重命名源。 -
[--check]
检测空白错误,引入冲突标记等,一般提交前可进行此选项检测,避免一些空白字符的加入,可通过core.whitespace
配置变量设置默认行为。 -
[--ws-error-highlight=<kind>]
在显示的差异中突出上下文中的空白错误,或者diff
的旧行或新行。多个值可用逗号分隔,none
重置以前的值,默认将列表重置为new
,all
是old
,new
,context
的组合。如果没有给出此选项,并且没有配置变量diff.wsErrorHighlight
,那么只有新行中的空白错误才会被突显出来。 -
[--full-index]
显示对比patch中索引值的完整哈希值。 -
[--binary]
除了--full-index
之外,还输出一个可以通过git apply
应用的补丁。在--patch
下生效。 -
[--abbrev[=<n>]]
在使用--raw
时,通过此选项设置显示的哈希值的位数。 -
[-B[<n>][/<m>], --break-rewrites[=[<n>][/<m>]]]
用于将完整的重写更改分解为成对的删除和创建,即判断文件修改多少时会认为是重写而不是修改,具体含义和使用参看man
手册。 -
[-M[<n>], --find-renames[=<n>]]
检测重命名,如果指定了n,他是一个阈值,比如-M90%
意味着如果超过90%的文件没有更改,git应该将删除添加对视为重命名。如果没有%符号,这个被认为是一个分数,也就是-M5
变成了0.5,因此等于-M50%
。类似的,-M05
和-M5
是一样的。默认值是50% -
[-C[<n>], --find-copies[=<n>]]
检测副本和重命名,参看--find-copies-harder
选项,如果n被设置,那就意味着-M<n>
。 -
[--find-copies-harder]
出于性能原因,默认情况下,-C
选项只在副本的原始文件在同一更改集中被修改时才会找到副本。这个标志使命令检查未修改的文件作为复制源的候选文件。对于大型项目来说,这是一个非常昂贵的操作,所以要谨慎使用。提供多个-C
选项具有相同的效果。 -
[-D, --irreversible-delete]
当有索引文件移出管理树时,此选项将会省略展示文件内容,只打印头信息,注意这样操作的patch不足以满足应用补丁。 -
[-l<num>]
-M
和-C
选项需要O(n^2)的处理时间,其中n可能是重命名和复制目标的数量,如果重命名和复制数量超出指定num,则此选项将阻止重命名和复制检测运行。 -
[--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]]
只比对指定类型的修改,添加A
,复制C
,删除D
,修改M
,重命名R
,被改变T
,未合并U
,未知X
,被打破B
。 -
[-S<string>]
寻找改变指定字符串在文件中出现次数的差异(例如添加删除)。 -
[-G<regex>]
以正则表达式的方式匹配差异字符串。 -
[--find-object=<object-id>]
寻找改变指定对象出现次数的差异,与-S
类似,参数的不同之处在于它不搜索特定的字符串,而是搜索特定的对象id,对象可以是blob,子模块提交。 -
[--pickaxe-all]
当使用-S
或-G
找到一个更改时,显示该更改集中所有的更改,而不是仅仅是<string>
中包含更改的文件。 -
[--pickaxe-regex]
将-S
拓展为正则表达式。 -
[-O<orderfile>]
控制文件在输出中出现的顺序,具体可参考man
手册。 -
[-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块之间的上下文,直到指定的行数,从而融合彼此接近的块。如果没有设置配置选项,默认值为diff.interHunkContext或0。 -
[-W, --function-context]
展示完整改变上下文。 -
[--exit-code]
使用退出码。 -
[--quiet]
关闭所有输出。 -
[--ext-diff]
使用一个外部拓展diff帮助工具。 -
[--no-ext-diff]
不使用。 -
[--textconv, --no-textconv]
在比较二进制文件时,允许(或不允许)运行外部文本转换过滤器。 -
[--ignore-submodules[=<when>]]
忽略对子模块的更改,详情参看man
手册。 -
[--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
来恢复。这两种选择都是实验性的,将来可能会被取消。 -
[-1 --base, -2 --ours, -3 --theirs]
与"base",“our branch”, "their branch"进行比较。 -
[-0]
忽略未合并条目的diff输出,只显示“unmerged”。只能在工作树与索引比较时使用。 -
[<patch>...]
比较指定路径或者文件。
git diff
还有一些底层接口打印如git-diff-index
详情请看man
手册。