git log 显示提交日志
1 概要
git log [<options>] [<revision range>] [[--] <path>...]
显示提交日志。
该命令采用适用于git rev-list
命令的选项来控制显示的内容和方式,以及适用于git diff-*
命令的选项来控制每次提交引入的更改如何显示。
选项:
[--follow]
继续列出重命名以外的文件历史记录(仅适用于单个文件)。[--no-decorate, --decorate[=short|full|auto|no]]
打印显示.git/
中任何提交的ref
名称。如果指定了short
,则不会打印refs/heads/
、refs/tags/
和refs/remotes/
的前缀。如果指定了full
,则打印完整的引用名称(包括前缀)。如果指定了auto
,那么如果输出到终端,则ref
名称将显示为short
,否则不显示任何ref
名称。默认选项为short
。[--decorate-refs=<pattern>, --decorate-refs-exclude=<pattern>]
如果没有指定--decorate-refs
,则假设refs
都被包含在内。如果指定--decorate-refs-exclude=<pattern>
则pattern
都被排除在外。pattern
可以是remotes
,tags
等等。[--source]
打印出在命令行中给出的每个提交的引用名称。[--[no-]use-mailmap]
使用mailmap文件将作者和提交者的姓名和电子邮件地址映射到规范的真实姓名和电子邮件地址。详情可看git shortlog
命令。[--full-diff]
使用git log -p <patch>...
只会显示指定路径或者文件的提交diff,使用--follow
则会显示该文件的历史提交,而加入此选项则会把这次提交中触及文件的所有提交diff。[--log-size]
为每个提交在开头输出log size <number>
,number
为提交消息字节数,用于程序为消息buf快速分配空间。[-L <start>,<end>:<file>, -L :<funcname>:<file>]
跟踪start, end:file
指定的文件起始行和结束行的提交(或者是函数名:文件名,可使用正则表达),也可多次指定。[<revision range>]
指定显示的日志范围,如果不指定默认是HEAD
开始一直往前。例如:HEAD..HEAD^^^
,HEAD...HEAD^^^^
。[-- <patch>...]
只查看指定的路径或文件。
提交日志显示限制设置
比如可以使用--since=<data1>
来进一步限制log输出,使用--grep=<pattern>
正则表达选择性log输出。
注意:这些都是在排序显示(--reverse
)log之前设置的。
-<number>, -n <number>, --max-count=<number>
Limit the number of commits to output.--skip=<number>
在开始显示提交输出之前,跳过number个提交。--since=<date>, --after=<date>
按照日期设置显示提交范围。--until=<date>, --before=<date>
按照日期设置显示提交范围。--author=<pattern>, --committer=<pattern>
按照作者,提交者来设置显示提交范围。--grep-reflog=<pattern>
使用reflog来设置显示提交范围。--grep=<pattern>
按照grep格式来设置显示提交范围。--all-match
在使用--grep
时使用全匹配。--invert-grep
使用--grep
时使用排除在匹配之外。-i, --regexp-ignore-case
匹配正则表达式限制模式,而不考虑字母大小写。--basic-regexp
这是默认值,限制默认为正则表达式。-E, --extended-regexp
将匹配模式设置为拓展正则表达式。-F, --fixed-strings
将限制模式考虑为固定字符串(不要将模式解释为正则表达式)。-P, --perl-regexp
将限制模式考虑为perl兼容的正则表达式。--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-merge
相同。--min-parents=2
与--merge
相同。--max-parents=0
表示所有根提交,--min-parents=3
表示所有多合并。--first-parent
在看到合并提交时,只跟随第一个父提交。这个选项可以更好的查看特定的主题分支,因为合并成一个主题分支往往只需要看上游更新而忽略个人的历史提交。--not
反转^前缀的含义,直到下一个--not
。--all
假设refs/
中的所有引用,连同HEAD
,都在命令行中列出为<commit>
。--branches[=<pattern>]
在refs/heads
中显示指定分支提交。--tags[=<pattern>]
同上,指定tag的提交。--remotes[=<pattern>]
同上,指定remotes
的提交。--glob=<glob-pattern>
正则匹配的形式展示提交。--reflog
假设reflogs
提到的所有对象都在命令行中以<commit>
的形式列出。--alternate-refs
详情看man
手册。--ignore-missing
在看到输入中的无效对象名时,假装没有给出错误的输入。--bisect
详情看man
手册。--stdin
还可以从标准输如读取命令。--cherry-mark
详情看man
手册。--cherry-pick
如果你有两个分支,A和B,通常的列出所有提交的方法是--left-right
(见下面--left-right
选项的描述)。但是,它显示了从另一个分支中挑选出来的提交(例如,B上的第三个可能从A分支中挑选出来)。有了这个选项,这样的提交对将被排除在输出之外。--left-only, --right-only
只显示对称差异的一侧,如果需要都显示使用--left-right
。--cherry
--right-only, --cherry-pick
的同义词。-g, --walk-reflogs
不是遍历提交祖先链,而是从最近的reflogs开始。--boundary
输出排除边界提交。边界提交以-作为前缀。
简化提交历史,用于只查看特定历史的提交信息,这一段省略,详情看 man
手册。
按排序提交显示
默认情况下,提交按时间倒序显示。
--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。
用-拓扑顺序,他们会显示8 6 5 3 7 4 2 1(或8 7 4 2 6 5 3 1);一些旧的提交在新提交之前显示,以避免将两个并行开发跟踪的提交混在一起显示。--reverse
将选择显示的提交(请参阅上面的提交限制部分)以倒序输出。
对象的遍历
这些选项主要用于打包Git存储库。
--no-walk[=(sorted|unsorted)]
只显示给定的提交,但不要遍历它们的祖先。如果指定了范围,则没有此作用。--do-walk
与上相反。
提交格式
--pretty[=<format>], --format=<format>
将提交日志的内容以给定的格式进行漂亮打印,可以是oneline, short, medium, full, fuller, reference, email, raw, format:<string>, tformat:<string>
,<format>
可以使用%
占位符,等价于--pretty=tformat
。具体format
用法下面展示。--abbrev-commit
不显示完整的40字节16进制提交对象名称,只显示部分前缀。可以使用--abbrev=<n>
指定,这将使--pretty=online
更好打印。--no-abbrev-commit
显示完整的提交对象名称。--oneline
只打印一行,等价于--pretty=online --abbrev-commit
。--encoding=<encoding>
编码格式指定。--expand-tabs=<n>, --expand-tabs, --no-expand-tabs
日志信息打印的制表符设置。--notes[=<ref>]
在打印中显示注释信息,详情看man
手册。--no-notes
与上相反。--show-notes[=<ref>], --[no-]standard-notes
不建议使用的命令。--show-signature
通过将签名传递给gpg --verify
并显示输出,来检查签名提交对象的有效性。--relative-date
等价于--date=relative
。--date=<format>
仅对以人类可读格式显示的日期有效。详情配置看man
手册。--parents
也打印提交的父节点(以“commit parent…”的形式)。--children
同时打印commit的子节点。--left-right
看man
手册。--graph
以人类易读形式展示图形化提交信息。
差异格式显示
下面列出的是控制diff输出格式的选项。
-c
有了这个选项,合并提交的diff输出将同时显示每个父节点与合并结果之间的差异,而不是同时显示父节点与合并结果之间的两两差异。此外,它只列出从所有父文件修改的文件。--c
这个标志暗示了-c
选项,并进一步压缩补丁的输出,方法是省略无意思的块,这些块的内容在父节点中只有两个变量,合并结果将选择其中一个而不做修改。--combined-all-paths
这个标志导致合并的diff(用于合并提交)列出所有父文件的名称。因此,它只有在指定-c
或--cc
时才有效,并且可能只有在检测到文件名更改时才有用(即当请求重命名或复制检测时)。-m
这个标志使合并提交像普通提交一样显示全部差异;对于每个合并父节点,生成一个单独的日志条目和diff。一个例外是,只有当给出--first-parent
选项时,才显示与第一个父节点的差异;在这种情况下,输出表示合并给当时的分支带来的更改。-r
显示递归的差异。-t
在diff输出中显示树对象。
漂亮的输出打印 --pretty
--pretty=<format>
<format>
如下: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>)
email
From <hash> <date> From: <author> Date: <author date> Subject: [PATCH] <title line> <full commit message>
raw
原始格式显示了完整的提交,与存储在提交对象中的内容完全一致。fotmat:<string>
他允许你使用类似printf的自定义打印
例如:format:"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
newline - %%
原始的% - %x00
从十六进制代码中打印一个字节
- %n
- 影响以后占位符格式的占位符:
- %Cred
切换颜色为红色 - %Cgreen
切换颜色为绿色 - %Cblue
切换颜色为蓝色 - %Creset
复位颜色 - %C(…)
颜色的高级设置,详情看man
手册 - %m
左(<),右(>)或边界(-)标记。 - %w([<w>[,<i1>[,<i2>]]])
切换换行 - %<(<N>[,trunc|ltrunc|mtrunc])
占位符。后续还有一些类似的设置,详情看man
手册。
- %Cred
- 占位符扩展为从提交中提取的信息:
- %H
提交hash值 - %h
缩写提交哈希 - %T
哈希树 - %t
缩写的哈希树 - %P
父hash - %p
缩写的夫hash - %an
作者 - %aN
作者,根据.mailmap重映射 - %ae
作者邮箱 - %aE
作者邮箱,根据.mailmap重映射 - %al
作者邮箱,@符号之前的部分 - %aL
作者邮箱,根据.mailmap重映射,@符号之前的部分 - %ad
作者日期 - %aD
作者日期,RFC2822风格。 - %ar
作者日期,相对的。 - %at
作者日期,UNIX时间戳 - %ai
作者日期,ISO 8601风格 - %aI
作者日期,strict ISO 8601风格 - %as
作者日期,简短格式(YYYY-MM-DD) - %cn
提交者 - %cN
提交者根据.mailmap重映射。 - %ce
提交者邮箱
后续还有很多类似的选项,详情看man
手册
- %H
- 占位符扩展为单个文字字符:
提交展示diff的选项
选项同git diff
相同,请参考git diff
。