Skip to content

git-log

显示提交日志。

概要

bash
git log [<options>] [<revision-range>] [[--] <path>...]

描述

显示提交日志。

列出从给定提交开始通过 parent 链接可达的提交,但排除以 '{caret}' 为前缀给出的提交可达的提交。默认以逆时间顺序输出。

您可以将此视为集合操作。从命令行上给出的任何提交可达的提交形成一个集合,然后从以 '{caret}' 为前缀给出的任何提交可达的提交从该集合中减去。剩余的提交就是命令输出的内容。各种其他选项和路径参数可用于进一步限制结果。

因此,以下命令:

$ git log foo bar ^baz

表示"列出从 'foo' 或 'bar' 可达但不从 'baz' 可达的所有提交"。

特殊表示法 "<commit1>..<commit2>" 可用作 "^<commit1> <commit2>" 的简写。例如,以下两种方式可以互换使用:

$ git log origin..HEAD
$ git log HEAD ^origin

另一种特殊表示法是 "<commit1>...<commit2>",这对合并很有用。结果提交集是两个操作数之间的对称差异。以下两个命令是等效的:

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

该命令接受适用于 git-rev-list(1) 命令的选项来控制显示什么以及如何显示,以及适用于 git-diff(1) 命令的选项来控制每个提交引入的更改如何显示。

选项

基本选项

--follow

:继续列出文件的历史,超出重命名范围(仅适用于单个文件)。

--no-decorate

--decorate[=(short|full|auto|no)]:打印显示的任何提交的引用名称。可能的值为:

  • short:不打印引用名称前缀 refs/heads/refs/tags/refs/remotes/
  • full:打印完整的引用名称(包括前缀)。
  • auto:如果输出将发送到终端,引用名称显示为给出 short 时的样子,否则不显示引用名称。 --decorate 选项是 --decorate=short 的简写。如果配置了 log.decorate 则默认为配置值,否则为 auto

--decorate-refs=<pattern>

--decorate-refs-exclude=<pattern>:对于每个候选引用,如果它匹配传递给 --decorate-refs-exclude 的任何 <pattern> 参数或不匹配传递给 --decorate-refs 的任何 <pattern> 参数,则不将其用于装饰。log.excludeDecoration 配置选项允许从装饰中排除引用,但显式的 --decorate-refs 模式将覆盖 log.excludeDecoration 中的匹配。 如果未给出这些选项或配置设置,则引用在匹配 HEADrefs/heads/refs/remotes/refs/stash/refs/tags/ 时用作装饰。

--clear-decorations

:指定时,此选项清除所有之前的 --decorate-refs--decorate-refs-exclude 选项,并放宽默认装饰过滤器以包含所有引用。如果配置值 log.initialDecorationSet 设置为 all,则假定此选项。

--source

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

--mailmap

--no-mailmap--use-mailmap--no-use-mailmap:使用 mailmap 文件将作者和提交者名称及电子邮件地址映射到规范的真实名称和电子邮件地址。参见 git-shortlog(1)

--full-diff

:没有此标志时,git log -p <path>... 显示触及指定路径的提交,以及关于相同指定路径的差异。使用此选项时,显示触及指定路径的提交的完整差异;这意味着 "<path>..." 仅限制提交,不限制这些提交的差异。 请注意,这会影响所有基于差异的输出类型,例如由 --stat 等产生的输出。

--log-size

:在输出中为每个提交包含一行 log size <number>,其中 <number> 是该提交消息的长度(以字节为单位)。旨在通过允许工具预先分配空间来加速从 git log 输出读取消息的工具。

-L<start>,<end>:<file>

