简体中文 ▾ Topics ▾ Latest version ▾ git-log last updated in 2.51.0

名称

git-log - 显示提交日志

概述

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

描述

显示提交日志。

列出可以从给定的提交中通过 "父 "链接到达的提交,但不包括可以从前面有"^"的提交中到达的提交。 默认情况下,输出结果是按时间顺序倒置的。

你可以把它看成是一个集合操作。从命令行上给出的任何一个提交中可以到达的提交形成一个集合,然后从这个集合中减去任何一个前面带有'^'的提交。 剩下的提交内容就是命令的输出结果。 其他各种选项和路径参数也可以用来进一步限制结果。

因此,可以执行以下命令:

$ git log foo bar ^baz

意思是 "列出所有可以从’foo’或’bar',但不能从’baz’到达的提交"。

一个特殊的符号 "<提交 1>…​<提交 2>" 可以作为 "^<提交 1> <提交 2>" 的简称。例如,以下两种情况可以互换使用:

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

另一个特殊的符号是 "<提交 1>…​<提交 2>",对合并很有用。 由此产生的提交集合是两个操作数之间的对称差。 以下两个命令是等价的:

$ 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):若它与`--decorate-refs-exclude`指定的任何模式匹配,或者若它不与`--decorate-refs`指定的任何模式匹配。配置选项`log.excludeDecoration`允许从装饰中排除引用,但是在`log.excludeDecoration`中的匹配项将被`--decorate-refs`模式中的显式指定所覆盖。

如果没有给出这些选项或配置设置中的任何一个,那么如果引用与 HEADrefs/heads/refs/remotes/refs/stash/refs/tags/ 匹配,则使用引用作为装饰。

--clear-decorations

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

--source

打印出通过命令行给定的引用名称,以便触及每个提交。

--[no-]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<起始>,<结束>:<文件>
-L :<函数名称>:<文件>

追踪由 <起始>,<结束> 给出的行的范围,或由函数名称重合词 <函数名称> 给出的行的演变,在 <文件>'中 。你不能给出任何路径规范限制条件。 目前这只限于从一个修订版开始的行走,也就是说,你只能给出零或一个正的修订版参数,而且 '<起始><结束>(或 <函数名称>)必须存在于起始修订版中。 你可以多次指定这个选项。包含 --patch 选项。 补丁输出可以用 --no-patch 来抑制,但其他差异格式(即 --raw--numstat--shortstat--dirstat--summary--name-only--name-status--check)目前没有实现。

<开始><结束> 可以采取这些形式之一:

  • 数目

    如果'<开始>'或'<结束>'是一个数字,它指定了一个绝对行数(行数从1开始计算)。

  • /正则表达式/

    这种形式将使用与给定的 POSIX 正则表达式匹配的第一行。如果 <start> 是一个重词,它将从前一个 -L 范围的末尾开始搜索,如果有的话,则从文件的开始。 如果 <start>^/regex/,它将从文件的开始搜索。 如果 <end> 是一个正则表达式,它将从 <start> 所给的行开始搜索。

  • +offset或-offset

    这只对'<end>'有效,将指定'<start>'所给的行前或行后的数量。

如果 :<funcname> 代替了 <start><end> ,它是一个正则表达式,表示从第一个匹配 <funcname> 的 funcname 行开始,直到下一个 funcname 行的范围。:<funcname> 从上一个 -L 范围的末尾开始搜索,如果有的话,则从文件的开始搜索。^:<funcname>`从文件的开始搜索。函数名的确定方式与 `git diff 确定补丁组头的方式相同(见 gitattributes[5] 中的’定义自定义组头')。

<revision-range>

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

[--] <path>…​

只显示那些足以解释符合指定路径的文件是如何形成的提交。 有关细节和其他简化模式,请参见下面的’历史简化'。

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

承诺限制

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

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

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

-<数>
-n <数量>
--max-count=<数量>

限制输出的提交数量。

--skip=<数量>

在开始显示提交输出之前,跳过’数’的提交。

--since=<日期>
--after=<日期>

显示比某一特定日期更近的提交。

--since-as-filter=<日期>

显示所有比指定日期更近的提交。这将访问该范围内的所有提交,而不是停在第一个比指定日期更早的提交。

--until=<日期>
--before=<日期>

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

--author=<模式>
--committer=<模式>

将提交文件的输出限制在作者/提交人标题行符合指定模式(正则表达式)的文件。 如果有多个`--author=<pattern>,则会选择作者符合任何一个给定模式的提交(对于多个--committer=<pattern>`也是如此)。

