在线文档教程

git rev-list

git-rev-list

Name

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

概要

git rev-list [ --max-count=<number> ] [ --skip=<number> ] [ --max-age=<timestamp> ] [ --min-age=<timestamp> ] [ --sparse ] [ --merges ] [ --no-merges ] [ --min-parents=<number> ] [ --no-min-parents ] [ --max-parents=<number> ] [ --no-max-parents ] [ --first-parent ] [ --remove-empty ] [ --full-history ] [ --not ] [ --all ] [ --branches[=<pattern>] ] [ --tags[=<pattern>] ] [ --remotes[=<pattern>] ] [ --glob=<glob-pattern> ] [ --ignore-missing ] [ --stdin ] [ --quiet ] [ --topo-order ] [ --parents ] [ --timestamp ] [ --left-right ] [ --left-only ] [ --right-only ] [ --cherry-mark ] [ --cherry-pick ] [ --encoding=<encoding> ] [ --(author|committer|grep)=<pattern> ] [ --regexp-ignore-case | -i ] [ --extended-regexp | -E ] [ --fixed-strings | -F ] [ --date=<format>] [ [ --objects | --objects-edge | --objects-edge-aggressive ] [ --unpacked ] ] [ --pretty | --header ] [ --bisect ] [ --bisect-vars ] [ --bisect-all ] [ --merge ] [ --reverse ] [ --walk-reflogs ] [ --no-walk ] [ --do-walk ] [ --count ] [ --use-bitmap-index ] <commit>…​ [ -- <paths>…​ ]

描述

通过跟踪parent来自给定提交的链接可以访问的列表提交,但排除可从其^前面提供的提交可访问的提交。默认情况下,输出按照时间倒序排列。

你可以把它看作一个集合操作。在命令行中提交的提交形成了一组可从其中任何一个可访问的提交,然后^从该集合中减去前面给出的任何提交的提交。其余的提交是命令输出中的内容。可以使用各种其他选项和路径参数来进一步限制结果。

因此,下面的命令:

$ git rev-list foo bar ^baz

意思是“列出所有可从foo或可获取的提交bar,但不能从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 bisect和的命令使用git repack

选项

提交限制

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

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

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

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

限制提交输出的数量。

--skip=<number>

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

--since=<date> --after=<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

在查看合并提交后,只跟踪第一个父提交。当查看特定主题分支的演变时,此选项可以提供更好的概述,因为合并到主题分支往往只是适应不断更新的上游时间,并且此选项允许您忽略单独提交到你的历史通过这样的合并。不能与--bisect结合使用。

--not

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

