Git
English ▾ 主题 ▾ 最新版本 ▾ git-rev-list 最后更新于 2.45.0

名称

git-rev-list - 按反时间顺序列出提交对象

概要

git rev-list [<options>] <commit>…​ [--] [<path>…​]

描述

列出可以通过从给定提交(s)跟踪 parent 链接访问到的提交,但排除可以通过在前面加上 ^ 给出的提交访问到的提交。默认情况下,输出按反时间顺序给出。

您可以将其视为一个集合运算。从命令行上给出的任何提交可以访问到的提交形成一个集合,然后从前面加上 ^ 给出的任何提交可以访问到的提交从该集合中减去。剩余的提交是命令输出中的内容。各种其他选项和路径参数可用于进一步限制结果。

因此,以下命令

$ git rev-list foo bar ^baz

表示“列出所有可以从 foobar 访问到但不能从 baz 访问到的提交”。

可以使用特殊的符号“<commit1>..<commit2>”作为“^<commit1> <commit2>”的简写。例如,以下两者可以互换使用

$ git rev-list origin..HEAD
$ git rev-list HEAD ^origin

另一种特殊的符号是“<commit1>…​<commit2>”,它对于合并很有用。生成的提交集是两个操作数之间的对称差。以下两个命令等效

$ git rev-list A B --not $(git merge-base --all A B)
$ git rev-list A...B

rev-list 是一个必不可少的 Git 命令,因为它提供了构建和遍历提交祖先图的能力。因此,它有很多不同的选项,使它能够被像 git bisectgit repack 这样不同的命令使用。

选项

提交限制

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

使用更多选项通常会进一步限制输出(例如,--since=<date1> 限制为比 <date1> 更新的提交,并且与 --grep=<pattern> 一起使用时,进一步限制为其日志消息包含与 <pattern> 匹配的行),除非另有说明。

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

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

限制输出的提交数量。

--skip=<number>

在开始显示提交输出之前跳过 number 个提交。

--since=<date>
--after=<date>

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

--since-as-filter=<date>

显示所有比特定日期更新的提交。这会访问范围内的所有提交,而不是停止在比特定日期更旧的第一个提交处。

--until=<date>
--before=<date>

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

--max-age=<timestamp>
--min-age=<timestamp>

将提交输出限制在指定的时间范围内。

--author=<pattern>
--committer=<pattern>

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

--grep-reflog=<pattern>

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

--grep=<pattern>

将提交输出限制为其日志消息与指定模式(正则表达式)匹配的提交。对于多个 --grep=<pattern>,选择其消息与任何给定模式匹配的提交(但请参阅 --all-match)。

--all-match

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

--invert-grep

将提交输出限制为其日志消息与使用 --grep=<pattern> 指定的模式不匹配的提交。

-i
--regexp-ignore-case

不区分字母大小写地匹配正则表达式限制模式。

--basic-regexp

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

-E
--extended-regexp

将限制模式视为扩展正则表达式,而不是默认的基本正则表达式。

-F
--fixed-strings

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

-P
--perl-regexp

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

对这些类型的正则表达式的支持是一个可选的编译时依赖项。如果 Git 未编译为支持它们,则提供此选项将导致它终止。

--remove-empty

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

--merges

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

--no-merges

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

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

仅显示至少(或至多)具有指定数量父提交的提交。特别是,--max-parents=1 等同于 --no-merges--min-parents=2 等同于 --merges--max-parents=0 显示所有根提交,--min-parents=3 显示所有八爪鱼合并。

--no-min-parents--no-max-parents 将这些限制重置(为无限制)。等效形式为 --min-parents=0(任何提交都有 0 个或多个父提交)和 --max-parents=-1(负数表示没有上限)。

--first-parent

在查找要包含的提交时,遇到合并提交时仅跟随第一个父提交。此选项在查看特定主题分支的演变时可以提供更好的概述,因为合并到主题分支中往往只是为了不时调整到更新的上游,并且此选项允许您忽略此类合并引入到您的历史记录中的各个提交。

--exclude-first-parent-only

在查找要排除的提交(使用 ^)时,遇到合并提交时仅跟随第一个父提交。这可以用来查找主题分支中从其与远程分支分叉点开始的更改集,因为任意合并可以是有效的主题分支更改。

--not

反转所有后续修订规范(直到下一个 --not)中 ^ 前缀(或缺少前缀)的含义。当在命令行上用于 --stdin 之前时,通过 stdin 传递的修订不会受其影响。相反,当通过标准输入传递时,在命令行上传递的修订不会受其影响。

--all

假装所有 refs/ 中的引用以及 HEAD 都在命令行上列出为 <commit>

--branches[=<pattern>]