-L:<funcname>:<file>:跟踪由 <start>,<end> 或函数名正则表达式 <funcname> 给出的 <file> 内的行范围的演变。您不能给出任何 pathspec 限制器。目前仅限于从单个修订开始的遍历,即您只能给出零个或一个正修订参数,且 <start><end>(或 <funcname>)必须存在于起始修订中。您可以多次指定此选项。隐含 --patch。可以使用 --no-patch 抑制补丁输出,但其他差异格式(即 --raw--numstat--shortstat--dirstat--summary--name-only--name-status--check)目前未实现。 支持补丁格式选项如 --word-diff--color-moved--no-prefix 和空白选项(-w-b),以及 pickaxe 选项(-S-G)。 <start><end> 可以采用以下形式之一:

  • <number>:如果 <start><end> 是数字,它指定绝对行号(行从 1 开始计数)。
  • /<regex>/:此形式将使用匹配给定 POSIX <regex> 的第一行。如果 <start> 是正则表达式,它将从前一个 -L 范围的末尾(如果有)开始搜索,否则从文件开头搜索。如果 <start>^/<regex>/,它将从文件开头搜索。如果 <end> 是正则表达式,它将从 <start> 给出的行开始搜索。
  • +<offset>-<offset>:这仅对 <end> 有效,将指定 <start> 给出的行之前或之后的行数。 如果给出 :<funcname> 代替 <start><end>,它是一个正则表达式,表示从匹配 <funcname> 的第一个 funcname 行到下一个 funcname 行的范围。:<funcname> 从前一个 -L 范围的末尾(如果有)开始搜索,否则从文件开头搜索。^:<funcname> 从文件开头搜索。函数名的确定方式与 git diff 确定补丁块头的方式相同(参见 gitattributes(5) 中的"定义自定义块头")。

提交限制

除了使用描述中解释的特殊表示法指定要列出的提交范围外,还可以应用额外的提交限制。

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

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

-<number>

-n <number>--max-count=<number>:将输出限制为 <number> 个提交。

--skip=<number>

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

--since=<date>

--after=<date>:显示比 <date> 更新的提交。

--since-as-filter=<date>

:显示比 <date> 更新的所有提交。这会访问范围内的所有提交,而不是在第一个比 <date> 旧的提交处停止。

--until=<date>

--before=<date>:显示比 <date> 旧的提交。

--author=<pattern>

--committer=<pattern>:将提交输出限制为作者/提交者头行匹配 <pattern> 正则表达式的提交。有多个 --author=<pattern> 时,选择作者匹配任何 <pattern> 的提交(类似地用于多个 --committer=<pattern>)。

--grep-reflog=<pattern>

:将提交输出限制为引用日志条目匹配 <pattern> 正则表达式的提交。有多个 --grep-reflog 时,选择引用日志消息匹配任何给定模式的提交。除非使用 --walk-reflogs,否则使用此选项是错误的。

--grep=<pattern>

:将提交输出限制为日志消息匹配 <pattern> 正则表达式的提交。有多个 --grep=<pattern> 时,选择消息匹配任何 <pattern> 的提交(但请参阅 --all-match)。 当 --notes 生效时,来自注释的消息将被匹配,就好像它是日志消息的一部分一样。

--all-match

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

--invert-grep

:将提交输出限制为日志消息不匹配 --grep=<pattern> 指定的 <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

:查找要包含的提交时,在看到合并提交时仅跟随第一个父提交。此选项在查看特定主题分支的演变时可以提供更好的概览,因为合并到主题分支往往只是不时调整以适应更新的上游,此选项允许您忽略此类合并引入到您的历史中的各个提交。 此选项还将合并提交的默认差异格式更改为 first-parent,详见 --diff-merges=first-parent

--exclude-first-parent-only

:查找要排除的提交时(使用 '{caret}'),在看到合并提交时仅跟随第一个父提交。这可用于查找主题分支中从它与远程分支分叉出来的点开始的更改集,前提是任意合并可以是有效的主题分支更改。

--maximal-only

:将输出提交限制为不可达自修订范围中任何其他提交的提交。

--not

:反转所有后续修订说明符的 '{caret}' 前缀(或缺少前缀)的含义,直到下一个 --not。在命令行上 --stdin 之前使用时,通过 stdin 传递的修订不受影响。反之,通过标准输入传递时,命令行上传递的修订不受影响。

--all

:假装 refs/ 下的所有引用以及 HEAD 都作为 <commit> 列在命令行上。

--branches[=<pattern>]

:假装 refs/heads 中的所有引用都作为 <commit> 列在命令行上。如果给出 <pattern>,将分支限制为匹配给定 shell glob 的分支。如果 <pattern> 缺少 '?'、'{asterisk}' 或 '[',则隐含末尾的 '/{asterisk}'。

