例子
git log --no-merges
显示整个提交历史,但跳过任何合并
git log v2.6.12… include/scsi drivers/scsi
显示自v2.6.12版本以来所有更改include/scsi或drivers/scsi子目录中 任何文件的提交
git log --since=“2 weeks ago” – gitk
显示最近两周对文件gitk的更改。在–避免与混乱是必要的分公司名为 gitk
git log --name-status release…test
显示在“测试”分支中但尚未在“发布”分支中的提交,以及每个提交修改的路径列表。
git log --follow builtin/rev-list.c
显示更改的提交builtin/rev-list.c,包括在为文件提供其当前名称之前发生的那些提交。
git log --branches --not --remotes=origin
显示在任何本地分支中但不在任何远程跟踪分支中的所有提交的提交。
git log master --not --remotes=*/master
显示所有在本地master中但不在任何远程存储库master分支中的提交。
git log -p -m --first-parent
仅从“主分支”角度显示包括更改差异的历史记录,跳过来自合并分支的提交,并显示合并引入的更改的完整差异。仅当在一个集成分支上遵循严格的合并所有主题分支的策略时,这才有意义。
git log -L ‘/int main/’,/^}/:main.c
显示main()文件中的功能如何main.c随时间演变。
git log -3
将提交的显示次数限制为3。
特殊符号“<commit1> .. <commit2>
”可以用作“^ <commit1> <commit2>
”的简写
假设有如下提交记录,他们按时间逆序排列
7919e7674a467f0e5b1d13e99b26af5e6e1b212b ------( HEAD)
16705844a1f0d8e979fa838483d0b70860a9b786
16846670beabe3fed39e7e56bd91f2d52818d17b
8b6a2bb356c9f5cebc4ccc83d8faaacf62ca9dee ------(origin)
git log origin..HEAD
展示origin到HEAD不包含origin这次提交的其余所有提交
..
前面的commit-id必须是更早地提交 不然将不会检索到结果,
比如:git log 8b6a2bb..7919e7674a46
展示了7919e7674a467f 16705844a1f0d 16846670beabe3f
三次提交
而git log 7919e7674a4..8b6a2bb356
的结果为空
git log HEAD ^origin
效果和git log origin..HEAD
是一样的 但是要注意 ^
的位置 应该在更早的commit-id前面
git log ^8b6a2bb356 7919e7674a
和git log 7919e7674a ^8b6a2bb356
效果是一样的
都展示了7919e7674a467f 16705844a1f0d 16846670beabe3f三次提交
而git log 8b6a2bb356 ^7919e7674a
将不会有任何结果展示
另一个特殊的表示法是“<commit1> … <commit2>
”,这对合并很有用。提交的结果集是两个操作数之间的对称差。以下两个命令是等效的:
git log A B --not $(git merge-base --all A B)
git log A...B
--max-count=<number>
-<number>
-n <number>
三者等效 限制要输出的提交数。
--skip=<number>
跳过前number次提交
--since=<date>
--after=<date>
比指定日期更晚的提交
--until=<date>
--before=<date>
比指定日期更早地提交
--author=<pattern>
--committer=<pattern>
具有与指定模式(正则表达式)匹配的作者/提交者标题行的提交。
--grep=<pattern>
与指定模式(正则表达式)匹配的日志消息的提交。如果有多个–grep=提交,则选择其消息与任何给定模式匹配的提交
有时只对历史的某些部分感兴趣,例如,修改特定
<paths>
选择修改给定的提交。
--simplify-by-decoration
选择由某个分支或标签引用的提交。
请注意,可以显示额外的提交以提供有意义的历史记录。
以下选项影响简化的方式:
Default mode
将历史简化为最简单的历史,解释树的最终状态。最简单,因为如果最终结果相同,它将修剪一些侧分支(即合并具有相同内容的分支)
--show-pulls
包括默认模式下的所有提交,还包括不是对第一个父级的TREESAME而是对后一个父级的TREESAME的所有合并提交。此模式有助于显示“首次引入”分支更改的合并提交。
--full-history
与默认模式相同,但不修剪某些历史记录。
--dense
仅显示选定的提交,还有一些具有有意义的历史记录。
--sparse
显示了简化历史记录中的所有提交。
--simplify-merges
–full-history从结果历史记录中删除一些不必要的合并的 附加选项,因为没有选定的提交会对此合并作出贡献。
--ancestry-path
给定要显示的提交范围(例如commit1…commit2 或commit2 ^commit1)时,仅显示直接存在于commit1和 commit2之间的祖先链上的提交,即既是commit1的后代又是commit2的后代的提交。
--date-order
日期顺序 在显示所有子项之前不显示任何父母,否则以提交时间戳记顺序显示提交。
--author-date-order
在显示所有子项之前不显示任何父母,否则按作者时间戳顺序显示提交。
--topo-order
在显示所有子项之前,不要显示任何父母,并避免在多个历史记录中混合显示提交。
--reverse
以相反的顺序输出选择显示的提交
--pretty[=<format>]
--format=<format>
以给定的格式漂亮地打印提交日志的内容,
其中<format>
可以是oneline,short,medium, full,fuller,reference,email,raw,format:<string> 和 tformat:<string>
之一。
如果<format>
都不是上述内容,并且其中包含%placeholder
,则它的作用就像给出了--pretty = tformat:<format>
一样。
如果省略= <format>
部分,则默认为medium
。
--abbrev-commit
不要显示完整的40字节十六进制提交对象名称,而是显示一个可以唯一命名对象的前缀。“ --abbrev = ”(如果显示,它也会修改diff输出)选项可用于指定前缀的最小长度。
对于使用80列终端的人来说,这应该使“ --pretty = oneline”更具可读性。
--no-abbrev-commit
显示完整的40字节十六进制提交对象名称。这否定 --abbrev-commit了其他选项(例如“ --oneline”)的显式或隐式。它还会覆盖log.abbrevCommit变量。
--oneline
这是一起使用的--pretty = oneline --abbrev-commit
的简写。
--encoding=<encoding>
提交对象在其编码标头中记录用于日志消息的编码。此选项可用于告诉命令以用户首选的编码方式重新编码提交日志消息。对于非管道命令,默认为UTF-8
。
--expand-tabs = <n>
--expand-tabs
--no-expand-tabs
在日志消息中执行选项卡扩展(在每个选项卡中留出足够的空间以填充到下一个显示列,该显示列是的倍数),然后在输出中显示它。 --expand-tabs是的简写形式–expand-tabs=8, --no-expand-tabs也是的简写形式–expand-tabs=0,它禁用制表符扩展。
默认情况下,选项卡以漂亮的格式扩展,该格式将日志消息缩进4个空格
--notes [= <ref>]
在显示提交日志消息时,显示注释提交的注释。
这是默认的git log
,git show
并且git whatchanged
在没有命令--pretty
,--format
或者--oneline
在命令行上给出的选项。
默认情况下,显示的注释来自core.notesRef
and notes.displayRef
变量中列出的注释参考 (或相应的环境替代)。
可以组合多个–notes选项来控制显示哪些笔记。示例:--notes = foo
将仅显示“ refs/notes/foo
”中的注释;“ --notes = foo --notes
”将同时显示“ refs/notes/foo
”中的注释和默认注释ref中的注释。
--no-notes
不要显示注释。–notes通过重置从中显示注释的注释引用列表,可以取消上述选项。选项按命令行给定的顺序进行解析,因此,例如“ --notes --notes = foo --no-notes --notes = bar
”将仅显示“ refs/notes/bar
”中的注释。
--show-signature
通过将签名传递到gpg --verify
并显示输出来检查已签名提交对象的有效性。
--relative-date
--date=relative
的同义词.
--date=<format>
仅对以人类可读格式显示的日期生效,例如使用时--pretty
。log.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格式显示时间戳,通常在电子邮件中找到。
--date=short
仅以YYYY-MM-DD
格式显示日期,而不显示时间。
--date=raw
将日期显示为从纪元(1970-01-01 00:00:00 UTC)开始的秒数,后跟一个空格,然后将时区显示为相对UTC的偏移量(a+或-四位数;前两个是小时,并且后两分钟)。即,好像时间戳记是用格式化的strftime("%s %z")。请注意,该-local选项不会影响秒计时以来的值(始终以UTC度量),但是会切换随附的时区值。
--date=human
如果时区与当前时区不匹配,则显示时区;如果时区不匹配,则不显示整个日期(例如,跳过打印年份为“今年”的日期,但是如果显示时,则跳过整个日期本身)最近几天,我们可以说是星期几。对于较早的日期,还会省略小时和分钟。
--date=unix
将日期显示为Unix纪元时间戳(自1970年以来的秒数)。与一样–raw,这始终是UTC,因此-local 无效。
--date=format
:…将格式提供…给您的系统strftime,但%z和%Z除外,它们在内部处理。用于--date=format
:%c以系统区域设置的首选格式显示日期。有关strftime格式占位符的完整列表,请参见手册。使用时-local,正确的语法是 --date=format-local:…。
--date=default
是默认格式,与相似 --date=rfc2822
,但有一些例外:
星期几后没有逗号
使用本地时区时,将省略时区
--parents
还打印提交的父母(以“ commit parent…”的形式)。还可以启用父级重写,请参见上面的“历史记录简化”。
--children
还打印提交的子项(格式为“ commit child…”)。还可以启用父级重写,请参见上面的“历史记录简化”。
--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>
指定,则将显示该字符串,而不是默认字符串。
漂亮的格式
如果提交是合并,并且如果pretty-format格式不是oneline,email或raw,则在Author:行之前插入另一行。该行以“ Merge:”开头,并打印祖先提交的哈希,并用空格分隔。
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
原始格式显示与提交对象中存储的完全相同的整个提交,值得注意的是,无论是否使用--abbrev
或--no-abbrev
,哈希值都会完整显示,并且父母信息会显示真正的父母承诺,而无需考虑嫁接或历史简化。注意,这种格式会影响提交的显示方式,但不会影响差异显示的方式,例如与git log --raw
。要获取原始差异格式的完整对象名称,请使用--no-abbrev
。
format:<string>
该格式为:<字符串>格式允许你指定要显示哪些信息。它的工作方式类似于printf格式,但值得注意的例外是您使用%n 而不是\n换行了。
例如,格式:“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 从十六进制代码打印一个字节
%Cred
将颜色切换为红色
%Cgreen
将颜色切换为绿色
%Cblue
将颜色切换为蓝色
%Creset
重置颜色
%C(…)
颜色规范,如git-config的“配置文件”部分中的“值”下所述。
默认情况下,仅在启用日志输出时才显示颜色(通过color.diff,color.ui或--color
,auto如果要连接到终端,请遵循前者的设置)。
%C(auto,…)被接受为默认值的历史同义词(例如%C(auto,red))。
%C(always,…)即使未启用颜色,指定也会显示颜色(尽管考虑仅使用 --color=always启用整个输出的颜色,包括此格式以及git可能会着色的其他任何颜色)。
auto独自(即%C(auto))将在下一个占位符上启用自动着色,直到再次切换颜色为止。
%m
左(<),右(>)或边界(-)标记
%w([<w>[,<i1>[,<i2>]]])
切换换行,像git-shortlog的-w选项 。
%<(<N> [,trunc | ltrunc | mtrunc])
使下一个占位符至少占据N列,并在必要时在右侧填充空格。如果输出的长度超过N列,则可以选择在开头(ltrunc),中间(mtrunc)或结尾(trunc)截断。请注意,只有在N> = 2时才可以正确截断。
%H
提交哈希
%H
缩写提交哈希
%T
树哈希
%t
缩写树哈希
%P
父哈希
%p
缩写父哈希
%an
作者名
%aN
作者名称
%ae
作者电子邮件
%aE
作者电子邮件
%al
作者电子邮件本地部分(@符号之前的部分)
%aL
作者本地部分
%ad
作者日期(格式方面--date
=选项)
%aD
作者日期,RFC2822样式
%ar
作者日期,相对
%at
作者日期,UNIX时间戳
%ai
作者日期,类似于ISO 8601的格式
%al
作者日期,严格的ISO 8601格式
%as
作者日期,短格式(YYYY-MM-DD)
%cn
提交者名称
%cN
提交者名称
%ce
提交者电子邮件
%cE
提交者电子邮件
%cl
提交者电子邮件本地部分(@符号之前的部分)
%cL
遵守.mailmap的 提交者电子邮件本地部分
%cd
提交者日期(格式方面--date =
选项)
%cD
提交者日期,RFC2822样式
%cr
提交日期,相对
%ct
提交者日期,UNIX时间戳
%ci
提交者日期,类似于ISO 8601的格式
%cI
提交日期,严格的ISO 8601格式
%CS
提交者日期,短格式(YYYY-MM-DD)
%d
引用名称,例如git-log的–decorate选项
%D
引用名称不带“(”,“)”。
%S
在到达提交的命令行上给出的ref名称(例如git log --source
),仅适用于git log
%e
编码方式
%s
subject
%F
sanitized subject line, suitable for a filename
%b
主体
%B
原始主体
%N
提交笔记
%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 会产生yield refs/heads/master@{0})。
%gd
缩短的reflog选择器;与相同%gD,但refname部分出于人类可读性的考虑而缩短了(因此 refs/heads/master变为master)。
%gn
reflog身份名称
%gN
reflog身份名称
%ge
reflog身份电子邮件
%gE
reflog身份电子邮件
%gs
reflog主题
tformat格式的工作方式与format完全相同,不同之处在于除了它提供“终结者”语义而不是“分隔符”语义。换句话说,换句话说,每个提交都附加了消息终止符(通常是换行符),而不是在条目之间放置分隔符。这意味着单行格式的最终输入将以换行正确终止,就像“ oneline”格式一样。For example:
$ 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