git diff查看文件在工作树和历史提交中的修改 (六)

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重置以前的值,默认将列表重置为newalloldnewcontext的组合。如果没有给出此选项,并且没有配置变量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手册。

2 导航页

git命令详细使用方式讲解及记录

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值