git-log

原文: https://git-scm.com/docs/git-log

名称

git-log - 显示提交日志

概要

  1. git log [<options>] [<revision range>] [[--] <path>…​]

描述

显示提交日志。

该命令采用适用于git rev-list命令的选项来控制显示的内容和方式,以及适用于git diff-*命令的选项,以控制每个提交引入的更改的显示方式。

OPTIONS

  1. --follow

继续列出重命名以外的文件历史记录(仅适用于单个文件)。

  1. --no-decorate
  1. --decorate[=short|full|auto|no]

打印出所有提交的引用名称。如果指定,则引用名称前缀 refs / heads /refs / tags /refs / remotes / 将不会打印。如果指定了 full ,将打印完整的引用名称(包括前缀)。如果指定了 auto ,那么如果输出到达终端,则ref名称显示为 short ,否则不显示ref名称。默认选项为

  1. --decorate-refs=<pattern>
  1. --decorate-refs-exclude=<pattern>

如果没有给出--decorate-refs,假装好像所有参考都被包括在内。对于每个候选人,如果它与--decorate-refs-exclude给出的任何模式匹配或者与--decorate-refs给出的任何模式都不匹配,请不要将其用于装饰。

  1. --source

打印出在每个提交到达的命令行上给出的引用名称。

  1. --use-mailmap

使用mailmap文件将作者和提交者名称以及电子邮件地址映射到规范的真实姓名和电子邮件地址。见 git-shortlog [1]

  1. --full-diff

如果没有此标志,git log -p &lt;path&gt;...将显示触摸指定路径的提交,并显示相同指定路径的差异。这样,就会显示完全差异,以便接触指定的路径。这意味着“< path> …”仅限制提交,并不限制这些提交的差异。

请注意,这会影响所有基于差异的输出类型,例如:那些由--stat等产生的

  1. --log-size

在每次提交的输出中包含“日志大小< number>”行,其中< number>是以字节为单位的提交消息的长度。旨在通过允许它们提前分配空间来加速从git log输出读取日志消息的工具。

  1. -L <start>,<end>:<file>
  1. -L :<funcname>:<file>

跟踪“< start>,< end>”给出的行范围的演变(或< file>)中的(或函数名称regex< funcname>)。你可能不会给任何pathpec限制器。目前这仅限于从单个修订开始的步行,即,您可能只提供零个或一个正修订参数。您可以多次指定此选项。

<开始>和< end>可以采取以下形式之一:

  • 如果< start>或者< end>是一个数字,它指定一个绝对行号(行数从1开始)。

  • /正则表达式/

    此表单将使用与给定POSIX正则表达式匹配的第一行。如果< start>是一个正则表达式,它将从前一个-L范围的末尾搜索,如果有的话,否则从文件的开头搜索。如果< start>是“^ / regex /”,它将从文件的开头搜索。如果< end>是一个正则表达式,它将从< start>给出的行开始搜索。

    • offset或-offset

    这仅适用于< end>并将在< start>给出的行之前或之后指定行数。

如果给出“:< funcname>”代替< start>和< end>,它是一个正则表达式,表示从匹配< funcname>的第一个funcname行到下一个funcname行的范围。 “:< funcname>”从上一个-L范围的末尾搜索(如果有的话),否则从文件的开头搜索。 “^:< funcname>”从文件的开头搜索。

  1. <revision range>

仅显示指定修订范围内的提交。当没有<修订范围>如果指定,则默认为HEAD(即导致当前提交的整个历史记录)。 origin..HEAD指定从当前提交可以访问的所有提交(即HEAD),但不是origin。有关拼写< revision range>的完整列表,请参阅 gitrevisions [7]指定范围部分。

  1. [--] <path>…​

仅显示足以解释与指定路径匹配的文件的提交。有关详细信息和其他简化模式,请参见下面的历史简化

当出现混淆时,路径可能需要以--作为前缀,以将它们与选项或修订范围分开。

提交限制

除了使用说明书中解释的特殊符号指定应列出的提交范围之外,还可以应用其他提交限制。

除非另有说明,否则使用更多选项通常会进一步限制输出(例如,--since=&lt;date1&gt;限制提交比&lt;date1&gt;更新,并将其与--grep=&lt;pattern&gt;一起使用进一步限制其日志消息具有与&lt;pattern&gt;匹配的行的提交)。

请注意,这些是在提交排序和格式化选项之前应用的,例如--reverse

  1. -<number>
  1. -n <number>
  1. --max-count=<number>

限制要输出的提交数量。

  1. --skip=<number>

在开始显示提交输出之前,跳过编号提交。

  1. --since=<date>
  1. --after=<date>

显示比特定日期更新的提交。

  1. --until=<date>
  1. --before=<date>

显示超过特定日期的提交。

  1. --author=<pattern>
  1. --committer=<pattern>

将提交输出限制为具有与指定模式(正则表达式)匹配的作者/提交者标题行的输出。对于多个--author=&lt;pattern&gt;,选择作者与任何给定模式匹配的提交(类似于多个--committer=&lt;pattern&gt;)。

  1. --grep-reflog=<pattern>

将提交输出限制为具有与指定模式(正则表达式)匹配的reflog条目的输出。如果有多个--grep-reflog,则选择其reflog消息与任何给定模式匹配的提交。除非正在使用--walk-reflogs,否则使用此选项是错误的。

  1. --grep=<pattern>

将提交输出限制为具有与指定模式(正则表达式)匹配的日志消息的输出。如果有多个--grep=&lt;pattern&gt;,则会选择其消息与任何给定模式匹配的提交(但请参见--all-match)。

--show-notes生效时,来自注释的消息将被匹配,就像它是日志消息的一部分一样。

  1. --all-match

将提交输出限制为匹配所有给定--grep的输出,而不是匹配至少一个的输出。

  1. --invert-grep

将提交输出限制为具有与--grep=&lt;pattern&gt;指定的模式不匹配的日志消息的输出。

  1. -i
  1. --regexp-ignore-case

匹配正则表达式限制模式而不考虑字母大小写。

  1. --basic-regexp

将限制模式视为基本正则表达式;这是默认值。

  1. -E
  1. --extended-regexp

考虑限制模式是扩展正则表达式而不是默认的基本正则表达式。

  1. -F
  1. --fixed-strings

将限制模式视为固定字符串(不要将模式解释为正则表达式)。

  1. -P
  1. --perl-regexp

将限制模式视为与Perl兼容的正则表达式。

对这些类型的正则表达式的支持是可选的编译时依赖性。如果Git没有编译并支持它们,那么提供此选项将导致它死亡。

  1. --remove-empty

当给定路径从树中消失时停止。

  1. --merges

仅打印合并提交。这与--min-parents=2完全相同。

  1. --no-merges

不要打印具有多个父级的提交。这与--max-parents=1完全相同。

  1. --min-parents=<number>
  1. --max-parents=<number>
  1. --no-min-parents
  1. --no-max-parents

仅显示至少(或最多)许多父提交的提交。特别是,--max-parents=1--no-merges相同,--min-parents=2--merges相同。 --max-parents=0给出所有root提交和--min-parents=3所有章鱼合并。

--no-min-parents--no-max-parents再次重置这些限制(无限制)。等效形式是--min-parents=0(任何提交具有0或更多父母)和--max-parents=-1(负数表示无上限)。

  1. --first-parent

在看到合并提交时,仅遵循第一个父提交。在查看特定主题分支的演变时,此选项可以提供更好的概述,因为合并到主题分支往往只是关于不时调整到更新的上游,并且此选项允许您忽略引入的单个提交通过这样的合并你的历史。不能与—bisect结合使用。

  1. --not

反转所有后续修订说明符的 ^ 前缀(或缺少)的含义,直到下一个--not

  1. --all

假设refs/中的所有引用与HEAD一起在命令行中列为< commit>

  1. --branches[=<pattern>]