--tags[=<pattern>]

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

--remotes[=<pattern>]

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

--glob=<glob-pattern>

:假装匹配 shell glob <glob-pattern> 的所有引用都作为 <commit> 列在命令行上。如果缺少则自动在前面加上 'refs/'。如果模式缺少 '?'、'{asterisk}' 或 '[',则隐含末尾的 '/{asterisk}'。

--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/ 开头。如果打算使用尾随 '/{asterisk}',必须显式给出。

--exclude-hidden=(fetch|receive|uploadpack)

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

--reflog

:假装引用日志中提到的所有对象都作为 <commit> 列在命令行上。

--alternate-refs

:假装作为备用仓库引用提示提到的所有对象都列在命令行上。备用仓库是对象目录在 objects/info/alternates 中指定的任何仓库。包含的对象集可由 core.alternateRefsCommand 等修改。参见 git-config(1)

--single-worktree

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

--ignore-missing

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

--stdin

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

--cherry-mark

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

--cherry-pick

:当提交集受对称差异限制时,省略引入与"另一侧"上另一个提交相同更改的任何提交。 例如,如果您有两个分支 AB,列出仅在一侧的所有提交的常用方式是使用 --left-right(请参阅下面 --left-right 选项描述中的示例)。但是,它显示从另一个分支精选的提交(例如 "3rd on b" 可能是从分支 A 精选的)。使用此选项时,此类提交对将从输出中排除。

--left-only

--right-only:仅列出对称差异相应一侧的提交,即仅列出会被 --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:不是遍历提交祖先链,而是从最新的引用日志条目遍历到较旧的条目。使用此选项时,您不能指定要排除的提交(即不能使用 ^<commit><commit1>..<commit2><commit1>...<commit2> 表示法)。 使用 onelinereference 以外的 --pretty 格式时,这会导致输出有两行额外的信息取自引用日志。输出中的引用日志指示符可能显示为 ref@{<Nth>}(其中 <Nth> 是引用日志中的逆时间索引)或 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

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

历史简化

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

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

<paths>

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

--simplify-by-decoration

:选择被某个分支或标签引用的提交。 请注意,可能会显示额外的提交以提供有意义的历史。

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

Default mode

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

--show-pulls

:包含默认模式的所有提交,还包括与第一个父提交不同但与后续父提交相同的任何合并提交。此模式有助于显示"首次引入"更改到分支的合并提交。

--full-history

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

--dense

:仅显示选定的提交,加上一些以拥有有意义的历史。

--sparse

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

--simplify-merges

--full-history 的附加选项,用于从结果历史中移除一些不必要的合并,因为没有选定的提交对此合并有贡献。

--ancestry-path[=<commit>]

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

提交排序

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

--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 仓库的打包。

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

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

--do-walk

:覆盖之前的 --no-walk

提交格式化

--pretty[=<format>]

--format=<format>:以给定格式美化打印提交日志的内容,其中 '<format>' 可以是 onelineshortmediumfullfullerreferenceemailrawformat:<string>tformat:<string> 之一。当 <format> 不是上述任何一种且包含 %<placeholder> 时,它表现得如同给出了 --pretty=tformat:<format>。 有关每种格式的一些额外详细信息,请参阅"美化格式"部分。当省略 =<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 输出,我们将逐字输出对象;这意味着原始提交中的无效序列可能被复制到输出中。同样,如果 iconv(3) 无法转换提交,我们将静默地逐字输出原始对象。

--expand-tabs=<n>

--expand-tabs--no-expand-tabs>:执行制表符展开(将每个制表符替换为足够的空格以填充到 <n> 的倍数的下一个显示列)。默认选项是 --no-expand-tabs

--notes[=<ref>]

--no-notes:在显示提交日志消息时显示注释。这会覆盖 notes.displayRefnotes.displayRef 配置变量中给出的默认值。 在命令行上,可以通过给出 --no-notes 来覆盖 notes.displayRef 设置。要将 core.notesRef 设置的默认引用添加到要显示的注释引用列表中,而不是覆盖它,请给出 --notes=<ref>。 可以给出多次 --notes=<ref> 以显示来自多个引用的注释。 如果给出 --no-notes,不显示任何注释。