--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匹配的ref <glob-pattern>都在命令行中列出<commit>。领导refs/,如果失踪,会自动添加前缀。如果模式没有?,*或者[,/*在结束时暗示。

--exclude=<glob-pattern>

不包括裁判匹配<glob-pattern>,未来--all,--branches,--tags,--remotes,或--glob原本考虑。这个选项排除累积模式到下一个的重复--all,--branches,--tags,--remotes,或--glob选择(其他选项或参数不清除积累的模式)。

给予不应该开始的模式refs/headsrefs/tagsrefs/remotes当应用到--branches--tags--remotes分别,他们必须开始refs/在应用于--glob--all。如果尾随/*是有意的,则必须明确给出。

--reflog

假设所有reflog提到的对象都在命令行中列为<commit>。

--ignore-missing

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

--stdin

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

--quiet

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

--cherry-mark

--cherry-pick(见下文)但标记等价提交=而不是省略它们,以及不等价的提交+

--cherry-pick

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

例如,如果您有两个分支,A并且B只列出所有提交的常用方法--left-right(请参阅下面的--left-right选项说明中的示例)。但是,它显示了从其他分支樱桃挑选的提交(例如,可能会从分支A挑选“b上的第3个分支”)。使用这个选项,这样的提交对将从输出中排除。

--left-only --right-only

列表仅在对称差异的相应侧提交,即只有那些将被标记<为resp的列表。>通过--left-right。

例如,--cherry-pick --right-only A...B省略了那些从提交B其在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符号不能使用)。

凭借--pretty比其他格式oneline(原因很明显),这将导致输出有从引用日志信息采取两个额外的线路。输出中的reflog指示符可能会显示为ref@{Nth}(其中Nth是 reflog 中的反向按时间顺序的索引)或者ref@{timestamp}(具有该条目的时间戳),具体取决于以下几条规则:

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

--merge

合并失败后,显示引用文件有冲突并且不存在于所有合并头上。

--boundary

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

--use-bitmap-index

尝试使用pack位图索引加速遍历(如果有可用的话)。请注意,遍历时--objects,树和斑点不会打印其相关路径。

--progress=<header>

在考虑对象时显示stderr的进度报告。该<header>文本将印有各自的最新进展。

历史简化

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

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

<paths>

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

--simplify-by-decoration

由某个分支或标签引用的提交被选中。

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

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

默认模式

将历史简化为解释树的最终状态的最简单历史记录。最简单的,因为如果最终结果是相同的(即合并具有相同内容的分支)

--full-history

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

--dense

只显示选定的提交,另外一些提供有意义的历史记录。

--sparse

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

--simplify-merges

附加选项可--full-history从结果历史记录中删除一些不必要的合并,因为没有选定的提交对此合并作出贡献。

--ancestry-path

当给定一系列提交显示(例如commit1..commit2commit2 ^commit1)时,仅显示直接存在于commit1和之间的祖先链上的commit2提交,即提交都是后代commit1,以及祖先commit2

更详细的解释如下。

假设你指定foo为<路径>。我们将调用修改的提交foo!TREESAME 和其余的 TREESAME。(在diff过滤后foo,它们分别看起来不同且相等。)

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

.-A---M---N---O---P---Q / / / / / / I B C D E Y \ / / / / / `-------------' X

历史A --- Q的水平线被认为是每个合并的第一个父代。提交是:

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

rev-list向后浏览历史记录,包括或不包括基于是否--full-history和/或父重写(通过--parents--children)使用的提交。以下设置可用。

默认模式

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

这导致:

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

请注意,只有遵循 TREESAME父级(如果有)的规则B完全从考虑中移除。C被认为是通过N,但是是 TREESAME。根提交与空树比较,所以I是!TREESAME。

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

- 没有父母重写的完整历史记录

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

I A B N D O P Q

M被排除在外,因为它对父母都是 TREESAMEEC并且B都走了,但只能B是!TREESAME,所以别人不出现。

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

- 父母重写的完整历史记录

普通提交只包含在!TREESAME(尽管可以改变,见--sparse下文)。

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

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

比较--full-history上面没有重写。请注意,E因为它是 TREESAME 而被删除,但P的父列表被重写为包含E父项I。同样的事情发生了CN,和XYQ

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

--dense

如果他们不是TREESAME给任何父母,那么被散步的提交将被包括在内。

--sparse

包括所有正在散步的提交。

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

--simplify-merges

首先,--full-history用父级重写的方式构建一个历史图(参见上文)。

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

  • 设置C'C

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

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

请注意,在重大分歧NP以及Q--full-history

  • N的父母名单已I被删除,因为它是另一父母的祖先M。仍然,N因为它是! TREESAME。

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

--ancestry-path

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

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

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

一个常规D..M计算的是一组祖先的提交M,但不包括那些祖先的提交D。这对于了解发生在历史上的事情是有用的,M因为D“有什么不M存在D”。在这个例子中的结果将是所有提交,除了AB(与D本身,当然)。

但是,当我们想要查明哪些提交M受到引入D并需要修复的bug的影响时,我们可能只想查看其D..M实际后代的子集D,即排除CK。这正是--ancestry-path选项所做的。适用D..M范围,它导致:

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

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

平分帮手

--bisect

将输出限制为一个提交对象,该提交对象大致位于提交和排除提交之间的一半。请注意,坏的等分ref会refs/bisect/bad被添加到包含的提交(如果存在)并且好的等分ref refs/bisect/good-*被添加到排除的提交(如果存在)。因此,假设没有参考refs/bisect/,如果

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

输出midpoint,这两个命令的输出

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

长度大致相同。找到引入回归的变化因此被简化为二分搜索:重复生成并测试新的中点,直到提交链的长度为1。不能与--first-parent结合使用。

--bisect-vars

--bisect除了refs/bisect/没有使用refs in之外,它的计算方法与之相同,除了输出的文本已准备好被shell评估。这些行将为变量指定中点修订的名称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---

其中数字表示提交时间戳的顺序,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); 一些较旧的提交显示在较新的提交之前,以避免将来自两条并行开发轨道的提交显示在一起。

--reverse

以相反的顺序输出选择显示的提交(参见上面的提交限制部分)。不能与之结合--walk-reflogs

对象遍历

这些选项主要针对包装Git存储库。

--objects

打印列出的提交引用的任何对象的对象ID。--objects foo ^bar因此意味着“如果我有提交对象bar但不是我需要下载的所有对象ID foo”。

--objects-edge

--objects与之类似,但也会打印以“ - ”字符为前缀的排除提交的ID。git-pack-objects [1]使用它来构建一个“精简”包,它基于这些排除的提交中包含的对象以分离形式记录对象,以减少网络流量。

--objects-edge-aggressive

--objects-edge与之类似,但它试图以增加时间为代价寻找被排除的提交。这被用来代替--objects-edge浅存储库构建“瘦”包。

--indexed-objects

假设索引使用的所有树和斑点都列在命令行上。请注意,您可能也想使用--objects

--unpacked

只用于--objects; 打印不在包装中的对象ID。

--no-walk=(sorted|unsorted)

只显示给定的提交,但不要遍历其祖先。如果指定了范围,则这不起作用。如果提供了参数unsorted,则提交按照它们在命令行上的顺序显示。否则(如果sorted或没有给出参数),提交时间将按提交时间以反向时间顺序显示。不能与之结合--graph

--do-walk

Overrides a previous --no-walk.

提交格式

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

--pretty=<format> --format=<format>

在给定的格式漂亮地打印提交日志中的内容,在这里<format>可以是一个oneline,short,medium,full,fuller,email,raw,format:<string>和tformat:<string>。什么时候<format>没有上述情况,并且%placeholder在其中,它的行为就像--pretty=tformat:<format>是给予的一样。

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

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

--abbrev-commit

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

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

--no-abbrev-commit

显示完整的40字节十六进制提交对象名称。这种否定--abbrev-commit和暗示它的选项如“--oneline”。它也覆盖log.abbrevCommit变量。

--oneline

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

--encoding=<encoding>

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

--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>

仅对以人可读格式显示的日期生效,例如在使用时--prettylog.dateconfig变量为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格式的时间戳,通常在电子邮件中找到。

--header

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

--parents

也打印提交的父母(以“commit parent ...”的形式)。还允许父级重写,请参见History Simplification下文。

--children

也打印提交的子代(以“commit child ...”的形式)。还允许父级重写,请参见History Simplification下文。

--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

这可以让父母重写,见History Simplification下文。

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

--show-linear-break=<barrier>

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

--count

打印一个数字,说明有多少提交将被列出,并禁止所有其他输出。与其一起使用时--left-right,将打印左侧和右侧提交的计数,并用制表符分隔。与--cherry-mark这些计数一起使用时,省略补丁等价提交,并打印由选项卡分隔的等价提交的计数。

漂亮的格式

如果提交是合并,并且不是美观格式onelineemail或者raw在该Author:行之前插入额外的线条。该行以“Merge:”开始,并且祖先提交的sha1被打印出来,用空格分隔。请注意,如果您限制了对历史的查看,列出的提交可能不一定是直接父提交的列表:例如,如果您只对与某个目录或文件相关的更改感兴趣。

有几种内置格式,你可以通过设置一个漂亮的<name> config选项来定义其他格式format:,如下所述(参见git-config [1])。以下是内置格式的详细信息:

  • oneline <sha1> <title line>

这被设计得尽可能紧凑。

  • short commit <sha1> Author: <author>

<title line>

  • medium commit <sha1> Author: <author> Date: <author date>

<title line>

<full commit message>

  • full commit <sha1> Author: <author> Commit: <committer>

<title line>

<full commit message>

  • fuller commit <sha1> Author: <author> AuthorDate: <author date> Commit: <committer> CommitDate: <committer date>

<title line>

<full commit message>

  • email From <sha1> <date> From: <author> Date: <author date> Subject: PATCH <title line>

<full commit message>

  • rawraw格式示出了整个提交完全一样存储在 commit 对象。值得注意的是,不管是否使用--abbrev 或 --no-abbrev,SHA-1 都会全部显示,并且parents信息显示的是真正的父提交,而不考虑移植或历史简化。请注意,这种格式会影响提交显示的方式,但不会影响比较显示的方式git log --raw。要以原始差异格式获取完整对象名称,请使用--no-abbrev

占位符是:

- `%H`: commit hash

- `%h`: abbreviated commit hash

- `%T`: tree hash

- `%t`: abbreviated tree hash

- `%P`: parent hashes

- `%p`: abbreviated parent hashes

- `%an`: author name

- `%aN`: author name (respecting .mailmap, see [git-shortlog[1]](git-shortlog) or [git-blame[1]](git-blame))

- `%ae`: author email

- `%aE`: author email (respecting .mailmap, see [git-shortlog[1]](git-shortlog) or [git-blame[1]](git-blame))

- `%ad`: author date (format respects --date= option)

- `%aD`: author date, RFC2822 style

- `%ar`: author date, relative

- `%at`: author date, UNIX timestamp

- `%ai`: author date, ISO 8601-like format

- `%aI`: author date, strict ISO 8601 format

- `%cn`: committer name

- `%cN`: committer name (respecting .mailmap, see [git-shortlog[1]](git-shortlog) or [git-blame[1]](git-blame))

- `%ce`: committer email

- `%cE`: committer email (respecting .mailmap, see [git-shortlog[1]](git-shortlog) or [git-blame[1]](git-blame))

- `%cd`: committer date (format respects --date= option)

- `%cD`: committer date, RFC2822 style

- `%cr`: committer date, relative

- `%ct`: committer date, UNIX timestamp

- `%ci`: committer date, ISO 8601-like format

- `%cI`: committer date, strict ISO 8601 format

- `%d`: ref names, like the --decorate option of [git-log[1]](git-log)

- `%D`: ref names without the " (", ")" wrapping.

- `%e`: encoding

- `%s`: subject

- `%f`: sanitized subject line, suitable for a filename

- `%b`: body

- `%B`: raw body (unwrapped subject and body)

- `%GG`: raw verification message from GPG for a signed commit

- `%G?`: show "G" for a good (valid) signature, "B" for a bad signature, "U" for a good signature with unknown validity, "X" for a good signature that has expired, "Y" for a good signature made by an expired key, "R" for a good signature made by a revoked key, "E" if the signature cannot be checked (e.g. missing key) and "N" for no signature

- `%GS`: show the name of the signer for a signed commit

- `%GK`: show the key used to sign a signed commit

- `%gD`: reflog selector, e.g., `refs/stash@{1}` or `refs/stash@{2 minutes ago`}; the format follows the rules described for the `-g` option. The portion before the `@` is the refname as given on the command line (so `git log -g refs/heads/master` would yield `refs/heads/master@{0}`).

- `%gd`: shortened reflog selector; same as `%gD`, but the refname portion is shortened for human readability (so `refs/heads/master` becomes just `master`).

- `%gn`: reflog identity name

- `%gN`: reflog identity name (respecting .mailmap, see [git-shortlog[1]](git-shortlog) or [git-blame[1]](git-blame))

- `%ge`: reflog identity email

- `%gE`: reflog identity email (respecting .mailmap, see [git-shortlog[1]](git-shortlog) or [git-blame[1]](git-blame))

- `%gs`: reflog subject

- `%Cred`: switch color to red

- `%Cgreen`: switch color to green

- `%Cblue`: switch color to blue

- `%Creset`: reset color

- `%C(…​)`: color specification, as described under Values in the "CONFIGURATION FILE" section of [git-config[1]](git-config). By default, colors are shown only when enabled for log output (by `color.diff`, `color.ui`, or `--color`, and respecting the `auto` settings of the former if we are going to a terminal). `%C(auto,...)` is accepted as a historical synonym for the default (e.g., `%C(auto,red)`). Specifying `%C(always,...) will show the colors even when color is not otherwise enabled (though consider just using &grave;--color=always` to enable color for the whole output, including this format and anything else git might color). `auto` alone (i.e. `%C(auto)`) will turn on auto coloring on the next placeholders until the color is switched again.

- `%m`: left (`<`), right (`>`) or boundary (`-`) mark

- `%n`: newline

- `%%`: a raw `%`

- `%x00`: print a byte from a hex code

- `%w([<w>[,<i1>[,<i2>]]])`: switch line wrapping, like the -w option of [git-shortlog[1]](git-shortlog).

- `%<(<N>[,trunc|ltrunc|mtrunc])`: make the next placeholder take at least N columns, padding spaces on the right if necessary. Optionally truncate at the beginning (ltrunc), the middle (mtrunc) or the end (trunc) if the output is longer than N columns. Note that truncating only works correctly with N >= 2.

- `%<|(<N>)`: make the next placeholder take at least until Nth columns, padding spaces on the right if necessary

- `%>(<N>)`, `%>|(<N>)`: similar to `%<(<N>)`, `%<|(<N>)` respectively, but padding spaces on the left

- `%>>(<N>)`, `%>>|(<N>)`: similar to `%>(<N>)`, `%>|(<N>)` respectively, except that if the next placeholder takes more spaces than given and there are spaces on its left, use those spaces

- `%><(<N>)`, `%><|(<N>)`: similar to `% <(<N>)`, `%<|(<N>)` respectively, but padding both sides (i.e. the text is centered)

- %(trailers): display the trailers of the body as interpreted by [git-interpret-trailers[1]](git-interpret-trailers)

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

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

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

如果在%占位符之后添加(空格),当且仅当占位符展开为非空字符串时,才在扩展之前插入空格。

  • tformat:tformat:格式的操作完全相同format:,不同之处在于它提供了“终结者”的语义,而不是“分隔符”的语义。换句话说,每个提交都附加了消息结束符(通常是一个换行符),而不是放置在条目之间的分隔符。这意味着单行格式的最终​​条目将以新的行正确终止,就像“在线”格式一样。例如:$ git log -2 --pretty = format:%h 4da45bef \ | perl -pe'$ _。=“ - NO NEWLINE \ n”除非/ \ n /'4da45be 7134973 - 否NEWLINE $ git log -2 --pretty = tformat:%h 4da45bef \ | perl -pe'$ _。=“ - NO NEWLINE \ n”除非/ \ n /'4da45be 7134973

另外,任何含有%它的无法识别的字符串都会被解释为tformat:在它之前。例如,这两个是等价的:

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