假设refs/heads中的所有引用都在命令行中列为< commit> 。如果< pattern> 给出,将分支限制为匹配给定shell glob的分支。如果模式缺乏?最后暗示*[/ *

  1. --tags[=<pattern>]

假设refs/tags中的所有引用都在命令行中列为< commit> 。如果< pattern>给出了,将标签限制为与给定shell glob匹配的标签。如果模式缺乏?最后暗示*[/ *

  1. --remotes[=<pattern>]

假设refs/remotes中的所有引用都在命令行中列为< commit> 。如果< pattern>给出了,将远程跟踪分支限制为与给定shell glob匹配的分支。如果模式缺乏?最后暗示*[/ *

  1. --glob=<glob-pattern>

假设所有的refs匹配shell glob < glob-pattern> 在命令行中列为< commit> 。领先的 refs / 会在缺失时自动添加。如果模式缺乏?最后暗示*[/ *

  1. --exclude=<glob-pattern>

不包括引用匹配< glob-pattern> 否则会考虑下一个--all--branches--tags--remotes--glob。重复此选项会累积排除模式,直至下一个--all--branches--tags--remotes--glob选项(其他选项或参数不会清除累积模式)。

当应用于--branches--tags--remotes时,给出的模式不应以refs/headsrefs/tagsrefs/remotes开始,并且当应用于--glob时,它们必须以refs/开头]或--all。如果打算使用尾随 / * ,则必须明确给出。

  1. --reflog

假设reflog所提到的所有对象都在命令行中列为&lt;commit&gt;

  1. --single-worktree

默认情况下,当有多个工作树时,将通过以下选项检查所有工作树(参见 git-worktree [1] ):--all--reflog--indexed-objects。此选项强制它们仅检查当前工作树。

  1. --ignore-missing

在输入中看到无效的对象名称时,假装没有给出错误的输入。

  1. --bisect

假设好像已经列出了错误的二分法refs/bisect/bad并且好像它后面跟着--not并且良好的二分法在命令行上引用了refs/bisect/good-*。不能与—first-parent结合使用。

  1. --stdin

除了< commit>在命令行中列出,从标准输入中读取它们。如果看到--分隔符,请停止读取提交并开始读取路径以限制结果。

  1. --cherry-mark

--cherry-pick(见下文)相同,但标记等效提交与=而不是省略它们,而与+不等价。

  1. --cherry-pick

当提交集受限于对称差异时,省略任何引用与“另一方”上的另一个提交相同的更改的提交。

例如,如果您有两个分支,AB,通常只在一侧列出所有提交的方法是使用--left-right(请参阅下面--left-right选项说明中的示例) 。但是,它显示了从另一个分支中挑选出来的提交(例如,“b上的第3个”可以从分支A中挑选出来)。使用此选项,将从输出中排除此类提交对。

  1. --left-only
  1. --right-only

列表仅在对称差异的相应侧提交,即仅在那些将被标记为&lt;的那些。 &gt; --left-right

例如,--cherry-pick --right-only A...B省略了来自B的提交,这些提交位于A中,或者补丁等效于A中的提交。换句话说,这列出了git cherry A B+提交。更确切地说,--cherry-pick --right-only --no-merges给出了确切的列表。

  1. --cherry

--right-only --cherry-mark --no-merges的同义词;有用的是将输出限制在我们这一侧的提交中,并用git log --cherry upstream...mybranch标记已应用于分叉历史记录另一侧的输出,类似于git cherry upstream mybranch

  1. -g
  1. --walk-reflogs

而不是走提交祖先链,将reflog条目从最新的条目转到较旧的条目。使用此选项时,您无法指定要排除的提交(即 ^ commitcommit1..commit2commit1 … commit2 表示法不能用过的)。

使用oneline以外的--pretty格式(出于显而易见的原因),这会导致输出从reflog中获取两行额外的信息。输出中的reflog指示符可能显示为ref@{Nth}(其中Nth是reflog中的反向时间顺序索引)或ref@{timestamp}(带有该条目的时间戳),具体取决于以下几条规则:

  1. 如果起始点指定为ref@{Nth},则显示索引格式。

  2. 如果起始点指定为ref@{now},则显示时间戳格式。

  3. 如果两者均未使用,但在命令行中给出了--date,则以--date请求的格式显示时间戳。

  4. 否则,显示索引格式。

--pretty=oneline下,提交消息在同一行上以此信息为前缀。此选项不能与--reverse组合使用。另见 git-reflog [1]

  1. --merge

合并失败后,show refs触摸有冲突的文件,并且在所有头上都不存在要合并的文件。

  1. --boundary

输出排除边界提交。边界提交以-为前缀。

历史简化

有时您只对历史记录的某些部分感兴趣,例如修改特定< path>的提交。但历史简化有两个部分,一部分是选择提交,另一部分是如何做,因为有各种策略来简化历史。

以下选项选择要显示的提交:

  1. <paths>

提交修改给定的<路径>被选中。

  1. --simplify-by-decoration

选择某些分支或标记引用的提交。

请注意,可以显示额外的提交以提供有意义的历史记录。

以下选项会影响简化的执行方式:

  1. Default mode

将历史简化为最简单的历史,解释树的最终状态。最简单的,因为如果最终结果相同(即合并具有相同内容的分支),它会修剪一些侧分支

  1. --full-history

与默认模式相同,但不修剪某些历史记录。

  1. --dense

仅显示选定的提交,并显示一些具有有意义的历史记录。

  1. --sparse

显示简化历史记录中的所有提交。

  1. --simplify-merges

--full-history的附加选项,用于从生成的历史记录中删除一些不必要的合并,因为没有选定的提交有助于此合并。

  1. --ancestry-path

当给出一系列要显示的提交时(例如 commit1..commit2commit2 ^ commit1 ),只显示直接存在于 commit1 之间的祖先链上的提交]和 commit2 ,即提交既是 commit1 的后代,又是 commit2 的祖先。

下面是更详细的解释。

假设您将foo指定为< paths>。我们将调用修改foo!TREESAME的提交,以及其余的TREESAME。 (在foo的差异滤波中,它们分别看起来不同且相等。)

在下文中,我们将始终参考相同的示例历史记录来说明简化设置之间的差异。我们假设您正在过滤此提交图中的文件foo

  1. .-A---M---N---O---P---Q
  2. / / / / / /
  3. I B C D E Y
  4. \ / / / / /
  5. `-------------' X

历史A —- Q的水平线被视为每次合并的第一个父级。提交是:

  • I是初始提交,其中foo存在内容“asdf”,文件quux存在,内容为“quux”。初始提交与空树进行比较,因此I是!TREESAME。

  • A中,foo仅包含“foo”。

  • B包含与A相同的更改。它的合并M是微不足道的,因此对所有父母都是TREESAME。

  • C不会更改foo,但是它的合并N会将其更改为“foobar”,因此它不是任何父级的TREESAME。

  • Dfoo设置为“baz”。它的合并OND的字符串组合成“foobarbaz”;即,它不是任何父母的TREESAME。

  • Equux更改为“xyzzy”,其合并P将字符串组合为“quux xyzzy”。 P是TREESAME到O,但不是E

  • X是一个独立的根提交,它添加了一个新文件sideY修改了它。 Y是TREESAME到X。它的合并Qside添加到PQ将TREESAME添加到P,但不添加到Y

rev-list根据是否使用--full-history和/或父改写(通过--parents--children)来回溯历史记录,包括或排除提交。可以使用以下设置。

  1. Default mode

如果对任何父母不是TREESAME,则包含提交(尽管可以更改,请参阅下面的--sparse)。如果提交是合并,并且它是一个父级的TREESAME,则只关注该父级。 (即使有几个TREESAME父母,也只能跟随他们中的一个。)否则,请跟随所有父母。

这导致:

  1. .-A---N---O
  2. / / /
  3. I---------D

请注意,仅遵循TREESAME父级的规则(如果有的话)将完全从考虑中删除BC被认为是通过N,但是是TREESAME。 Root提交与空树进行比较,因此I是!TREESAME。

父/子关系仅在--parents中可见,但这不会影响在默认模式下选择的提交,因此我们显示了父行。

  1. --full-history without parent rewriting

此模式与默认值在一点上不同:始终跟随合并的所有父项,即使它是其中一个的TREESAME。即使合并的多个方面包含了包含的提交,这并不意味着合并本身就是!在这个例子中,我们得到了

  1. I A B N D O P Q

M被排除在外,因为对父母双方都是TREESAME。 ECB都走了,但只有B是!TREESAME,所以没有出现。

请注意,如果没有父改写,就不可能谈论提交之间的父/子关系,因此我们将它们显示为断开连接。

  1. --full-history with parent rewriting

只有普通提交才包括在内!TREESAME(虽然可以更改,但请参见下面的--sparse)。

合并始终包括在内。但是,它们的父列表会被重写:沿着每个父项删除不包含在其中的提交。这导致了

  1. .-A---M---N---O---P---Q
  2. / / / / /
  3. I B / D /
  4. \ / / / /
  5. `-------------'

--full-history比较而不重写上述内容。请注意,E被删除,因为它是TREESAME,但是P的父列表被重写为包含E的父ICNXYQ也发生了同样的情况。

除上述设置外,您还可以更改TREESAME是否影响包含:

  1. --dense

如果他们不是任何父母的TREESAME,则包括走路的提交。

  1. --sparse

包括所有步行的提交。

请注意,如果没有--full-history,这仍然可以简化合并:如果其中一个父项是TREESAME,我们只遵循那个,所以合并的其他方面永远不会走。

  1. --simplify-merges

首先,以与父改写的--full-history相同的方式构建历史图(参见上文)。

然后根据以下规则将每个提交C简化为最终历史记录中的替换C'

  • C'设置为C

  • C'的每个父P替换为其简化P'。在这个过程中,删除作为其他父母或祖先的祖先的父母将TREESAME提交到空树,并删除重复项,但要注意永远不要删除我们所有父母的TREESAME。

  • 如果在此父级重写之后,C'是根或合并提交(具有零或> 1父级),边界提交或!TREESAME,它仍然存在。否则,它将替换为其唯一的父级。

通过与--full-history与父重写进行比较,可以最好地显示出这种效果。这个例子变成了:

  1. .-A---M---N---O
  2. / / /
  3. I B D
  4. \ / /
  5. `---------'

注意NPQ--full-history的主要差异:

  • N的父列表删除了I,因为它是另一个父M的祖先。仍然,N仍然是因为它是!TREESAME。

  • P的父列表同样删除了IP然后被完全删除,因为它有一个父母并且是TREESAME。

  • Q的父列表将Y简化为X。然后删除X,因为它是TREESAME根。 Q然后被完全删除,因为它有一个父母并且是TREESAME。

最后,还有第五种简化模式:

  1. --ancestry-path

将显示的提交限制为直接在给定提交范围中的“from”和“to”提交之间的祖先链上的提交。即只显示“to”提交的祖先和“from”提交的后代的提交。

作为示例用例,请考虑以下提交历史记录:

  1. D---E-------F
  2. / \ \
  3. B---C---G---H---I---J
  4. / \
  5. A-------K---------------L--M

常规 D..M 计算作为M的祖先的提交集,但不包括作为D的祖先的提交。这对于从D以来导致M的历史发生了什么是有用的,因为“D中没有M具有什么M”。这个例子中的结果将是所有提交,除了AB(当然还有D本身)。

当我们想知道M中的提交被D引入的bug污染并需要修复时,我们可能只想查看实际上 D..M 的子集D的后代,即排除CK。这正是--ancestry-path选项的作用。应用于 D..M 范围,它会导致:

  1. E-------F
  2. \ \
  3. G---H---I---J
  4. \
  5. L--M

--simplify-by-decoration选项允许您通过省略未由标记引用的提交来仅查看历史拓扑的大图。如果(1)它们被标记引用,或(2)它们改变命令行上给出的路径的内容,则提交被标记为!TREESAME(换句话说,保持在上述历史简化规则之后)。所有其他提交都标记为TREESAME(可以简化)。

提交订购

默认情况下,提交以反向时间顺序显示。

  1. --date-order

在显示所有子项之前不显示父项,但在提交时间戳顺序中显示提交。

  1. --author-date-order

在显示所有子项之前不显示父项,但在作者时间戳顺序中显示提交。

  1. --topo-order

在显示所有子项之前不显示父项,并避免在多行历史记录中显示混合的提交。

例如,在这样的提交历史中:

  1. ---1----2----4----7
  2. \ \
  3. 3----5----6----8---

其中数字表示提交时间戳的顺序,git rev-list--date-order的朋友按时间戳顺序显示提交:8 7 6 5 4 3 2 1。

使用--topo-order,他们将显示8 6 5 3 7 4 2 1(或8 7 4 2 6 5 3 1);为了避免将两个并行开发轨道的提交混合在一起,显示一些较旧的提交在较新的提交之前。

  1. --reverse

输出要以相反顺序显示的提交(请参阅上面的“提交限制”部分)。不能与--walk-reflogs结合使用。

对象遍历

这些选项主要用于打包Git存储库。

  1. --no-walk[=(sorted|unsorted)]

只显示给定的提交,但不要遍历他们的祖先。如果指定了范围,则无效。如果给出了参数unsorted,则提交将按命令行中给出的顺序显示。否则(如果sorted或没有给出参数),提交按提交时间以反向时间顺序显示。不能与--graph结合使用。

  1. --do-walk

覆盖之前的--no-walk

提交格式

  1. --pretty[=<format>]
  1. --format=<format>

以给定格式打印提交日志的内容,其中< format> 可以是 oneline培养基更丰富之一电子邮件原始格式:< string>tformat:< string> 。当< format> 不属于上述情况,并且其中包含%占位符,其行为就像 —pretty = tformat:< format> 给出了。

有关每种格式的一些其他详细信息,请参阅“PRETTY FORMATS”部分。当 =< format> 部分省略,默认为 medium

注意:您可以在存储库配置中指定默认的漂亮格式(请参阅 git-config [1] )。

  1. --abbrev-commit

而不是显示完整的40字节十六进制提交对象名称,而只显示部分前缀。可以使用“—abbrev =< n>”指定非默认位数(如果显示,也会修改diff输出)。

对于使用80列终端的人来说,这应该使“—pretty = oneline”更具可读性。

  1. --no-abbrev-commit

显示完整的40字节十六进制提交对象名称。这否定了--abbrev-commit以及暗示它的选项,例如“—oneline”。它还会覆盖log.abbrevCommit变量。

  1. --oneline

这是一起使用的“—pretty = oneline —abbrev-commit”的简写。

  1. --encoding=<encoding>

提交对象在其编码头中记录用于日志消息的编码;此选项可用于告诉命令以用户首选的编码重新编码提交日志消息。对于非管道命令,默认为UTF-8。请注意,如果一个对象声称在X中编码并且我们在X中输出,我们将逐字输出该对象;这意味着原始提交中的无效序列可能会复制到输出中。

  1. --expand-tabs=<n>
  1. --expand-tabs
  1. --no-expand-tabs

执行选项卡扩展(将每个选项卡替换为足够的空格以填充到日志消息中的< n> 的倍数的下一个显示列),然后在输出中显示它。 --expand-tabs--expand-tabs=8的简写,--no-expand-tabs--expand-tabs=0的简写,它会禁用制表符扩展。

默认情况下,选项卡以相当格式展开,将日志消息缩进4个空格(即 medium ,默认情况下, fullfulller )。

  1. --notes[=<treeish>]

在显示提交日志消息时,显示注释提交的注释(请参阅 git-notes [1] )。当命令行中没有给出--pretty--format--oneline选项时,这是git loggit showgit whatchanged命令的默认值。

默认情况下,显示的注释来自core.notesRefnotes.displayRef变量(或相应的环境覆盖)中列出的注释refs。有关详细信息,请参阅 git-config [1]

使用可选的< treeish> 参数,使用树形查找要显示的注释。树形可以在以refs/notes/开头时指定完整的引用名称;当它以notes/开始时,refs/和其他refs/notes/作为前缀以形成ref的全名。

可以组合多个—notes选项来控制显示哪些音符。示例:“ - notes = foo”将仅显示“refs / notes / foo”中的注释; “—notes = foo —notes”将显示“refs / notes / foo”和默认音符ref(s)中的两个音符。

  1. --no-notes

不要显示笔记。这取消了上面的--notes选项,通过重置显示注释的注释列表。选项按命令行中给出的顺序进行解析,例如, “—notes —notes = foo —no-notes —notes = bar”只会显示“refs / notes / bar”中的注释。

  1. --show-notes[=<treeish>]
  1. --[no-]standard-notes

不推荐使用这些选项。请使用上面的—notes / - no-notes选项。

  1. --show-signature

通过将签名传递给gpg --verify并显示输出来检查已签名的提交对象的有效性。

  1. --relative-date

--date=relative的同义词。

  1. --date=<format>

仅对以人类可读格式显示的日期生效,例如使用--pretty时。 log.date config变量为日志命令的--date选项设置默认值。默认情况下,日期显示在原始时区(提交者或作者)中。如果-local附加到格式(例如,iso-local),则使用用户的本地时区。

--date=relative显示相对于当前时间的日期,例如“2小时前”。 -local选项对--date=relative无效。

--date=local--date=default-local的别名。

--date=iso(或--date=iso8601)以类似ISO 8601的格式显示时间戳。与严格的ISO 8601格式的区别在于:

  • 空格而不是T日期/时间分隔符

  • 时区和时区之间的空间

  • 时区的小时和分钟之间没有冒号

--date=iso-strict(或--date=iso8601-strict)以严格的ISO 8601格式显示时间戳。

  • --date=rfc(或--date=rfc2822)以RFC 2822格式显示时间戳,通常在电子邮件中找到。

  • --date=short仅以YYYY-MM-DD格式显示日期,但不显示时间。

  • --date=raw显示自纪元以来的秒数(1970-01-01 00:00:00 UTC),后跟一个空格,然后将时区显示为与UTC的偏移量(+-与四位数;前两位是小时,后两位是分钟)。即,好像时间戳是用strftime("%s %z")格式化的。请注意,-local选项不会影响秒 - 自 - 纪元值(始终以UTC为单位),但会切换附带的时区值。

  • --date=human如果时区与当前时区不匹配则显示时区,如果匹配则不显示整个日期(即跳过“今年”日期的打印年份,但也跳过整个日期如果它是在过去几天,我们可以说它是什么工作日)。对于较旧的日期,小时和分钟也被省略。

  • --date=unix将日期显示为Unix纪元时间戳(自1970年以来的秒数)。与--raw一样,它始终为UTC,因此-local无效。

  • --date=format:...将格式...输入系统strftime,%z和%Z除外,它们在内部处理。使用--date=format:%c以系统区域设置的首选格式显示日期。有关格式占位符的完整列表,请参阅strftime手册。使用-local时,正确的语法是--date=format-local:...

  • --date=default是默认格式,类似于--date=rfc2822,但有一些例外:

  • 星期几之后没有逗号

  • 使用本地时区时,省略时区

  1. --parents

同时打印提交的父级(以“提交父级”的形式)。也可以启用父重写,请参阅上面的历史简化

  1. --children

同时打印提交的子项(以“提交子项…”的形式)。也可以启用父重写,请参阅上面的历史简化

  1. --left-right

标记可以从中获取提交的对称差异的哪一侧。左侧的提示以&lt;为前缀,右侧的提示以&gt;为前缀。如果与--boundary结合使用,则这些提交以-为前缀。

例如,如果您有此拓扑:

  1. y---b---b branch B
  2. / \ /
  3. / .
  4. / / \
  5. o---x---a---a branch A

你会得到这样的输出:

  1. $ git rev-list --left-right --boundary --pretty=oneline A...B
  2. >bbbbbbb... 3rd on b
  3. >bbbbbbb... 2nd on b
  4. <aaaaaaa... 3rd on a
  5. <aaaaaaa... 2nd on a
  6. -yyyyyyy... 1st on b
  7. -xxxxxxx... 1st on a
  1. --graph

在输出的左侧绘制提交历史的基于文本的图形表示。这可能会导致在提交之间打印额外的行,以便正确绘制图形历史记录。不能与--no-walk结合使用。

这使父进行重写,参见上面的历史简化

默认情况下,这意味着--topo-order选项,但也可以指定--date-order选项。

  1. --show-linear-break[=<barrier>]

当不使用—graph时,所有历史分支都被展平,这使得很难看出两个连续的提交不属于线性分支。在这种情况下,此选项会在它们之间设置障碍。如果指定了&lt;barrier&gt;,则显示的是字符串而不是默认字符串。

差异格式化

下面列出了控制diff输出格式的选项。其中一些特定于 git-rev-list [1] ,但是可以给出其他差异选项。有关更多选项,请参阅 git-diff-files [1]

  1. -c

使用此选项,合并提交的diff输出同时显示每个父项与合并结果的差异,而不是一次显示父项和结果之间的成对差异。此外,它仅列出从所有父母修改的文件。

  1. --cc

这个标志意味着-c选项并通过省略不感兴趣的帅哥进一步压缩补丁输出,其中父母的内容只有两个变体,合并结果选择其中一个而不做修改。

  1. -m

此标志使合并提交像常规提交一样显示完整差异;对于每个合并父项,将生成单独的日志条目和差异。一个例外是,当给出--first-parent选项时,只显示对第一个父项的差异;在这种情况下,输出表示合并带来的变化进入当前分支的

  1. -r

显示递归差异。

  1. -t

在diff输出中显示树对象。这意味着-r

漂亮的格式

如果提交是合并,并且如果漂亮格式不是 oneline电子邮件raw ,则在作者之前插入另一行:行。该行以“Merge:”开头,并且打印祖先提交的sha1,用空格分隔。请注意,如果您限制了对历史记录的查看,则列出的提交可能不一定是直接父提交的列表:例如,如果您只对与某个目录或文件相关的更改感兴趣。

有几种内置格式,您可以通过设置漂亮的格式来定义其他格式。< name>将选项配置为另一种格式名称或格式:字符串,如下所述(参见 git-config [1] )。以下是内置格式的详细信息:

  • oneline

    1. &lt;sha1&gt; &lt;title line&gt;

    这是为了尽可能紧凑。

    1. commit &lt;sha1&gt;
    2. Author: &lt;author&gt;
    1. &lt;title line&gt;
    1. commit &lt;sha1&gt;
    2. Author: &lt;author&gt;
    3. Date: &lt;author date&gt;
    1. &lt;title line&gt;
    1. &lt;full commit message&gt;
    1. commit &lt;sha1&gt;
    2. Author: &lt;author&gt;
    3. Commit: &lt;committer&gt;
    1. &lt;title line&gt;
    1. &lt;full commit message&gt;
  • 更丰富

    1. commit &lt;sha1&gt;
    2. Author: &lt;author&gt;
    3. AuthorDate: &lt;author date&gt;
    4. Commit: &lt;committer&gt;
    5. CommitDate: &lt;committer date&gt;
    1. &lt;title line&gt;
    1. &lt;full commit message&gt;
  • 电子邮件

    1. From &lt;sha1&gt; &lt;date&gt;
    2. From: &lt;author&gt;
    3. Date: &lt;author date&gt;
    4. Subject: [PATCH] &lt;title line&gt;
    1. &lt;full commit message&gt;
  • 原始

    raw 格式显示完整提交,与存储在提交对象中完全相同。值得注意的是,无论是否使用—abbrev或—no-abbrev,SHA-1都会完整显示,并且信息显示真正的父提交,而不考虑移植或历史简化。请注意,此格式会影响提交的显示方式,但不会影响显示差异的方式,例如用git log --raw。要以原始diff格式获取完整对象名称,请使用--no-abbrev

  • 格式:< string>

    格式:< string> 格式允许您指定要显示的信息。它的工作方式有点像printf格式,但有一个值得注意的例外,即你用%n 而不是 \ n 获得换行符。

    例如,格式:“%h的作者是%an,%ar%n标题是>>%s<<%n”将显示如下内容:

    1. The author of fe6e0ee was Junio C Hamano, 23 hours ago
    2. The title was &gt;&gt;t4119: test autocomputing -p&lt;n&gt; for traditional diff input.&lt;&lt;

    占位符是:

    • %H :提交哈希

    • %h :缩写提交哈希

    • %T :树形哈希

    • %t :缩写树哈希

    • %P :父哈希

    • %p :缩写为父哈希值

    • %和:作者姓名

    • %aN :作者姓名(尊重.mailmap,见 git-shortlog [1]git-blame [1]

    • %ae :作者电邮

    • %aE :作者电子邮件(尊重.mailmap,见 git-shortlog [1]git-blame [1]

    • %ad :作者日期(格式尊重 - 日期=选项)

    • %aD :作者日期,RFC2822风格

    • %ar :作者日期,相对

    • %:作者日期,UNIX时间戳

    • %ai :作者日期,ISO 8601样格式

    • %aI :作者日期,严格的ISO 8601格式

    • %cn :提交者名称

    • %cN :提交者名称(尊重.mailmap,见 git-shortlog [1]git-blame [1]

    • %ce :提交者电子邮件

    • %cE :提交者电子邮件(尊重.mailmap,参见 git-shortlog [1]git-blame [1]

    • %cd :提交者日期(格式尊重 - 日期=选项)

    • %cD :提交者日期,RFC2822样式

    • %cr :提交者日期,相对

    • %ct :提交者日期,UNIX时间戳

    • %ci :提交者日期,类似ISO 8601的格式

    • %cI :提交者日期,严格的ISO 8601格式

    • %d :引用名称,如 git-log [1] 的—decorate选项

    • %D :没有“(”,“)”包装的引用名称。

    • %S :在达到提交的命令行上给出的引用名称(如git log --source),仅适用于git log

    • %e :编码

    • %s :受试者

    • %f :已清理的主题行,适用于文件名

    • %b :身体

    • %B :生体(未包裹的主体和身体)

    • %N :提交备注

    • %GG :来自GPG的签名提交的原始验证消息

    • %G? :显示好的(有效)签名“G”,坏签名显示“B”,有效期未知的好签名显示“U”,已过期的好签名显示“X”,“Y”代表由过期密钥签名的好签名,“R”表示由撤销密钥签名的好签名,“E”表示签名无法检查(例如缺少密钥),“N”表示没有签名

    • %GS :显示签名提交的签名者姓名

    • %GK :显示用于签署签名提交的密钥

    • %GF ​​:显示用于签署签名提交的密钥的指纹

    • %GP :显示主键的指纹,其子键用于签名提交的签名

    • %gD :reflog选择器,例如refs/stash@{1}refs/stash@{2 minutes ago};格式遵循-g选项描述的规则。 @之前的部分是命令行中给出的refname(因此git log -g refs/heads/master将产生refs/heads/master@{0})。

    • %gd :缩短了reflog选择器;与%gD相同,但refname部分缩短了人类的可读性(因此refs/heads/master变为master)。

    • %gn :reflog身份名称

    • %gN :reflog身份名称(尊重.mailmap,见 git-shortlog [1]git-blame [1]

    • %ge :reflog身份电子邮件

    • %gE :reflog身份邮件(尊重.mailmap,见 git-shortlog [1]git-blame [1]

    • %gs :reflog主题

    • %Cred :将颜色切换为红色

    • %Cgreen :将颜色切换为绿色

    • %Cblue :将颜色切换为蓝色

    • %Creset :重置颜色

    • %C(…):颜色规格,如 git-config [1] 的“CONFIGURATION FILE”部分中的值所述。默认情况下,仅在启用日志输出时显示颜色(通过color.diffcolor.ui--color,并且如果我们要去终端,则尊重前者的auto设置)。 %C(auto,...)被接受为默认的历史同义词(例如,%C(auto,red))。即使没有启用颜色,指定%C(always,...)也会显示颜色(尽管只考虑使用--color=always为整个输出启用颜色,包括这种格式和其他任何git可能颜色的颜色)。单独auto(即%C(auto))将打开下一个占位符的自动着色,直到再次切换颜色。

    • %m :左(&lt;),右(&gt;)或边界(-)标记

    • %n :换行符

    • %% :原始

    • %x00 :从十六进制代码打印一个字节

    • %w([< w> [,< i1> [,< i2>]]]):切换行换行,类似 git-shortlog [1]的-w选项

    • %<(< N> [,trunc | ltrunc | mtrunc]):使下一个占位符至少取N列,如果需要,在右边填充空格。如果输出长于N列,则可以选择在开头(ltrunc),中间(mtrunc)或结尾(trunc)截断。请注意,截断仅适用于N> = 2。

    • %< |(< N>):使下一个占位符至少占用第N列,如果需要,在右边填充空格

    • %>(< N>)%> |(< N>):与%相似,%< |(< N>),但左边的填充空格

    • %>(< N>)%> |(< N>):类似于%>(< N>分别是%> |(< N>),除非下一个占位符占用的空间多于给定的空间并且左侧有空格,请使用这些空格

    • %><(< N>)%>< |(< N>):类似于%<(< N> )%< |(< N>),但填充两侧(即文本居中)

    • %(预告片[:options]):显示 git-interpret-trailers [1] 解释的正文预告片。 trailers字符串后面可以跟冒号和零个或多个逗号分隔选项。如果给出了only选项,则省略拖车块中的非拖车线。如果给出unfold选项,则表现得就像给出了interpre-trailer的--unfold选项一样。例如,%(trailers:only,unfold)两者都做。

| 注意 | 一些占位符可能依赖于修订遍历引擎的其他选项。例如,%g* reflog选项将插入一个空字符串,除非我们遍历reflog条目(例如,通过git log -g)。如果命令行中尚未提供--decorate%d%D占位符将使用“短”装饰格式。 |

如果在占位符的之后添加+(加号),则在扩展之前插入换行符当且仅当占位符扩展为非空字符串时。

如果在占位符的之后添加-(减号),则当且仅当占位符扩展为空字符串时,才会删除紧接在扩展之前的所有连续换行符。

如果在占位符的之后添加一个“空格”,则在扩展之前插入一个空格,当且仅当占位符扩展为非空字符串时。

  • tformat:

    格式:格式与格式完全相同:,除了它提供“终结符”语义而不是“分隔符”语义。换句话说,每个提交都附加了消息终止符(通常是换行符),而不是在条目之间放置的分隔符。这意味着单行格式的最终​​输入将使用新行正确终止,就像“oneline”格式一样。例如:

    1. $ git log -2 --pretty=format:%h 4da45bef \
    2. | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/'
    3. 4da45be
    4. 7134973 -- NO NEWLINE
    5. $ git log -2 --pretty=tformat:%h 4da45bef \
    6. | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/'
    7. 4da45be
    8. 7134973

    此外,其中包含%的任何无法识别的字符串都被解释为它前面有tformat:。例如,这两个是等价的:

    1. $ git log -2 --pretty=tformat:%h 4da45bef
    2. $ git log -2 --pretty=%h 4da45bef

常见的DIFF选项

  1. -p
  1. -u
  1. --patch

生成补丁(请参阅生成补丁的部分)。

  1. -s
  1. --no-patch

抑制差异输出。对于git show等默认显示补丁的命令,或取消--patch的效果很有用。

  1. -U<n>
  1. --unified=<n>

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

  1. --raw

对于每个提交,使用原始diff格式显示更改摘要。请参阅 git-diff [1] 的“RAW OUTPUT FORMAT”部分。这与以原始格式显示日志本身不同,您可以使用--format=raw来实现。

  1. --patch-with-raw

-p --raw的同义词。

  1. --indent-heuristic

启用改变差异块边界的启发式以使补丁更易于阅读。这是默认值。

  1. --no-indent-heuristic

禁用缩进启发式。

  1. --minimal

花些额外的时间来确保产生尽可能小的差异。

  1. --patience

使用“耐心差异”算法生成差异。

  1. --histogram

使用“histogram diff”算法生成diff。

  1. --anchored=<text>

使用“锚定差异”算法生成差异。

可以多次指定此选项。

如果源和目标中都存在一行,只存在一次,并以此文本开头,则此算法会尝试阻止它在输出中显示为删除或添加。它在内部使用“耐心差异”算法。

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

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

  1. default, myers

基本的贪心差异算法。目前,这是默认值。

  1. minimal

花些额外的时间来确保产生尽可能小的差异。

  1. patience

生成补丁时使用“耐心差异”算法。

  1. histogram

该算法将耐心算法扩展为“支持低发生的共同元素”。

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

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

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

也可以使用--stat-width=&lt;width&gt;--stat-name-width=&lt;name-width&gt;--stat-count=&lt;count&gt;单独设置这些参数。

  1. --compact-summary

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

  1. --numstat

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

  1. --shortstat

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

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

输出每个子目录的相对更改量的分布。 --dirstat的行为可以通过以逗号分隔的参数列表传递来定制。默认值由diff.dirstat配置变量控制(参见 git-config [1] )。可以使用以下参数:

  1. changes

通过计算已从源中删除或添加到目标的行来计算dirstat数。这忽略了文件中纯代码移动的数量。换句话说,重新排列文件中的行不会像其他更改那样计算。这是没有给出参数时的默认行为。

  1. lines

通过执行常规的基于行的差异分析来计算dirstat数字,并对移除/添加的行数进行求和。 (对于二进制文件,计算64字节块,因为二进制文件没有自然的线条概念)。这是比changes行为更昂贵的--dirstat行为,但它确实计算文件中重新排列的行与其他更改一样多。结果输出与您从其他--*stat选项获得的输出一致。

  1. files

通过计算更改的文件数来计算dirstat数。在dirstat分析中,每个更改的文件都相同。这是计算上最便宜的--dirstat行为,因为它根本不需要查看文件内容。

  1. cumulative

计算父目录的子目录中的更改。请注意,使用cumulative时,报告的百分比总和可能超过100%。可以使用noncumulative参数指定默认(非累积)行为。

  1. <limit>

整数参数指定截止百分比(默认为3%)。贡献低于此百分比变化的目录不会显示在输出中。

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

  1. --summary

输出扩展标题信息的精简摘要,例如创建,重命名和模式更改。

  1. --patch-with-stat

-p --stat的同义词。

  1. -z

将提交与NUL分开,而不是使用新换行符。

此外,当给出--raw--numstat时,不要使用路径名并使用NUL作为输出字段终止符。

如果没有此选项,则会引用具有“异常”字符的路径名,如配置变量core.quotePath所述(参见 git-config [1] )。

  1. --name-only

仅显示已更改文件的名称。

  1. --name-status

仅显示已更改文件的名称和状态。有关状态字母的含义,请参阅--diff-filter选项的说明。

  1. --submodule[=<format>]

指定子模块的差异如何显示。指定--submodule=short时,使用格式。此格式仅显示范围开头和结尾的提交名称。指定--submodule--submodule=log时,使用 log 格式。此格式列出 git-submodule [1] summary等范围内的提交。指定--submodule=diff时,使用 diff 格式。此格式显示提交范围之间子模块内容更改的内联差异。如果未设置配置选项,则默认为diff.submodule格式。

  1. --color[=<when>]

显示彩色差异。 --color(即没有 =<当> )与--color=always相同时。 < when> 可以是alwaysneverauto之一。

  1. --no-color

关掉彩色差异。它与--color=never相同。

  1. --color-moved[=<mode>]

移动的代码行的颜色不同。 <模式>如果没有给出选项,默认为 no ,如果给出没有模式的选项,则默认为 zebra 。模式必须是以下之一:

  1. no

移动的线条不会突出显示。

  1. default

zebra的同义词。这可能会在未来转变为更明智的模式。

  1. plain

在一个位置添加并在另一个位置删除的任何行都将使用 color.diff.newMoved 进行着色。类似地, color.diff.oldMoved 将用于在diff中的其他位置添加的已删除行。此模式选择任何已移动的行,但在检查中确定是否在没有置换的情况下移动了代码块时,它不是很有用。

  1. blocks

贪婪地检测至少20个字母数字字符的移动文本块。使用 color.diff。{old,new} Moved 颜色绘制检测到的块。相邻的街区不能分开。

  1. zebra

模式中检测移动文本块。使用 color.diff。{old,new} Moved 颜色或 color.diff。{old,new} MovedAlternative 绘制块。两种颜色之间的变化表示检测到新的块。

  1. dimmed-zebra

zebra 类似,但执行了移动代码的无趣部分的额外调暗。两个相邻街区的边界线被认为是有趣的,其余的是无趣的。 dimmed_zebra是不推荐使用的同义词。

  1. --no-color-moved

关闭移动检测。这可用于覆盖配置设置。它与--color-moved=no相同。

  1. --color-moved-ws=<modes>

这将配置在执行--color-moved的移动检测时如何忽略空白。这些模式可以以逗号分隔的列表给出:

  1. no

执行移动检测时不要忽略空格。

  1. ignore-space-at-eol

忽略EOL中的空白更改。

  1. ignore-space-change

忽略空格量的变化。这会忽略行尾的空格,并将一个或多个空白字符的所有其他序列视为等效。

  1. ignore-all-space

比较线条时忽略空格。即使一行有空格而另一行没有空格,这也会忽略差异。

  1. allow-indentation-change

最初忽略移动检测中的任何空格,然后如果每行的空白变化相同,则仅将移动的代码块分组到块中。这与其他模式不兼容。

  1. --no-color-moved-ws

执行移动检测时不要忽略空格。这可用于覆盖配置设置。它与--color-moved-ws=no相同。

  1. --word-diff[=<mode>]

使用< mode>显示单词diff。划定改变的单词。默认情况下,单词由空格分隔;见下面的--word-diff-regex。 <模式>默认为 plain ,必须是以下之一:

  1. color

仅使用颜色突出显示更改的单词。意味着--color

  1. plain

将单词显示为[-removed-]{+added+}。如果它们出现在输入中,则不会尝试转义分隔符,因此输出可能不明确。

  1. porcelain

使用特殊的基于行的格式用于脚本使用。添加/删除/未更改的运行以通常的统一diff格式打印,从行开头的+ / - /`字符开始并延伸到行尾。输入中的换行符由其自身行上的波浪号~`表示。

  1. none

再次禁用字差异。

请注意,尽管第一个模式的名称,但如果启用了颜色,则使用颜色突出显示所有模式中已更改的部分。

  1. --word-diff-regex=<regex>

使用< regex>决定一个单词是什么,而不是将非空格的运行视为一个单词。除非已经启用,否则还暗示--word-diff

< regex>的每个非重叠匹配被认为是一个词。这些匹配之间的任何内容都被视为空格并被忽略(!)以查找差异。您可能希望将|[^[:space:]]附加到正则表达式,以确保它匹配所有非空白字符。包含换行符的匹配项会在换行符处以静默方式截断(!)。

例如,--word-diff-regex=.会将每个字符视为一个单词,并相应地逐个字符地显示差异。

正则表达式也可以通过diff驱动程序或配置选项设置,参见 gitattributes [5]git-config [1] 。明确地覆盖任何差异驱动程序或配置设置。 Diff驱动程序覆盖配置设置。

  1. --color-words[=<regex>]

相当于--word-diff=color加(如果指定了正则表达式)--word-diff-regex=&lt;regex&gt;

  1. --no-renames

关闭重命名检测,即使配置文件提供默认值也是如此。

  1. --check

如果更改引入冲突标记或空白错误,则发出警告。什么被认为是空白错误由core.whitespace配置控制。默认情况下,尾随空格(包括仅由空格组成的行)和在行的初始缩进内紧跟着制表符的空格字符被视为空格错误。如果发现问题,则退出非零状态。与—exit-code不兼容。

  1. --ws-error-highlight=<kind>

突出显示差异的contextoldnew行中的空白错误。多个值用逗号分隔,none重置先前的值,default将列表重置为newallold,new,context的简写。如果未指定此选项,并且未设置配置变量diff.wsErrorHighlight,则仅突出显示new行中的空白错误。空白错误用color.diff.whitespace着色。

  1. --full-index

在生成补丁格式输出时,在“索引”行上显示完整的前映像和后映像blob对象名称,而不是第一个字符。

  1. --binary

--full-index外,还可输出可用git-apply应用的二进制差异。

  1. --abbrev[=<n>]

而不是在diff-raw格式输出和diff-tree标题行中显示完整的40字节十六进制对象名称,而是仅显示部分前缀。这与上面的--full-index选项无关,后者控制diff-patch输出格式。可以使用--abbrev=&lt;n&gt;指定非默认位数。

  1. -B[<n>][/<m>]
  1. --break-rewrites[=[<n>][/<m>]]

将完整的重写更改分为删除和创建对。这有两个目的:

它影响了一个更改的方式,相当于一个文件的完全重写,而不是一系列的删除和插入混合在一起,只有几行恰好与文本作为上下文匹配,而是作为单个删除所有旧的后跟一个单个插入所有新内容,数字m控制-B选项的这一方面(默认为60%)。 -B/70%指定少于30%的原始文本应保留在结果中,以便Git将其视为完全重写(即,否则生成的修补程序将是一系列删除和插入与上下文行混合在一起)。

当与-M一起使用时,完全重写的文件也被视为重命名的源(通常-M只考虑作为重命名源消失的文件),并且数字n控制 - 的这方面 - B选项(默认为50%)。 -B20%指定添加和删除的更改与文件大小的20%或更多相比,有资格被选为可能的重命名源到另一个文件。

  1. -M[<n>]
  1. --find-renames[=<n>]

如果生成差异,则检测并报告每次提交的重命名。对于遍历历史记录时重命名后续文件,请参阅--follow。如果指定了n,则它是相似性指数的阈值(即与文件大小相比的添加/删除量)。例如,-M90%表示如果超过90%的文件未更改,Git应将删除/添加对视为重命名。如果没有%符号,则该数字将作为分数读取,并在其前面加上小数点。即,-M5变为0.5,因此与-M50%相同。同样,-M05-M5%相同。要将检测限制为精确重命名,请使用-M100%。默认相似性指数为50%。

  1. -C[<n>]
  1. --find-copies[=<n>]

检测副本以及重命名。另见--find-copies-harder。如果指定了n,则其含义与-M&lt;n&gt;的含义相同。

  1. --find-copies-harder

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

  1. -D
  1. --irreversible-delete

省略删除的原像,即只打印标题而不打印原像和/dev/null之间的差异。得到的贴片不适用于patchgit apply;这仅适用于那些希望在更改后专注于审阅文本的人。此外,输出显然缺乏足够的信息来反向应用这样的补丁,甚至手动,因此选项的名称。

-B一起使用时,也省略删除/创建对的删除部分中的原像。

  1. -l<num>

-M-C选项需要O(n ^ 2)处理时间,其中n是潜在的重命名/复制目标的数量。如果重命名/复制目标的数量超过指定的数量,此选项可防止重命名/复制检测运行。

  1. --diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]

仅选择已添加(A),复制(C),已删除(D),已修改(M),已重命名(R)的文件,其类型(即常规文件,符号链接,子模块,…)更改(T),未合并(U),未知(X),或已配对破碎(B)。可以使用过滤器字符的任何组合(包括无)。当*(全部或全部)添加到组合中时,如果有任何文件与比较中的其他条件匹配,则选择所有路径;如果没有与其他条件匹配的文件,则不会选择任何内容。

此外,这些大写字母可以降级为排除。例如。 --diff-filter=ad排除添加和删除的路径。

请注意,并非所有差异都可以包含所有类型。例如,从索引到工作树的差异永远不会有添加条目(因为差异中包含的路径集受限于索引中的内容)。同样,如果禁用了对这些类型的检测,则无法显示复制和重命名的条目。

  1. -S<string>

查找改变文件中指定字符串出现次数(即添加/删除)的差异。用于脚本编写者的使用。

当你正在寻找一个确切的代码块(比如一个结构体)时,它很有用,并且想要知道该块首次出现以来的历史:迭代地使用该特征将原始图像中的有趣块反馈回-S,继续前进,直到你获得该块的第一个版本。

也搜索二进制文件。

  1. -G<regex>

查找补丁文本包含与< regex>匹配的添加/删除行的差异。

为了说明-S&lt;regex&gt; --pickaxe-regex-G&lt;regex&gt;之间的区别,请考虑在同一文件中使用以下diff进行提交:

  1. + return !regexec(regexp, two->ptr, 1, &regmatch, 0);
  2. ...
  3. - hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);

虽然git log -G"regexec\(regexp"将显示此提交,但git log -S"regexec\(regexp" --pickaxe-regex不会(因为该字符串的出现次数没有改变)。

除非提供--text,否则将忽略没有textconv过滤器的二进制文件的补丁。

有关详细信息,请参阅 gitdiffcore [7] 中的 pickaxe 条目。

  1. --find-object=<object-id>

查找更改指定对象出现次数的差异。与-S类似,只是参数的不同之处在于它不搜索特定的字符串,而是搜索特定的对象id。

该对象可以是blob或子模块提交。它意味着git-log中的-t选项也可以找到树。

  1. --pickaxe-all

-S-G找到更改时,显示该更改集中的所有更改,而不仅仅是包含< string>中更改的文件。

  1. --pickaxe-regex

对待< string>赋予-S作为扩展的POSIX正则表达式以匹配。

  1. -O<orderfile>

控制文件在输出中的显示顺序。这会覆盖diff.orderFile配置变量(参见 git-config [1] )。要取消diff.orderFile,请使用-O/dev/null

输出顺序由< orderfile>中的glob模式的顺序决定。首先输出所有与第一个模式匹配的路径名的文件,然后输出所有与第二个模式(但不是第一个模式)匹配的路径名的文件,依此类推。路径名与任何模式都不匹配的所有文件都是最后输出的,就好像文件末尾有一个隐式匹配所有模式一样。如果多个路径名具有相同的等级(它们匹配相同的模式但没有早期模式),则它们相对于彼此的输出顺序是正常顺序。

< orderfile>解析如下:

  • 空行被忽略,因此可以将它们用作分隔符以提高可读性。

  • 以哈希(“#”)开头的行将被忽略,因此它们可用于注释。如果以散列开头,则将反斜杠(“\”)添加到模式的开头。

  • 每个其他行包含一个模式。

模式与没有FNM_PATHNAME标志的fnmatch(3)使用的模式具有相同的语法和语义,但如果删除任意数量的最终路径名组件与模式匹配,则路径名也匹配模式。例如,模式“foo*bar”匹配“fooasdfbar”和“foo/bar/baz/asdf”而不匹配“foobarx”。

  1. -R

交换两个输入;也就是说,显示从索引或磁盘文件到树内容的差异。

  1. --relative[=<path>]

从项目的子目录运行时,可以告诉它排除目录外的更改并使用此选项显示相对于它的路径名。当您不在子目录中时(例如,在裸存储库中),您可以通过给出< path>来命名哪个子目录以使输出相对。作为一个论点。

  1. -a
  1. --text

将所有文件视为文本。

  1. --ignore-cr-at-eol

进行比较时,忽略行尾的回车。

  1. --ignore-space-at-eol

忽略EOL中的空白更改。

  1. -b
  1. --ignore-space-change

忽略空格量的变化。这会忽略行尾的空格,并将一个或多个空白字符的所有其他序列视为等效。

  1. -w
  1. --ignore-all-space

比较线条时忽略空格。即使一行有空格而另一行没有空格,这也会忽略差异。

  1. --ignore-blank-lines

忽略其行全部为空的更改。

  1. --inter-hunk-context=<lines>

显示差异之间的上下文,直到指定的行数,从而融合彼此接近的帅哥。如果未设置配置选项,则默认为diff.interHunkContext或0。

  1. -W
  1. --function-context

显示整个周围的变化功能。

  1. --ext-diff

允许执行外部diff助手。如果使用 gitattributes [5] 设置外部差异驱动程序,则需要将此选项与 git-log [1] 和朋友一起使用。

  1. --no-ext-diff

禁止外部差异驱动程序。

  1. --textconv
  1. --no-textconv

在比较二进制文件时允许(或禁止)外部文本转换过滤器运行。有关详细信息,请参阅 gitattributes [5] 。由于textconv过滤器通常是单向转换,因此生成的差异适合人类使用,但无法应用。因此,默认情况下,textconv过滤器仅针对 git-diff [1]git-log [1] 启用,但不适用于 git-format-patch [ 1] 或差异管道命令。

  1. --ignore-submodules[=<when>]

忽略差异生成中子模块的更改。 <当>可以是“none”,“untracked”,“dirty”或“all”,这是默认值。使用“none”时,如果子模块包含未跟踪或修改的文件,或者其HEAD与超级项目中记录的提交不同,则可以使用“无”来修改子模块,并可用于覆盖ignore 选项的任何设置git-config [1]gitmodules [5] 。当使用“未跟踪”时,如果子模块仅包含未跟踪的内容(但仍会扫描修改的内容),则子模块不会被视为脏。使用“脏”忽略对子模块工作树的所有更改,仅显示存储在超级项目中的提交的更改(这是1.7.0之前的行为)。使用“all”隐藏子模块的所有更改。

  1. --src-prefix=<prefix>

显示给定的源前缀而不是“a /”。

  1. --dst-prefix=<prefix>

显示给定的目标前缀而不是“b /”。

  1. --no-prefix

不显示任何源或目标前缀。

  1. --line-prefix=<prefix>

为每行输出预先附加前缀。

  1. --ita-invisible-in-index

默认情况下,“git add -N”添加的条目在“git diff”中显示为现有空文件,在“git diff —cached”中显示为新文件。此选项使条目在“git diff”中显示为新文件,在“git diff —cached”中不存在。可以使用--ita-visible-in-index恢复此选项。这两个选项都是实验性的,将来可以删除。

有关这些常用选项的更详细说明,另请参阅 gitdiffcore [7]

使用-p生成补丁

当“git-diff-index”,“git-diff-tree”或“git-diff-files”使用-p选项运行时,“git diff”不带--raw选项或“git log”使用“-p”选项,它们不会产生上述输出;相反,他们生成一个补丁文件。您可以通过GIT_EXTERNAL_DIFFGIT_DIFF_OPTS环境变量自定义此类修补程序的创建。

-p选项产生的内容与传统的diff格式略有不同:

  1. 它前面有一个“git diff”标题,如下所示:

    1. diff --git a/file1 b/file2

    除非涉及重命名/复制,否则a/b/文件名是相同的。特别是,即使是创建或删除,/dev/null也是而不是来代替a/b/文件名。

    当涉及重命名/复制时,file1file2分别显示重命名/复制的源文件的名称和重命名/复制的文件的名称。

  2. 它后跟一个或多个扩展标题行:

    1. old mode &lt;mode&gt;
    2. new mode &lt;mode&gt;
    3. deleted file mode &lt;mode&gt;
    4. new file mode &lt;mode&gt;
    5. copy from &lt;path&gt;
    6. copy to &lt;path&gt;
    7. rename from &lt;path&gt;
    8. rename to &lt;path&gt;
    9. similarity index &lt;number&gt;
    10. dissimilarity index &lt;number&gt;
    11. index &lt;hash&gt;..&lt;hash&gt; &lt;mode&gt;

    文件模式打印为6位八进制数,包括文件类型和文件权限位。

    扩展标头中的路径名不包括a/b/前缀。

    相似性指数是未更改行的百分比,相异性指数是更改行的百分比。它是一个向下舍入的整数,后跟一个百分号。因此,100%的相似性索引值保留用于两个相等的文件,而100%的相异性意味着旧文件中的任何行都不会成为新文件。

    索引行包括更改前后的SHA-1校验和。 <模式>如果文件模式没有改变,则包括在内;否则,单独的行表示旧模式和新模式。

  3. 具有“异常”字符的路径名被引用,如配置变量core.quotePath所述(参见 git-config [1] )。

  4. 输出中的所有file1文件在提交之前引用文件,并且所有file2文件在提交之后引用文件。将每个更改顺序应用于每个文件是不正确的。例如,此补丁将交换a和b:

    1. diff --git a/a b/b
    2. rename from a
    3. rename to b
    4. diff --git a/b b/a
    5. rename from b
    6. rename to a

组合差异格式

在显示合并时,任何差异生成命令都可以使用-c--cc选项生成组合差异。当显示与 git-diff [1]git-show [1] 的合并时,这是默认格式。另请注意,您可以为这些命令中的任何一个提供-m选项,以强制使用合并的各个父项生成差异。

组合diff 格式如下所示:

  1. diff --combined describe.c
  2. index fabadb8,cc95eb0..4866510
  3. --- a/describe.c
  4. +++ b/describe.c
  5. @@@ -98,20 -98,12 +98,20 @@@
  6. return (a_date > b_date) ? -1 : (a_date == b_date) ? 0 : 1;
  7. }
  8. - static void describe(char *arg)
  9. -static void describe(struct commit *cmit, int last_one)
  10. ++static void describe(char *arg, int last_one)
  11. {
  12. + unsigned char sha1[20];
  13. + struct commit *cmit;
  14. struct commit_list *list;
  15. static int initialized = 0;
  16. struct commit_name *n;
  17. + if (get_sha1(arg, sha1) < 0)
  18. + usage(describe_usage);
  19. + cmit = lookup_commit_reference(sha1);
  20. + if (!cmit)
  21. + usage(describe_usage);
  22. +
  23. if (!initialized) {
  24. initialized = 1;
  25. for_each_ref(get_name);
  1. 它前面有一个“git diff”标题,看起来像这样(当使用-c选项时):

    1. diff --combined file

    或者像这样(当使用--cc选项时):

    1. diff --cc file
  2. 它后跟一个或多个扩展标题行(此示例显示了与两个父项的合并):

    1. index &lt;hash&gt;,&lt;hash&gt;..&lt;hash&gt;
    2. mode &lt;mode&gt;,&lt;mode&gt;..&lt;mode&gt;
    3. new file mode &lt;mode&gt;
    4. deleted file mode &lt;mode&gt;,&lt;mode&gt;

    只有当< mode>中的至少一个出现时,mode &lt;mode&gt;,&lt;mode&gt;..&lt;mode&gt;行才会出现。与其他人不同。具有关于检测到的内容移动(重命名和复制检测)的信息的扩展标题被设计为与两个< tree-ish>的差异一起工作。并且不会被组合diff格式使用。

  3. 接下来是两行的文件/文件头

    1. --- a/file
    2. +++ b/file

    与传统统一 diff格式的双行标题类似,/dev/null用于表示创建或删除的文件。

  4. 修改了块头格式以防止人们意外地将其馈送到patch -p1。创建组合差异格式用于审查合并提交更改,并不适用于应用。此更改类似于扩展索引标头中的更改:

    1. @@@ &lt;from-file-range&gt; &lt;from-file-range&gt; &lt;to-file-range&gt; @@@

    组合diff格式的块头中有(父项数+ 1)@个字符。

与传统的统一差异格式不同,后者显示两个文件A和B,其中一列具有-(减去 - 出现在A中但在B中删除),+(加 - 缺少A但是添加到B)或" "(空格 - 未更改)前缀,此格式将两个或多个文件file1,file2,…与一个文件X进行比较,并显示X与每个文件N的不同之处。每个fileN的一列被添加到输出行之前,以指示X的行与它的不同之处。

N列中的-字符表示该行出现在fileN中,但它不会出现在结果中。列N中的+字符表示该行出现在结果中,而fileN没有该行(换句话说,从该父项的角度添加了该行)。

在上面的示例输出中,函数签名已从两个文件中更改(因此,file1和file2中的两个-删除加上++表示添加的一行未出现在file1或file2中)。另外八行与file1相同,但不出现在file2中(因此以+为前缀)。

当由git diff-tree -c显示时,它将合并提交的父项与合并结果进行比较(即file1..fileN是父项)。当由git diff-files -c显示时,它将两个未解析的合并父项与工作树文件进行比较(即file1是阶段2又名“我们的版本”,file2是阶段3又名“他们的版本”)。

例子

  1. git log --no-merges

显示整个提交历史记录,但跳过任何合并

  1. git log v2.6.12.. include/scsi drivers/scsi

显示自版本 v2.6.12 以来更改include/scsidrivers/scsi子目录中的任何文件的所有提交

  1. git log --since="2 weeks ago" -- gitk

在过去两周内将更改显示到文件 gitk--是必要的,以避免与名为 gitk分支混淆

  1. git log --name-status release..test

显示“test”分支中但尚未在“release”分支中的提交,以及每个提交修改的路径列表。

  1. git log --follow builtin/rev-list.c

显示更改builtin/rev-list.c的提交,包括在文件被赋予其当前名称之前发生的提交。

  1. git log --branches --not --remotes=origin

显示任何本地分支中的所有提交,但不显示原点的任何远程跟踪分支中的所有提交(您的原点没有)。

  1. git log master --not --remotes=*/master

显示本地主服务器中但不在任何远程存储库主分支中的所有提交。

  1. git log -p -m --first-parent

显示包含更改差异的历史记录,但仅显示“主分支”透视图,跳过来自合并分支的提交,并显示合并引入的完整更改差异。只有遵循严格的策略,在停留在单个集成分支上时合并所有主题分支才有意义。

  1. git log -L '/int main/',/^}/:main.c

显示文件main.c中的函数main()如何随时间演变。

  1. git log -3

将要显示的提交数限制为3。

讨论

Git在某种程度上是字符编码不可知的。

  • blob对象的内容是未解释的字节序列。核心级别没有编码转换。

  • 路径名以UTF-8规范化形式C编码。这适用于树对象,索引文件,ref名称,以及命令行参数,环境变量和配置文件中的路径名(.git/config(参见 git) -config [1] ), gitignore [5]gitattributes [5]gitmodules [5] )。

    请注意,核心级别的Git仅将路径名称视为非NUL字节序列,没有路径名称编码转换(Mac和Windows除外)。因此,即使在使用传统扩展ASCII编码的平台和文件系统上,使用非ASCII路径名也会起作用。但是,在此类系统上创建的存储库将无法在基于UTF-8的系统(例如Linux,Mac,Windows)上正常工作,反之亦然。此外,许多基于Git的工具只是假设路径名为UTF-8,并且无法正确显示其他编码。

  • 提交日志消息通常以UTF-8编码,但也支持其他扩展ASCII编码。这包括ISO-8859-x,CP125x和许多其他,但不是 UTF-16/32,EBCDIC和CJK多字节编码(GBK,Shift-JIS,Big5,EUC-x,CP9xx等。 )。

虽然我们鼓励提交日志消息以UTF-8编码,但核心和Git瓷器都不是为了强制项目使用UTF-8。如果特定项目的所有参与者发现使用遗留编码更方便,Git不会禁止它。但是,有一些事情需要牢记。

  1. git commitgit commit-tree 发出警告,如果提供给它的提交日志消息看起来不像有效的UTF-8字符串,除非你明确说你的项目使用了遗产编码。说这个的方法是在.git/config文件中使用i18n.commitencoding,如下所示:

    1. [i18n]
    2. commitEncoding = ISO-8859-1

    使用上述设置创建的提交对象在其encoding标题中记录i18n.commitEncoding的值。这是为了帮助其他人以后再看。缺少此标头意味着提交日志消息以UTF-8编码。

  2. git loggit showgit blame 和朋友们查看提交对象的encoding头,并尝试将日志消息重新编码为除非另有说明,否则为UTF-8。您可以使用.git/config文件中的i18n.logOutputEncoding指定所需的输出编码,如下所示:

    1. [i18n]
    2. logOutputEncoding = ISO-8859-1

    如果您没有此配置变量,则使用i18n.commitEncoding的值。

请注意,我们故意选择在提交以在提交对象级别强制使用UTF-8时不重新编写提交日志消息,因为重新编码为UTF-8不一定是可逆操作。

组态

对于核心变量,请参见 git-config [1] ,对于差异生成,请参见 git-diff [1]

  1. format.pretty

--format选项的默认值。 (参见上面的漂亮格式。)默认为medium

  1. i18n.logOutputEncoding

显示日志时使用的编码。 (参见上面的讨论。)如果设置,则默认为i18n.commitEncoding的值,否则为UTF-8。

  1. log.date

人类可读日期的默认格式。 (比较--date选项。)默认为“默认”,表示写入Sat May 8 19:35:34 2010 -0500等日期。

如果格式设置为“auto:foo”并且正在使用寻呼机,则格式“foo”将用于日期格式。否则将使用“默认”。

  1. log.follow

如果truegit log将像单个<路径>一样使用--follow选项。给出。这与--follow具有相同的限制,即它不能用于跟踪多个文件,并且在非线性历史记录上不能很好地工作。

  1. log.showRoot

如果falsegit log和相关命令不会将初始提交视为大创建事件。 git log -p输出中的任何根提交都将显示没有附加差异。默认值为true

  1. log.showSignature

如果truegit log和相关命令的作用就像传递了--show-signature选项一样。

  1. mailmap.*

git-shortlog [1]

  1. notes.displayRef

除了core.notesRefGIT_NOTES_REF设置的默认值之外,还使用log系列命令显示提交消息时的注释。见 git-notes [1]

可以是未缩写的引用名称或glob,可以多次指定。将为不存在的引用发出警告,但是会自动忽略与任何引用不匹配的glob。

可以通过--no-notes选项禁用此设置,由GIT_NOTES_DISPLAY_REF环境变量覆盖,并由--notes=&lt;ref&gt;选项覆盖。

GIT

部分 git [1] 套件