--show-notes[=<ref>]

--no-show-notes--notes--no-notes 的已弃用同义词。

--show-signature

:通过将签名传递给 gpg --verify 来检查签名提交对象的有效签名。

--diff-merges=(off|none|on|first-parent|1|separate|m|combined|dense-combined|remerge)

--no-diff-merges:指定合并提交是否以及如何生成差异。仅在命令产生差异输出时有效,例如使用 -p--stat 时。

  • offnone:不输出合并提交的差异。这与 --no-diff-merges 完全相同,无论是否给出 --diff-merges
  • onm:为所有合并提交生成默认差异。这不是 --diff-merges=separate,因为 -m 确保输出单个差异(参见下面的 separate),并且不更改合并提交的差异输出模式。
  • first-parent:显示合并提交的差异相对于第一个父提交。
  • separate:为合并提交与每个父提交生成单独的差异。对于每个父提交,输出与该父提交的差异。
  • combined:为合并提交生成组合差异(与 -c 同义)。
  • dense-combined:为合并提交生成 dense-combined 差异(与 cc 同义)。
  • remerge:为合并提交生成 remerge-diff(与 -r 同义)。 --no-diff-merges--diff-merges=off 的同义词。

--combined-all-paths

:与 --diff-merges=combined--diff-merges=dense-combined 一起使用时,为每个文件在 diffstat 和短统计中包含所有父文件的路径。

--default-commit-format

:使用自定义格式指定时,允许用户在未指定其他格式时使用 --format=<format> 的回退格式。如果未设置,则使用默认格式。

--pretty=format:<string>

:格式字符串中的占位符扩展如下:

  • %H:提交哈希
  • %h:缩写的提交哈希
  • %T:树哈希
  • %t:缩写的树哈希
  • %P:父提交哈希
  • %p:缩写的父提交哈希
  • %an:作者名称
  • %ae:作者电子邮件
  • %ad:作者日期(使用 --date= 选项指定的格式)
  • %ar:作者日期,相对
  • %cn:提交者名称
  • %ce:提交者电子邮件
  • %cd:提交者日期
  • %cr:提交者日期,相对
  • %s:主题
  • %b:正文
  • %Cred:切换到红色
  • %Cgreen:切换到绿色
  • %Cblue:切换到蓝色
  • %Creset:重置颜色
  • %C(...):颜色规范,如 git-config(1) 中的 color.branch.* 配置变量所述。
  • %m:左、右或边界标记
  • %w([<w>[,<i1>[,<i2>]]]):切换换行
  • %<(<N>[,trunc|ltrunc|mtrunc]):使下一个占位符至少取 N 列宽,必要时在左侧、右侧或中间填充空格
  • %>(<N>)%>|(<N>):类似于 %<(<N>),但在右侧填充
  • %>>(<N>)%>>|(<N>):类似于 %>>(<N>),如果占位器超过 N 则在右侧截断
  • %><(<N>)%><|(<N>):类似于 %><(<N>),但在两侧填充
  • %w(<w>[,<i1>[,<i2>]]):切换换行
  • %<(<N>[,ltrunc|trunc|mtrunc]):类似于 %<(<N>),但在左侧截断
  • %>(<N>[,trunc|ltrunc|mtrunc]):类似于 %>(<N>),但在右侧截断
  • %>>(<N>[,trunc|ltrunc|mtrunc]):类似于 %>>(<N>),但在中间截断

--graph

:在输出的左侧绘制基于文本的提交历史图。这可能会导致在提交之间打印额外的行,以便正确绘制图的历史。这不能与 --no-walk 一起使用。 这也会影响 --decorate 选项输出的引用的位置。

--show-pulls

:除了默认历史中显示的提交外,显示与第一个父提交不同但与后续父提交相同的每个合并提交。

美化格式

如果提交是合并提交且合并有冲突的路径,则合并提交消息以"Conflicts:"行开头,后跟已解决的路径列表。

如果使用 --stat,则显示每个已解析路径的冲突统计信息。如果使用 --name-status,则显示已解析路径的状态。

如果提交不是合并提交,则不显示冲突信息。

另请参阅

git-rev-list(1)git-diff(1)git-shortlog(1)

Git

git(1) 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布