返回顶部
本页目录

diff

比较文件在暂存区和工作区的差异.显示已写入暂存区和已经被修改但尚未写入暂存区文件的区别

实例

显示暂存区和工作区的差异

                            
  • git diff

显示暂存区和上一个commit的差异

                            
  • git diff --cached [file]

查看已缓存的与未缓存的所有改动

                            
  • git diff HEAD

显示摘要而非整个 diff

                            
  • git diff --stat

显示两次提交之间的差异

                            
  • git diff [first-branch]...[second-branch]

显示今天你写了多少行代码

                            
  • git diff --shortstat "@{0 day ago}"

选项

-p,-u,--patch

生成补丁。这是默认的。

-s,--no-patch

抑制差异输出。对于像 git show 这样的命令很有用,这些命令默认情况下显示补丁,或取消 --patch 的效果。

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

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

--output=<file>

输出到一个特定的文件,而不是stdout。

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

指定用于在生成的修补程序中指示新行,旧行或上下文行的字符。通常它们分别是 + , - 和’'。

--raw

生成原始格式的差异。

--patch-with-raw

-p --raw 的同义词。

--indent-heuristic

启用启发式,移动 diff hunk的边界,使补丁更容易阅读。这是默认的。

--no-indent-heuristic

禁用缩进启发式。

--minimal

花额外的时间来确保产生最小的差异。

--patience

使用 "耐心差异 "算法生成差异。

--histogram

使用 "直方图差异 "算法生成差异。

--anchored=<text>

使用 "锚定差异 "算法生成一个差异。

如果一行在源文件和目的文件中都存在,只存在一次,并且以这个文本开始,这个算法就会试图防止它在输出中出现删除或添加。它内部使用了 "耐心差异 "算法。

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

选择一种差异算法。变体如下:

  • default, myers
    基本的greedy diff算法。目前,这是默认的。
  • minimal
    花额外的时间来确保产生最小的差异。
  • patience
    生成补丁时使用 "耐心差异 "算法。
  • histogram
    该算法将耐心算法扩展为 “支持低发生率的共同元素”。

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

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

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

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

--compact-summary

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

--numstat

--stat 相似,但是以十进制表示法和路径名显示添加和删除的行数,不带缩写,以使其对计算机更友好。对于二进制文件,输出两个 - 而不是说 0 0

--shortstat

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

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

输出每个子目录的相对变化量的分布。可以通过将 --dirstat 的行为传递给逗号分隔的参数列表来进行自定义。默认值由 diff.dirstat 配置变量控制。可以使用以下参数:

  • changes
    通过计算从源文件中删除或添加到目标文件中的行数来计算dirstat的数量。这忽略了文件中纯代码的移动量。换句话说,重新安排文件中的行数不会像其他变化那样被计算。这是没有参数时的默认行为。
  • lines
    通过执行常规的基于行的差异分析,并计算已删除/添加的行数,计算目录统计号。(对于二进制文件,请改为计算64字节的块,因为二进制文件没有自然的行概念)。与 changes 行为相比,这是更昂贵的 --dirstat 行为,但是它确实将文件中重新排列的行数与其他更改一样多。结果输出与您从其他 --*stat 选项获得的输出一致。
  • files
    通过计算更改的文件数来计算目录统计数。每个更改的文件在dirstat分析中均相等计数。这是在计算上最便宜的 --dirstat 行为,因为它根本不必查看文件内容。
  • cumulative
    同样在父目录的子目录中计算更改。请注意,使用 cumulative ,报告的百分比之和可能超过100%。可以使用 noncumulative 参数指定默认(非累积)行为。
  • <limit>
    一个整数参数指定一个截止百分比(默认为3%)。贡献小于这个百分比的目录不会显示在输出中。

示例:以下内容将对更改的文件进行计数,同时忽略目录少于更改的文件总量的10%,并在父目录中累积子目录计数:--dirstat=files,10,cumulative

--cumulative

同义词 --dirstat=cumulative

--summary

输出扩展头信息的精简摘要,如创建、重命名和模式变化。

--patch-with-stat

-p --stat 的同义词。

-z

如果没有此选项,则引用带有“不寻常”字符的路径名,如配置变量 core.quotePath 所述

  • --name-only

仅显示更改文件的名称。文件名通常以 UTF-8 编码。

  • --name-status

仅显示更改文件的名称和状态。有关状态字母的含义。

--submodule[=<format>]

指定如何显示子模块中的差异

--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 将用于在diff中其他位置添加的删除行。此模式可以拾取任何已移动的行,但是在查看是否确定代码块是否被正确排列的情况下,它并不是很有用。
  • blocks
    贪婪地检测到至少包含20个字母数字字符的移动文本块。使用 color.diff.{old,new}Moved 颜色绘制检测到的块。不能将相邻的块区分开。
  • zebra
    与在 blocks 模式下一样,检测到已移动文本的块。使用 color.diff.{old,new}Moved colorcolor.diff.{old,new}MovedAlternative 。两种颜色之间的变化表示检测到新的块。
  • dimmed-zebra
    与 zebra 相似,但对移动的代码中不感兴趣的部分执行了其他调光。两个相邻块的边界线被认为很有趣,其余的都没有意思。 dimmed_zebra 是已弃用的同义词。
-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

出于性能原因,默认情况下, -C 选项仅在副本的原始文件在同一变更集中被修改时才查找副本。该标志使命令检查未修改的文件作为副本源的候选对象。对于大型项目,这是非常昂贵的操作,因此请谨慎使用。提供多个 -C 选项具有相同的效果。

-D,--irreversible-delete

忽略要删除的原映像,即仅输出标头,而不输出原映像和 /dev/null 之间的差异。

与 -B 一起使用时,还删除删除/创建对的删除部分中的原映像。

-l<num>

在 -M 和 -C 选项涉及能够检测的重命名/份廉价地子集一些初步步骤,随后是所有剩余的未配对的目的地进行比较,以所有相关来源的穷尽备用部分。(对于重命名,只有剩余的未配对源是相关的;对于副本,所有原始源都是相关的。)对于 N 个源和目的地,这个详尽的检查是 O(N^2)。如果所涉及的源/目标文件数量超过指定数量,则此选项可防止重命名/复制检测的详尽部分运行。默认为 diff.renameLimit。请注意,值 0 被视为无限制。

-a,--text

将所有文件视为文本。

--ignore-cr-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(如果未设置config选项)。

-W,--function-context

将整个功能显示为每次更改的上下文行

<path>…​

如果指定了参数,则用于将diff限制为命名路径(您可以指定目录名称,并获取其下所有文件的diff)。