假装所有 refs/heads 中的引用都列在命令行上为 <commit>。如果给出了 <pattern>,则将分支限制为与给定 shell glob 匹配的分支。如果模式缺少 ?*[,则在末尾隐含 /*

--tags[=<pattern>]

假装所有 refs/tags 中的引用都列在命令行上为 <commit>。如果给出了 <pattern>,则将标签限制为与给定 shell glob 匹配的标签。如果模式缺少 ?*[,则在末尾隐含 /*

--remotes[=<pattern>]

假装所有 refs/remotes 中的引用都列在命令行上为 <commit>。如果给出了 <pattern>,则将远程跟踪分支限制为与给定 shell glob 匹配的分支。如果模式缺少 ?*[,则在末尾隐含 /*

--glob=<glob-pattern>

假装所有与 shell glob <glob-pattern> 匹配的引用都列在命令行上为 <commit>。如果缺少,则会自动在前面添加 refs/。如果模式缺少 ?*[,则在末尾隐含 /*

--exclude=<glob-pattern>

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

当分别应用于 --branches--tags--remotes 时,给定的模式不应以 refs/headsrefs/tagsrefs/remotes 开头,并且当应用于 --glob--all 时,它们必须以 refs/ 开头。如果需要尾随 /*,则必须明确给出。

--exclude-hidden=[fetch|receive|uploadpack]

不包含 git-fetchgit-receive-packgit-upload-pack 会通过咨询相应的 fetch.hideRefsreceive.hideRefsuploadpack.hideRefs 配置以及 transfer.hideRefs 来隐藏的引用(请参阅 git-config[1])。此选项影响下一个伪引用选项 --all--glob,并在处理它们后清除。

--reflog

假装所有由 reflog 提及的对象都列在命令行上为 <commit>

--alternate-refs

假装所有在命令行上列出的备用存储库的 ref 提示中提到的对象。备用存储库是其对象目录在 objects/info/alternates 中指定的任何存储库。包含的对象集可能会被 core.alternateRefsCommand 等修改。请参阅 git-config[1]

--single-worktree

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

--ignore-missing

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

--stdin

除了从命令行获取参数外,还从标准输入中读取参数。这接受提交和伪选项,如 --all--glob=。当看到 -- 分隔符时,以下输入将被视为路径并用于限制结果。通过标准输入读取的 --not 等标志仅对其以相同方式传递的参数有效,并且不会影响任何后续命令行参数。

--quiet

不要向标准输出打印任何内容。此表单主要用于允许调用者测试退出状态以查看一系列对象是否完全连接(或未连接)。它比将 stdout 重定向到 /dev/null 更快,因为输出不需要进行格式化。

--disk-usage
--disk-usage=human

抑制正常输出;而是打印所选提交或对象在磁盘上存储使用的字节数之和。这等同于将输出通过管道传递给 git cat-file --batch-check='%(objectsize:disk)',但运行速度快得多(尤其是在使用 --use-bitmap-index 时)。有关“磁盘存储”的含义的限制,请参阅 git-cat-file[1] 中的 CAVEATS 部分。使用可选值 human,磁盘存储大小将以人类可读的字符串显示(例如 12.24 Kib、3.50 Mib)。

--cherry-mark

类似于 --cherry-pick(见下文),但用 = 标记等效的提交而不是省略它们,用 + 标记不等效的提交。

--cherry-pick

当使用对称差集限制提交集时,省略任何引入与“另一侧”上的另一个提交相同更改的提交。

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

--left-only
--right-only

仅列出对称差集各自侧面的提交,即仅列出 --left-right 将标记为 <> 的提交。

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

--cherry

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

-g
--walk-reflogs

不是遍历提交祖先链,而是从最新的 reflog 条目遍历到较旧的条目。使用此选项时,您无法指定要排除的提交(即,无法使用 ^commitcommit1..commit2commit1...commit2 符号)。

使用除 onelinereference 之外的 --pretty 格式(出于显而易见的原因),这会导致输出包含从 reflog 中获取的两行额外信息。输出中的 reflog 指示符可以显示为 ref@{<Nth>}(其中 <Nth> 是 reflog 中的反时间顺序索引)或 ref@{<timestamp>}(使用该条目的 <timestamp>),具体取决于一些规则

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

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

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

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

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

--pretty=reference 下,此信息根本不会显示。

--merge

显示在范围 HEAD...<other> 中影响冲突路径的提交,其中 <other>MERGE_HEADCHERRY_PICK_HEADREVERT_HEADREBASE_HEAD 中第一个存在的伪引用。仅在索引具有未合并的条目时才有效。此选项可用于在解决来自三方合并的冲突时显示相关提交。

--boundary

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

--use-bitmap-index

尝试使用包位图索引(如果可用)加快遍历速度。请注意,当使用 --objects 遍历时,树和 blob 不会打印其关联的路径。

--progress=<header>

在考虑对象时在 stderr 上显示进度报告。每次进度更新时都会打印 <header> 文本。

历史简化

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

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

<paths>

选择修改给定<paths>的提交。

--simplify-by-decoration

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

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

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

默认模式

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

--show-pulls

包含默认模式中的所有提交,以及任何对第一个父节点不是TREESAME但对以后的父节点是TREESAME的合并提交。此模式有助于显示“首次引入”分支更改的合并提交。

--full-history

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

--dense

仅显示选定的提交,以及一些用于提供有意义的历史记录的提交。

--sparse

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

--simplify-merges

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

--ancestry-path[=<commit>]

当指定要显示的提交范围(例如commit1..commit2commit2 ^commit1)时,仅显示该范围内是<commit>的祖先、<commit>的后代或<commit>本身的提交。如果未指定提交,则使用commit1(范围的排除部分)作为<commit>。可以多次传递;如果是这样,如果提交是给定的任何提交,或者它是其中一个提交的祖先或后代,则包含该提交。

下面是更详细的解释。

假设你将foo指定为<paths>。我们将修改foo的提交称为!TREESAME,其余的称为TREESAME。(在针对foo过滤的diff中,它们分别看起来不同和相同。)

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

	  .-A---M---N---O---P---Q
	 /     /   /   /   /   /
	I     B   C   D   E   Y
	 \   /   /   /   /   /
	  `-------------'   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”。PO是TREESAME,但对E不是。

  • X是一个独立的根提交,它添加了一个新文件side,并且Y修改了它。YX是TREESAME。它的合并Qside添加到P中,并且QP是TREESAME,但对Y不是。

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

默认模式

如果提交对任何父节点都不是TREESAME,则包含该提交(尽管这可以更改,请参见下面的--sparse)。如果提交是合并提交,并且它对一个父节点是TREESAME,则仅跟踪该父节点。(即使有多个TREESAME父节点,也只跟踪其中一个。)否则,跟踪所有父节点。

这将导致

	  .-A---N---O
	 /     /   /
	I---------D

请注意,仅跟踪TREESAME父节点(如果可用)的规则完全删除了BC通过N被考虑在内,但它是TREESAME。根提交与空树进行比较,因此I为!TREESAME。

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

不带父重写的--full-history

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

	I  A  B  N  D  O  P  Q

M被排除在外,因为它对两个父节点都是TREESAME。ECB都被遍历,但只有B是!TREESAME,因此其他提交未显示。

请注意,在没有父重写的情况下,实际上无法讨论提交之间的父/子关系,因此我们将其显示为断开连接。

带父重写的--full-history

普通提交仅在它们为!TREESAME时才包含(尽管这可以更改,请参见下面的--sparse)。

合并始终包含在内。但是,它们的父列表会被重写:沿着每个父节点,修剪掉本身未包含的提交。这将导致

	  .-A---M---N---O---P---Q
	 /     /   /   /   /
	I     B   /   D   /
	 \   /   /   /   /
	  `-------------'

与上面不带重写的--full-history进行比较。请注意,E被修剪掉了,因为它已TREESAME,但P的父列表被重写为包含E的父节点ICN以及XYQ也发生了同样的情况。

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

--dense

如果遍历的提交对任何父节点都不是TREESAME,则包含该提交。

--sparse

包含所有遍历的提交。

请注意,在没有--full-history的情况下,这仍然会简化合并:如果其中一个父节点是TREESAME,我们只跟踪该父节点,因此合并的其他方面永远不会被遍历。

--simplify-merges

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

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

  • C'设置为C

  • C'的每个父节点P替换为其简化版本P'。在此过程中,删除是其他父节点的祖先或对空树是TREESAME的根提交的父节点,并删除重复项,但要注意永远不要删除我们对之是TREESAME的所有父节点。

  • 如果在此父重写之后,C'是根或合并提交(具有零个或>1个父节点)、边界提交或!TREESAME,则它将保留。否则,它将被其唯一的父节点替换。

通过与带父重写的--full-history进行比较,可以最好地显示其效果。示例变为

	  .-A---M---N---O
	 /     /       /
	I     B       D
	 \   /       /
	  `---------'

请注意NPQ--full-history相比的主要差异

  • N的父列表已删除I,因为它是的另一个父节点M的祖先。尽管如此,N仍然保留,因为它为!TREESAME。

  • P的父列表也已删除I。然后P被完全删除,因为它有一个父节点并且为TREESAME。

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

还有另一种简化模式可用

--ancestry-path[=<commit>]

将显示的提交限制为是<commit>的祖先、是<commit>的后代或为<commit>本身的提交。

例如,考虑以下提交历史记录

	    D---E-------F
	   /     \       \
	  B---C---G---H---I---J
	 /                     \
	A-------K---------------L--M

常规的D..M计算是M的祖先的提交集,但排除是D的祖先的提交。这对于查看自D以来导致M的历史记录中发生了什么很有用,从“M拥有什么而D中不存在”的意义上来说。在本例中,结果将是所有提交,除了AB(当然还有D本身)。

但是,当我们想要找出M中哪些提交受D引入的错误污染并需要修复时,我们可能只想查看实际上是D的后代的D..M子集,即排除CK。这正是--ancestry-path选项的作用。应用于D..M范围时,它将产生

		E-------F
		 \       \
		  G---H---I---J
			       \
				L--M

我们还可以使用--ancestry-path=D而不是--ancestry-path,这意味着在应用于D..M范围时含义相同,但只是更明确。

如果我们对该范围内的给定主题及其受影响的所有提交感兴趣,我们可能只想查看其祖先路径中包含该主题的D..M子集。因此,例如,使用--ancestry-path=H D..M将产生

		E
		 \
		  G---H---I---J
			       \
				L--M

--ancestry-path=K D..M将产生

		K---------------L--M

在讨论另一个选项--show-pulls之前,我们需要创建一个新的示例历史记录。

用户在查看简化历史记录时面临的一个常见问题是,他们知道更改了某个文件的提交以某种方式没有出现在该文件的简化历史记录中。让我们演示一个新示例,并展示在这种情况下--full-history--simplify-merges等选项是如何工作的

	  .-A---M-----C--N---O---P
	 /     / \  \  \/   /   /
	I     B   \  R-'`-Z'   /
	 \   /     \/         /
	  \ /      /\        /
	   `---X--'  `---Y--'

对于此示例,假设I创建了file.txt,该文件以不同的方式被ABX修改。单亲提交CZY不会更改file.txt。合并提交M是通过解决合并冲突以包含AB的更改创建的,因此对两者都不是TREESAME。但是,合并提交R是通过忽略Mfile.txt的内容并仅获取Xfile.txt的内容创建的。因此,RX是TREESAME,但对M不是。最后,创建N的自然合并解决方案是获取Rfile.txt的内容,因此NR是TREESAME,但对C不是。合并提交OP对它们的第一个父节点是TREESAME,但对它们的第二个父节点ZY分别不是。

使用默认模式时,NR 都有一个 TREESAME 父节点,因此会遍历这些边,而忽略其他边。生成的提交历史图如下所示:

	I---X

使用 --full-history 时,Git 会遍历每一条边。这将发现提交 AB 以及合并提交 M,还会发现合并提交 OP。使用父节点重写后,生成的图如下所示:

	  .-A---M--------N---O---P
	 /     / \  \  \/   /   /
	I     B   \  R-'`--'   /
	 \   /     \/         /
	  \ /      /\        /
	   `---X--'  `------'

这里,合并提交 OP 引入了额外的噪音,因为它们实际上并没有对 file.txt 进行更改。它们只是合并了一个基于 file.txt 旧版本的主题分支。这在使用许多贡献者并行工作并在单个主干上合并其主题分支的工作流的仓库中是一个常见问题:许多不相关的合并出现在 --full-history 的结果中。

使用 --simplify-merges 选项时,提交 OP 会从结果中消失。这是因为 OP 的重写后的第二个父节点可以从其第一个父节点到达。这些边被移除,然后这些提交看起来就像与父节点 TREESAME 的单亲提交。这也发生在提交 N 上,导致如下所示的提交历史视图:

	  .-A---M--.
	 /     /    \
	I     B      R
	 \   /      /
	  \ /      /
	   `---X--'

在这个视图中,我们看到了来自 ABX 的所有重要的单亲更改。我们还看到了经过精心解决的合并提交 M 和未经仔细解决的合并提交 R。这通常足以确定为什么提交 AB 在默认视图中“消失”了。但是,这种方法也有一些问题。

第一个问题是性能。与之前的任何选项不同,--simplify-merges 选项需要遍历整个提交历史才能返回单个结果。这使得该选项难以用于非常大的仓库。

第二个问题是审计问题。当许多贡献者在同一个仓库中工作时,哪些合并提交将更改引入重要分支非常重要。上面有问题的合并提交 R 不太可能是用于合并到重要分支的合并提交。相反,合并提交 N 用于将 RX 合并到重要分支。此提交可能在其提交消息中包含有关更改 X 为什么会覆盖来自 AB 的更改的信息。

--show-pulls

除了默认历史记录中显示的提交之外,还显示每个与其第一个父节点不为 TREESAME 但与其后续父节点为 TREESAME 的合并提交。

--show-pulls 包含一个合并提交时,该合并被视为从另一个分支“拉取”了更改。在此示例中(以及没有其他选项)使用 --show-pulls 时,生成的图如下所示:

	I---X---R---N

这里,合并提交 RN 被包含在内,因为它们分别将提交 XR 拉取到基础分支。这些合并是提交 AB 不出现在默认历史记录中的原因。

--show-pulls--simplify-merges 配合使用时,该图包含所有必要的信息:

	  .-A---M--.   N
	 /     /    \ /
	I     B      R
	 \   /      /
	  \ /      /
	   `---X--'

注意,由于 M 可以从 R 到达,因此从 NM 的边被简化掉了。但是,N 仍然出现在历史记录中,因为它“拉取”了 R 更改到主分支。

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

二分查找助手

--bisect

将输出限制为大致位于包含的提交和排除的提交之间的中间的单个提交对象。请注意,错误的二分查找引用 refs/bisect/bad 会被添加到包含的提交中(如果存在),而良好的二分查找引用 refs/bisect/good-* 会被添加到排除的提交中(如果存在)。因此,假设 refs/bisect/ 中没有引用,如果

	$ git rev-list --bisect foo ^bar ^baz

输出 midpoint,则以下两个命令的输出

	$ git rev-list foo ^midpoint
	$ git rev-list midpoint ^bar ^baz

长度大致相同。因此,查找引入回归的更改就简化为二分查找:重复生成和测试新的“midpoint”,直到提交链的长度为 1。

--bisect-vars

此选项计算的结果与 --bisect 相同,但它不使用 refs/bisect/ 中的引用,并且输出的文本可以由 shell 进行 eval。这些行将中间修订版的名称赋值给变量 bisect_rev,测试 bisect_rev 后预计要测试的提交数量赋值给 bisect_nr,如果 bisect_rev 证明是好的,则预计要测试的提交数量赋值给 bisect_good,如果 bisect_rev 证明是不好的,则预计要测试的提交数量赋值给 bisect_bad,以及我们现在正在进行二分查找的提交数量赋值给 bisect_all

--bisect-all

此选项输出包含的提交和排除的提交之间的所有提交对象,并按它们到包含的提交和排除的提交的距离排序。它不使用 refs/bisect/ 中的引用。距离最远的提交首先显示。(这是 --bisect 唯一显示的提交。)

这很有用,因为它使您能够轻松选择一个好的提交进行测试,当您想出于某种原因避免测试其中一些提交时(例如,它们可能无法编译)。

此选项可以与 --bisect-vars 一起使用,在这种情况下,在所有排序的提交对象之后,将会有与单独使用 --bisect-vars 时相同的文本。

提交排序

默认情况下,提交按逆时间顺序显示。

--date-order

在显示其所有子节点之前不显示父节点,但在其他情况下,按提交时间戳顺序显示提交。

--author-date-order

在显示其所有子节点之前不显示父节点,但在其他情况下,按作者时间戳顺序显示提交。

--topo-order

在显示其所有子节点之前不显示父节点,并避免在多条历史记录行上显示混合的提交。

例如,在如下所示的提交历史记录中:

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

其中数字表示提交时间戳的顺序,带有 --date-ordergit rev-list 及其相关命令将按时间戳顺序显示提交: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);为了避免显示来自两个并行开发轨道的混合提交,某些较旧的提交会在较新的提交之前显示。

--reverse

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

对象遍历

这些选项主要针对 Git 仓库的打包。

--objects

打印列出的提交引用的任何对象的对象 ID。因此,--objects foo ^bar 表示“如果我有提交对象 bar 但没有 foo,请发送我需要下载的所有对象 ID”。另请参阅下面的 --object-names

--in-commit-order

按提交顺序打印树和 Blob ID。树和 Blob ID 在它们第一次被提交引用后打印。

--objects-edge

类似于 --objects,但还会打印以“ - ”字符为前缀的排除提交的 ID。这被 git-pack-objects[1] 用于构建“瘦”包,该包基于这些排除提交中包含的对象以增量形式记录对象,以减少网络流量。

--objects-edge-aggressive

类似于 --objects-edge,但它会更加努力地查找排除的提交,代价是增加了时间。这用于代替 --objects-edge 为浅层仓库构建“瘦”包。

--indexed-objects

假装索引使用的所有树和 Blob 都在命令行上列出。请注意,您可能也需要使用 --objects

--unpacked

仅在 --objects 中有用;打印不在包中的对象 ID。

--object-names

仅在 --objects 中有用;打印找到的对象 ID 的名称。这是默认行为。请注意,每个对象的“名称”是模棱两可的,主要作为打包对象的提示。特别是:标签、树和 Blob 的名称之间没有区别;路径名可能会被修改以删除换行符;如果一个对象以不同的名称多次出现,则只显示一个名称。

--no-object-names

仅在 --objects 中有用;不打印找到的对象 ID 的名称。这反转了 --object-names。此标志允许输出更容易地被诸如 git-cat-file[1] 之类的命令解析。

--filter=<filter-spec>

仅在 --objects* 中的一个中有用;从打印的对象列表中省略对象(通常是 Blob)。<filter-spec> 可以是以下之一:

表单 --filter=blob:none 省略所有 Blob。

表单 --filter=blob:limit=<n>[kmg] 省略大小至少为 n 字节或单位的 Blob。n 可以为零。后缀 k、m 和 g 可用于命名 KiB、MiB 或 GiB 中的单位。例如,blob:limit=1kblob:limit=1024 相同。

表单 --filter=object:type=(tag|commit|tree|blob) 省略所有不是请求类型的对象。

表单 --filter=sparse:oid=<blob-ish> 使用包含在 Blob(或 Blob 表达式)<blob-ish> 中的稀疏检出规范来省略在请求的引用上稀疏检出不需要的 Blob。

表单--filter=tree:<depth> 会省略所有从根树的深度 >= <depth> 的 Blob 和 Tree(如果对象在遍历的提交中位于多个深度,则为最小深度)。<depth>=0 不会包含任何树或 Blob,除非在命令行(或使用 --stdin 时使用标准输入)中明确包含。<depth>=1 仅包含由从 <commit> 可达的提交或显式给定的对象直接引用的树和 Blob。<depth>=2 类似于 <depth>=1,同时还包括从显式给定的提交或树中再移除一层级的树和 Blob。

请注意,出于安全原因,已删除用于从文件系统上的任意路径读取的表单--filter=sparse:path=<path>

可以指定多个--filter=标志来组合过滤器。仅包含每个过滤器都接受的对象。

表单--filter=combine:<filter1>+<filter2>+…​<filterN> 也可用于组合多个过滤器,但这比简单地重复--filter标志更难,通常没有必要。过滤器由+连接,各个过滤器进行百分号编码(即 URL 编码)。除了+%字符外,以下字符为保留字符,也必须进行编码:~!@#$^&*()[]{}\;",<>?'`以及所有 ASCII 代码 <= 0x20 的字符,包括空格和换行符。

其他任意字符也可以进行编码。例如,combine:tree:3+blob:nonecombine:tree%3A3+blob%3Anone 等效。

--no-filter

关闭任何先前的--filter=参数。

--filter-provided-objects

过滤显式提供的对象列表,否则即使它们与任何过滤器都不匹配,这些对象也会始终被打印。仅在使用--filter=时有用。

--filter-print-omitted

仅在使用--filter=时有用;打印过滤器省略的对象列表。对象 ID 前缀为“~”字符。

--missing=<missing-action>

一个调试选项,用于帮助未来的“部分克隆”开发。此选项指定如何处理缺失的对象。

表单--missing=error 请求 rev-list 在遇到缺失对象时停止并报错。这是默认操作。

表单--missing=allow-any 将允许对象遍历在遇到缺失对象时继续。缺失的对象将被静默地从结果中省略。

表单--missing=allow-promisor 类似于allow-any,但仅允许对预期的承诺者缺失对象继续对象遍历。意外的缺失对象将引发错误。

表单--missing=print 类似于allow-any,但还会打印缺失对象的列表。对象 ID 前缀为“?”字符。

如果传递给遍历的一些提示缺失,它们也将被视为缺失,并且遍历将忽略它们。但是,如果我们无法获取其对象 ID,则会引发错误。

--exclude-promisor-objects

(仅供内部使用。)在承诺者边界处预先过滤对象遍历。这与部分克隆一起使用。这比--missing=allow-promisor更强大,因为它限制了遍历,而不仅仅是使有关缺失对象的错误静音。

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

仅显示给定的提交,但不遍历其祖先。如果指定了范围,则此操作无效。如果给出了参数unsorted,则按命令行上给出的顺序显示提交。否则(如果给出了sorted或未给出参数),则按提交时间按时间倒序显示提交。不能与--graph组合使用。

--do-walk

覆盖先前的--no-walk

提交格式化

使用这些选项,git-rev-list[1] 的行为将类似于更专业的提交日志工具系列:git-log[1]git-show[1]git-whatchanged[1]

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

以给定格式漂亮打印提交日志的内容,其中<format>可以是onelineshortmediumfullfullerreferenceemailrawformat:<string>tformat:<string>。当<format>不是上述任何一种,并且其中包含%placeholder时,它的行为就像给出了--pretty=tformat:<format>一样。

有关每种格式的其他详细信息,请参见“漂亮格式”部分。当省略=<format>部分时,默认为medium

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

--abbrev-commit

不显示完整的 40 字节十六进制提交对象名称,而是显示一个唯一命名对象的“前缀”。"--abbrev=<n>"(如果显示,也会修改 diff 输出)选项可用于指定前缀的最小长度。

这应该使“--pretty=oneline”对于使用 80 列终端的用户来说更易读。

--no-abbrev-commit

显示完整的 40 字节十六进制提交对象名称。这会否定--abbrev-commit,无论是显式还是由其他选项(如 "--oneline")隐式暗示。它还会覆盖log.abbrevCommit变量。

--oneline

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

--encoding=<encoding>

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

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

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

默认情况下,在将日志消息缩进 4 个空格的漂亮格式中会扩展制表符(即medium(默认)、fullfuller)。

--show-signature

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

--relative-date

--date=relative的同义词。

--date=<format>

仅对以人类可读格式显示的日期有效,例如在使用--pretty时。log.date配置变量为 log 命令的--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,除了 %s、%z 和 %Z,它们在内部处理。使用--date=format:%c以系统区域设置的首选格式显示日期。有关格式占位符的完整列表,请参阅strftime手册。使用-local时,正确的语法是--date=format-local:...

--date=default是默认格式,基于 ctime(3) 输出。它显示一行,其中包含星期几的三字母缩写、月份的三字母缩写、日期、以“HH:MM:SS”格式显示的小时-分钟-秒,后跟四位数年份,以及时区信息,除非使用本地时区,例如Thu Jan 1 00:00:00 1970 +0000

--header

以原始格式打印提交内容;每个记录之间用 NUL 字符分隔。

--no-commit-header

抑制包含“commit”和在指定格式之前打印的对象 ID 的标题行。这对内置格式没有影响;只有自定义格式受到影响。

--commit-header

覆盖之前的 --no-commit-header

--parents

还打印提交的父提交(以“commit parent…”的形式)。还启用父重写,请参见上文中的“历史简化”。

--children

还打印提交的子提交(以“commit child…”的形式)。还启用父重写,请参见上文中的“历史简化”。

--timestamp

打印原始提交时间戳。

--left-right

标记提交可从对称差集的哪一侧到达。左侧的提交以 < 为前缀,右侧的提交以 > 为前缀。如果与 --boundary 结合使用,则这些提交以 - 为前缀。

例如,如果您有以下拓扑结构

	     y---b---b  branch B
	    / \ /
	   /   .
	  /   / \
	 o---x---a---a  branch A

您将获得如下输出

	$ git rev-list --left-right --boundary --pretty=oneline A...B

	>bbbbbbb... 3rd on b
	>bbbbbbb... 2nd on b
	<aaaaaaa... 3rd on a
	<aaaaaaa... 2nd on a
	-yyyyyyy... 1st on b
	-xxxxxxx... 1st on a
--graph

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

这将启用父重写,请参见上文中的“历史简化”。

默认情况下,这暗示了 --topo-order 选项,但也可以指定 --date-order 选项。

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

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

--count

打印一个数字,说明将列出多少个提交,并抑制所有其他输出。当与 --left-right 结合使用时,改为打印左右提交的计数,并用制表符分隔。当与 --cherry-mark 结合使用时,从这些计数中省略补丁等效提交,并打印等效提交的计数,并用制表符分隔。

漂亮格式

如果提交是合并提交,并且漂亮格式不是 onelineemailraw,则在 Author: 行之前插入一个额外的行。此行以“Merge: ”开头,并打印祖先提交的哈希值,并用空格分隔。请注意,如果您限制了历史记录的视图,则列出的提交不一定就是**直接**父提交的列表:例如,如果您只对与特定目录或文件相关的更改感兴趣。

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

  • oneline

    <hash> <title-line>

    旨在尽可能简洁。

  • short

    commit <hash>
    Author: <author>
    <title-line>
  • medium

    commit <hash>
    Author: <author>
    Date:   <author-date>
    <title-line>
    <full-commit-message>
  • full

    commit <hash>
    Author: <author>
    Commit: <committer>
    <title-line>
    <full-commit-message>
  • fuller

    commit <hash>
    Author:     <author>
    AuthorDate: <author-date>
    Commit:     <committer>
    CommitDate: <committer-date>
    <title-line>
    <full-commit-message>
  • reference

    <abbrev-hash> (<title-line>, <short-author-date>)

    此格式用于在提交消息中引用另一个提交,与 --pretty='format:%C(auto)%h (%s, %ad)' 相同。默认情况下,日期格式使用 --date=short,除非显式指定了其他 --date 选项。与任何包含格式占位符的 format: 一样,其输出不受其他选项(如 --decorate--walk-reflogs)的影响。

  • email

    From <hash> <date>
    From: <author>
    Date: <author-date>
    Subject: [PATCH] <title-line>
    <full-commit-message>
  • mboxrd

    类似于 email,但提交消息中以“From ”开头的行(前面是零个或多个“>”)用“>”引用,因此不会将其误认为是新提交的开头。

  • raw

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

  • format:<format-string>

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

    例如,format:"The author of %h was %an, %ar%nThe title was >>%s<<%n" 将显示如下内容

    The author of fe6e0ee was Junio C Hamano, 23 hours ago
    The title was >>t4119: test autocomputing -p<n> for traditional diff input.<<

    占位符为

    • 扩展为单个文字字符的占位符

      %n

      换行符

      %%

      原始 %

      %x00

      %x 后跟两位十六进制数字将替换为具有十六进制数字值的字节(在本文档的其余部分,我们将其称为“文字格式代码”)。

    • 影响后续占位符格式的占位符

      %Cred

      将颜色切换为红色

      %Cgreen

      将颜色切换为绿色

      %Cblue

      将颜色切换为蓝色

      %Creset

      重置颜色

      %C(…​)

      颜色规范,如 git-config[1] 的“配置文件”部分中的“值”下所述。默认情况下,仅当为日志输出启用颜色时才会显示颜色(由 color.diffcolor.ui--color 启用,并尊重前者的 auto 设置,如果我们要输出到终端)。%C(auto,...) 作为默认值的旧版本语法被接受(例如,%C(auto,red))。指定 %C(always,...) 将显示颜色,即使未启用颜色(但请考虑只使用 --color=always 来启用整个输出的颜色,包括此格式和 git 可能着色的任何其他内容)。仅使用 auto(即 %C(auto))将在下一个占位符上启用自动着色,直到再次切换颜色。

      %m

      左(<)、右(>)或边界(-)标记

      %w([<w>[,<i1>[,<i2>]]])

      切换换行,类似于 git-shortlog[1] 的 -w 选项。

      %<( <N> [,trunc|ltrunc|mtrunc])

      使下一个占位符至少占用 N 列宽度,如有必要,在右侧填充空格。如果输出超过 N 列,则可选地在左侧 (ltrunc) ..ft、中间 (mtrunc) mi..le 或末尾 (trunc) rig.. 处截断(带省略号 ..)。注意 1:截断仅在 N >= 2 时才能正常工作。注意 2:N 和 M(见下文)值周围的空格是可选的。注意 3:表情符号和其他宽字符将占用两列显示空间,这可能会超出列边界。注意 4:分解字符组合标记可能在填充边界处放置错误。

      %<|( <M> )

      使下一个占位符至少占用到第 M 列显示空间,如有必要,在右侧填充空格。对于从终端窗口右侧边缘测量的列位置,使用负 M 值。

      %>( <N> ), %>|( <M> )

      分别类似于 %<( <N> )%<|( <M> ),但在左侧填充空格

      %>>( <N> ), %>>|( <M> )

      分别类似于 %>( <N> )%>|( <M> ),但如果下一个占位符占用的空间超过给定空间并且其左侧有空格,则使用这些空格

      %><( <N> ), %><|( <M> )

      分别类似于 %<( <N> )%<|( <M> ),但在两侧填充(即文本居中)

    • 扩展为从提交中提取的信息的占位符

      %H

      提交哈希值

      %h

      缩写提交哈希值

      %T

      树哈希值

      %t

      缩写树哈希值

      %P

      父提交哈希值

      %p

      缩写父提交哈希值

      %an

      作者姓名

      %aN

      作者姓名(尊重 .mailmap,请参见 git-shortlog[1]git-blame[1]

      %ae

      作者电子邮件

      %aE

      作者电子邮件(尊重 .mailmap,请参见 git-shortlog[1]git-blame[1]

      %al

      作者电子邮件本地部分(@ 符号之前的部分)

      %aL

      作者本地部分(请参见 %al)尊重 .mailmap,请参见 git-shortlog[1]git-blame[1]

      %ad

      作者日期(格式遵循 --date= 选项)

      %aD

      作者日期,RFC2822 风格

      %ar

      作者日期,相对时间

      %at

      作者日期,UNIX 时间戳

      %ai

      作者日期,类似 ISO 8601 格式

      %aI

      作者日期,严格的 ISO 8601 格式

      %as

      作者日期,短格式(YYYY-MM-DD

      %ah

      作者日期,人类可读格式(类似于 git-rev-list[1]--date=human 选项)

      %cn

      提交者姓名

      %cN

      提交者姓名(遵循 .mailmap,参见 git-shortlog[1]git-blame[1]

      %ce

      提交者邮箱

      %cE

      提交者邮箱(遵循 .mailmap,参见 git-shortlog[1]git-blame[1]

      %cl

      提交者邮箱本地部分(@ 符号之前的部分)

      %cL

      提交者本地部分(参见 %cl)遵循 .mailmap,参见 git-shortlog[1]git-blame[1]

      %cd

      提交者日期(格式遵循 --date= 选项)

      %cD

      提交者日期,RFC2822 风格

      %cr

      提交者日期,相对时间

      %ct

      提交者日期,UNIX 时间戳

      %ci

      提交者日期,类似 ISO 8601 格式

      %cI

      提交者日期,严格的 ISO 8601 格式

      %cs

      提交者日期,短格式(YYYY-MM-DD

      %ch

      提交者日期,人类可读格式(类似于 git-rev-list[1]--date=human 选项)

      %d

      引用名称,类似于 git-log[1] 的 --decorate 选项

      %D

      没有 " ("、 ")" 包裹的引用名称。

      %(decorate[:<options>])

      带有自定义修饰的引用名称。decorate 字符串后面可以跟一个冒号和零个或多个用逗号分隔的选项。选项值可能包含字面格式代码。由于这些代码在选项语法中的作用,因此必须用于逗号 (%x2C) 和右括号 (%x29)。

      • prefix=<value>:显示在引用名称列表之前。默认为 " ("。

      • suffix=<value>:显示在引用名称列表之后。默认为 ")"。

      • separator=<value>:显示在引用名称之间。默认为 ", ".

      • pointer=<value>:显示在 HEAD 及其指向的分支(如果有)之间。默认为 " -> ".

      • tag=<value>:显示在标签名称之前。默认为 "tag: ".

    例如,要生成没有包裹或标签注释的修饰,以及空格作为分隔符

    + %(decorate:prefix=,suffix=,tag=,separator= )

    %(describe[:<options>])

    人类可读的名称,类似于 git-describe[1];对于无法描述的提交,为空字符串。describe 字符串后面可以跟一个冒号和零个或多个用逗号分隔的选项。当标签在同一时间添加或删除时,描述可能不一致。

    • tags[=<bool-value>]:不只考虑带注释的标签,也考虑轻量级标签。

    • abbrev=<number>:不使用默认的十六进制数字位数(根据存储库中对象的个数而变化,默认值为 7)的缩写对象名称,而是使用 <number> 位数字,或形成唯一对象名称所需的尽可能多的数字。

    • match=<pattern>:仅考虑与给定 glob(7) 模式匹配的标签,不包括 "refs/tags/" 前缀。

    • exclude=<pattern>:不考虑与给定 glob(7) 模式匹配的标签,不包括 "refs/tags/" 前缀。

    %S

    命令行上用于到达提交的引用名称(如 git log --source),仅适用于 git log

    %e

    编码

    %s

    主题

    %f

    已清理的主题行,适合用作文件名

    %b

    正文

    %B

    原始正文(未包装的主题和正文)

    %GG

    已签名的提交的 GPG 原始验证消息

    %G?

    对于良好的(有效的)签名显示 "G",对于错误的签名显示 "B",对于有效性未知的良好签名显示 "U",对于已过期的良好签名显示 "X",对于已过期密钥生成的良好签名显示 "Y",对于已吊销密钥生成的良好签名显示 "R",如果签名无法检查(例如缺少密钥)则显示 "E",如果没有签名则显示 "N"

    %GS

    显示已签名的提交的签名者姓名

    %GK

    显示用于签署已签名的提交的密钥

    %GF

    显示用于签署已签名的提交的密钥的指纹

    %GP

    显示其子密钥用于签署已签名的提交的主密钥的指纹

    %GT

    显示用于签署已签名的提交的密钥的信任级别

    %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 主题

    %(trailers[:<options>])

    显示由 git-interpret-trailers[1] 解释的正文的尾部信息。trailers 字符串后面可以跟一个冒号和零个或多个用逗号分隔的选项。如果任何选项被多次提供,则最后出现的选项有效。

    • key=<key>:仅显示指定 <key> 的尾部信息。匹配不区分大小写,尾随冒号是可选的。如果选项多次给出,则显示与任何键匹配的尾部信息行。此选项自动启用 only 选项,以便隐藏尾部信息块中的非尾部信息行。如果不需要这样做,可以通过 only=false 禁用它。例如,%(trailers:key=Reviewed-by) 显示键为 Reviewed-by 的尾部信息行。

    • only[=<bool>]:选择是否应包含尾部信息块中的非尾部信息行。

    • separator=<sep>:指定在尾部信息行之间插入的分隔符。默认为换行符。字符串 <sep> 可能包含上面描述的字面格式代码。要使用逗号作为分隔符,必须使用 %x2C,否则它将被解析为下一个选项。例如,%(trailers:key=Ticket,separator=%x2C ) 显示所有键为 "Ticket" 的尾部信息行,并用逗号和空格分隔。

    • unfold[=<bool>]:使其行为类似于给出了 interpret-trailer 的 --unfold 选项。例如,%(trailers:only,unfold=true) 展开并显示所有尾部信息行。

    • keyonly[=<bool>]:仅显示尾部信息的键部分。

    • valueonly[=<bool>]:仅显示尾部信息的 value 部分。

    • key_value_separator=<sep>:指定在每个尾部信息的键和值之间插入的分隔符。默认为 ": "。否则它与上面的 separator=<sep> 具有相同的语义。

注意
某些占位符可能取决于提供给修订遍历引擎的其他选项。例如,除非我们正在遍历 reflog 条目(例如,通过 git log -g),否则 %g* reflog 选项将插入空字符串。如果命令行上没有提供 --decorate,则 %d%D 占位符将使用 "short" 修饰格式。

布尔选项接受一个可选值 [=<bool-value>]。值 truefalseonoff 等都可接受。请参阅 git-config[1] 中 "EXAMPLES" 中的 "boolean" 子部分。如果布尔选项没有给出值,则启用它。

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

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

如果在占位符的 % 后添加一个 ` `(空格),则当且仅当占位符展开为非空字符串时,会在展开内容之前插入一个空格。

  • tformat

    tformat: 格式的工作方式与 format: 完全相同,只是它提供的是“终止符”语义而不是“分隔符”语义。换句话说,每个提交都会附加消息终止符字符(通常是换行符),而不是在条目之间放置分隔符。这意味着单行格式的最后一个条目将以换行符正确终止,就像“oneline”格式一样。例如

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

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

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

示例

  • 打印当前分支可达的提交列表。

    git rev-list HEAD
  • 打印此分支上的提交列表,但不包括上游分支中的提交。

    git rev-list @{upstream}..HEAD
  • 使用提交作者和提交消息格式化提交(另请参阅瓷器 git-log[1])。

    git rev-list --format=medium HEAD
  • 格式化提交及其差异(另请参阅瓷器 git-log[1],它可以在单个进程中执行此操作)。

    git rev-list HEAD |
    git diff-tree --stdin --format=medium -p
  • 打印当前分支上触及 Documentation 目录中任何文件的提交列表。

    git rev-list HEAD -- Documentation/
  • 打印过去一年中您在任何分支、标签或其他引用上创作的提交列表。

    git rev-list [email protected] --since=1.year.ago --all
  • 打印当前分支可达的对象列表(即所有提交以及它们包含的 blob 和树)。

    git rev-list --objects HEAD
  • 比较所有可达对象、reflog 可达对象和打包总大小的磁盘大小。这可以告诉您运行 git repack -ad 是否可以减小存储库大小(通过删除不可达对象),以及是否可以过期 reflog 来提供帮助。

    # reachable objects
    git rev-list --disk-usage --objects --all
    # plus reflogs
    git rev-list --disk-usage --objects --all --reflog
    # total disk size used
    du -c .git/objects/pack/*.pack .git/objects/??/*
    # alternative to du: add up "size" and "size-pack" fields
    git count-objects -v
  • 报告每个分支的磁盘大小,不包括当前分支使用的对象。这可以找到导致存储库大小膨胀的异常值(例如,因为有人意外提交了大型构建工件)。

    git for-each-ref --format='%(refname)' |
    while read branch
    do
    	size=$(git rev-list --disk-usage --objects HEAD..$branch)
    	echo "$size $branch"
    done |
    sort -n
  • 比较一组引用中分支的磁盘大小,排除另一组引用。如果您在一个存储库中混合了来自多个远程存储库的对象,这可以显示哪些远程存储库导致了存储库大小(以 origin 的大小为基准)。

    git rev-list --disk-usage --objects --remotes=$suspect --not --remotes=origin

Git

git[1] 套件的一部分

scroll-to-top