## 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/heads`，`refs/tags`或`refs/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 条目从最近的一条走到更旧的条目。当使用此选项，你不能指定提交排除（也就是`^commit`，`commit1..commit2`和`commit1...commit2`符号不能使用）。

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

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

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

3. 如果两者都未使用，但`--date`已在命令行中提供，请按照要求的格式显示时间戳`--date`。

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

- 在此之下`--pretty=oneline`，提交消息在同一行上以此信息为前缀。该选项不能与`--reverse`。另请参阅 git-reflog [1]。

--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..commit2`或`commit2 ^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。

- 在中`A`，`foo`只包含“foo”。

- `B`包含与。相同的更改`A`。它的合并`M`是微不足道的，因此 TREESAME 给所有的父母。

- `C`不会更改`foo`，但其合并`N`会将其更改为“foobar”，因此对于任何父级，它不是 TREESAME。

- `D`设置`foo`为“baz”。它的合并`O`将来自`N`和`D`来自“foobarbaz” 的字符串结合起来; 即，它不是任何父母的 TREESAME。

- `E`更改`quux`为“xyzzy”，并将其合并`P`为“quux xyzzy”。`P`是TREESAME `O`，但不是`E`。

- `X`是一个独立的根提交，添加了一个新文件`side`并对其进行了`Y`修改。`Y`是TREESAME `X`。它的合并`Q`添加`side`到`P`，并且`Q`是TREESAME `P`，但不是`Y`。

`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`被排除在外，因为它对父母都是 TREESAME。`E`，`C`并且`B`都走了，但只能`B`是！TREESAME，所以别人不出现。

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

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

普通提交只包含在！TREESAME（尽管可以改变，见`--sparse`下文）。

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

              .-A---M---N---O---P---Q         /     /   /   /   /

            I     B   /   D   /

             \   /   /   /   /

              `-------------'

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

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

--dense

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

--sparse

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

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

--simplify-merges

首先，`--full-history`用父级重写的方式构建一个历史图（参见上文）。

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

- 设置`C'`为`C`。

- 替换每个家长`P`的`C'`其简化`P'`。在这个过程中，放弃其他父母祖先或父母的父母将 TREESAME 提交给空树，并删除重复项，但请注意永不丢弃所有我们正在处理的父母。

- 如果在此父代重写之后，`C'`是根或合并提交（具有零或> 1父项），边界提交或！TREESAME，它仍然存在。否则，它将被其唯一的父代替换。

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

              .-A---M---N---O         /     /       /

            I     B       D

             \   /       /

              `---------'

请注意，在重大分歧`N`，`P`以及`Q`在`--full-history`：

- `N`的父母名单已`I`被删除，因为它是另一父母的祖先`M`。仍然，`N`因为它是！ TREESAME。

- `P`的父母名单也被`I`删除。`P`然后被完全删除，因为它有一个父母，并且是 TREESAME。

- `Q`的父母名单已`Y`简化为`X`。`X`然后被删除，因为它是一个 TREESAME 根。`Q`然后被完全删除，因为它有一个父母，并且是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`”。在这个例子中的结果将是所有提交，除了`A`和`B`（与`D`本身，当然）。

但是，当我们想要查明哪些提交`M`受到引入`D`并需要修复的bug的影响时，我们可能只想查看其`D..M`实际后代的子集`D`，即排除`C`和`K`。这正是`--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`，这是缺省值，`full`和`fuller`）。

--show-signature

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

--relative-date

`--date=relative`的同义词。

--date=<format>

仅对以人可读格式显示的日期生效，例如在使用时`--pretty`。`log.date`config变量为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的偏移量（a `+`或`-`四位数;前两个是小时，并且第二个是分钟）。即，如果时间戳被格式化`strftime("%s %z")`）。请注意，该`-local`选项不会影响自始至终的秒数值（始终以UTC来衡量），但会切换随附的时区值。

- `--date=unix`将日期显示为Unix纪元时间戳（1970年以来的秒数）。与之相同`--raw`，这总是以UTC表示，因此`-local`不起作用。

- `--date=format:...`将格式输入`...`到系统中`strftime`，除了内部处理的％z和％Z之外。用于`--date=format:%c`以系统区域设置的首选格式显示日期。请参阅`strftime`手册以获取格式占位符的完整列表。使用时`-local`，正确的语法是`--date=format-local:...`。

- `--date=default`是默认格式，类似于`--date=rfc2822`，但有一些例外：

- 星期几之后没有逗号

- 使用本地时区时省略时区

--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`这些计数一起使用时，省略补丁等价提交，并打印由选项卡分隔的等价提交的计数。

## 漂亮的格式

如果提交是合并，并且不是美观格式`oneline`，`email`或者`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>

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

- `format:<string>` 该`format:<string>`格式允许您指定要显示的信息。它的工作原理与 printf 格式有点相似，但有一个值得注意的例外，那就是用换行符`%n`代替`\n`。例如，`format:"The author of %h was %an, %ar%nThe title was >>%s<<%n"`会显示这样的内容：fe6e0ee 的作者是 Junio C Hamano，23小时前标题是>> t4119：测试 autocomputing -p <n>用于传统差异输入。<<

占位符是：

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