--grep-reflog=<模式>

将提交文件的输出限制在有符合指定模式(正则表达式)的reflog条目的提交文件。如果有多个 --grep-reflog,则会选择那些 reflog 信息符合任何指定模式的提交。 除非使用了`--walk-reflogs`,否则使用此选项是错误的。

--grep=<模式>

将提交结果限制在日志信息与指定模式(正则表达式)相匹配的提交。 如果有多个 --grep=<模式>,则会选择那些日志信息与任何指定模式相匹配的提交(但见 --all-match)。

--notes 生效时,笔记中的信息被匹配,就像它是日志信息的一部分。

--all-match

将输出的提交限制在符合所有给定`--grep`的提交,而不是至少符合一个的提交。

--invert-grep

限定输出的提交信息与 `--grep=<模式>`指定的模式不匹配。

-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=<数量>
--max-parents=<数量>
--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

在寻找要排除的提交(用'^')时,在看到合并提交时只跟随第一个父提交。 考虑到任意的合并都可以成为有效的主题分支变化,这可以用来查找主题分支中从它与远程分支的分歧点开始的变化集合。

--not

反转 ^ 前缀(或无前缀)对后面所有版本说明符的意义,直到下一个 --not。 在 --stdin 之前的命令行中使用时,通过标准输入流传递的修订版本不会受其影响。反之,通过标准输入传递时,命令行上传递的修订版本也不会受其影响。

--all

假设`refs/‘中的所有参考文献,连同`HEAD`一起,在命令行中被列为’<commit>'。

--branches[=<模式>]

假设`refs/heads`中的所有 refs 在命令行中被列为 <commit>。如果给出了'<pattern>',将分支限制在与给定的shell glob相匹配的分支。如果pattern缺少'?*'或'[,则末尾的/*'是暗示的。

--tags[=<模式>]

假设`refs/tags`中的所有参考文献在命令行中被列为'<commit>'。如果给出了'<pattern>',将标签限制在与给定的shell glob相匹配的标签。如果pattern缺少'?*'或'[,则暗示最后的/*'。

--remotes[=<模式>]

假设`refs/remotes`中的所有 refs 在命令行中被列为 <commit>。如果给出了'<pattern>',将远程跟踪分支限制在与给定的shell glob相匹配的分支。 如果pattern缺少'?*'或'[,则末尾的/*'是暗示的。

--glob=<通配符模式>

假设所有与shell glob <glob-pattern>相匹配的refs在命令行中被列为<commit>'。前面的’refs/,如果缺少的话会自动预加。如果模式中缺少?*'或'[,则在结尾处隐含/*'。

--exclude=<通配符模式>

不包括匹配"<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]

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

--reflog

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

--alternate-refs

假设所有提到的作为备用仓库的参考提示的对象都列在命令行上。备用资源库是任何资源库,其对象目录在`objects/info/alternates`中指定。 包含的对象集可以通过`core.alternateRefsCommand`等修改。见git-config[1]

--single-worktree

默认情况下,当有多个工作树时,所有工作树都会被以下选项检查(见git-worktree[1]):--all--reflog`和--indexed-objects`。 这个选项强制它们只检查当前的工作树。

--ignore-missing

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

--bisect

假设坏的二分法参考文献`refs/bisect/bad`被列出,并且在命令行中假设它后面是`--not`和好的二分法参考文献`refs/bisect/good-*`。

--stdin

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