git log
命令用于查看提交历史:
git log [options] [<file> <commit> <tag>...]
如果不加其它选项,默认情况下,这个命令按提交的先后顺序由近到远显示提交日志,包括每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明等信息。
如果加文件名作为参数,那么就会只查看跟某个文件有关的提交历史;
如果指定某次提交的校验和或者标签名作为参数,那么就会查看指定提交或标签之前的提交历史。
这个命令有很多选项,常用的如下:
选项 | 作用说明 |
---|---|
-n(n 为一个整数) | 指定显示最近的 n 次提交 |
-p 或 --patch | 显示每次提交所引入的差异 |
–name-only | 仅在提交信息后显示已修改的文件清单 |
–name-status | 显示新增、修改、删除的文件清单 |
–stat | 显示每次提交的简略统计信息 |
–graph | 使用 ASCII 字符形象的展示分支、合并历史等 |
–abbrev-commit | 仅显示 SHA-1 校验和所有 40 个字符中的前几个字符 |
–relative-date | 使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”) |
–pretty= | 使用指定格式显示历史提交信息,常用的选项包括 oneline、short、full、fuller 或 format(用来定义自己的格式) |
–oneline | –pretty=oneline --abbrev-commit 合用的简写 |
–no-merges | 不显示合并提交 |
–since, --after | 仅显示指定时间之后的提交 |
–until, --before | 仅显示指定时间之前的提交 |
<since>…<until> | 查看某两次提交之间的提交历史或两个分支之间的提交的区别 |
<branch_1>…<branch_2> | 查看在分支1上或在分支2上的提交历史 |
–author | 仅显示作者匹配指定字符串的提交 |
–committer | 仅显示提交者匹配指定字符串的提交 |
–grep | 仅显示提交说明中包含指定字符串的提交 |
-S | 仅显示添加或删除内容匹配指定字符串的提交 |
例如:
(1)只查看最近的 3 次提交:
git log -3
或:
git log -n 3
(2)如果想要查看每次提交的文件增删数量,使用 --stat
选项:
git log --stat
(3)如果想要查看每次提交中文件的详细修改内容,使用 -p
选项:
git log -p
(4)如果嫌输出信息太多,可以加一个 --oneline
参数:
git log --oneline
相当于:
git log --pretty=oneline --abbrev-commit
这样每次提交的信息就会在一行当中显示,大大简化输出。
(5)合并分支的时候经常产生合并提交,这些合并提交可能对我们查看过去工作并无用处,但会让提交历史变得很长,可以使用 --no-merges
选项在查看提交历史使去掉合并提交:
git log --no-merges
当然也可以特别关注这些合并提交,使用 --merges
选项查看合并到当前分支的合并提交历史:
git log --merges
(6)只显示 2 周以来的提交:
git log --since='2 weeks'
(7)只查看标签 v1.0 之前的提交历史:
git log v1.0
(8)查看标签 v1.0 之后的提交历史:
git log v1.0..
(9)查看某两次提交之间的提交历史:
git log v1.0..v2.0
这个命令查看 v1.0 和 v2.0 之间的提交,但不包括 v1.0,注意 v1.0 和 v2.0 之间用两个点(…)连接。
(10)查看在 feature 分支,但不在 master 分支的提交:
git log master..feature
(11)只查看跟某个文件有关的提交历史:
git log -- test.txt
--
告诉 Git 后面的参数是文件名,而不是分支名,当要指定文件名作为参数时,一般要放在命令的最后。
使用 git log --pretty=format:<string>
命令自定义提交历史的显示格式,<string>
一般是一些格式占位符,表明要显示的内容,常用格式占位符写法如下:
选项 | 作用说明 |
---|---|
%H | 提交的完整哈希值 |
%h | 提交的简写哈希值 |
%T | 树的完整哈希值 |
%t | 树的简写哈希值 |
%P | 父提交的完整哈希值 |
%p | 父提交的简写哈希值 |
%an | 作者名字 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(可以用 --date=选项 来定制格式) |
%ar | 作者修订日期,按多久以前的方式显示 |
%cn | 提交者的名字 |
%ce | 提交者的电子邮件地址 |
%cd | 提交日期 |
%cr | 提交日期(距今多长时间) |
%s | 提交说明 |
例如,想要在查看提交时,显示提交的简写哈希值、作者名字、提交时间和提交说明,可以这样写:
git log --pretty=format:"%h %an %cd %s"
也可以在 <string>
中加入直接显示的普通字符,例如:
git log --pretty=format:"%h-%an %cd : %s"
这个命令会在哈希值和作者名字之间加一个短横线,在提交说明前面加一个冒号。
在自定义提交历史的显示格式的时候也可以自定义显示的颜色和字体属性,例如:
--pretty=format:"%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset"
在这个命令中,%C
后面跟一个表示颜色的单词用来设置后面内容的显示颜色,如 %Cred%h
表示使用红色显示提交的简写哈希值,%Cgreen(%cd)
表示使用绿色显示提交的时间,常用颜色有:reset(默认灰色),normal,black,red,green,yellow,blue,white。
也可以在 %C
后面同时设置字体和颜色,此时需要将字体和颜色用括号括起来,如 %C(bold blue)<%an>
表示使用蓝色显示作者名字,同时加粗,常用字体属性有:bold(加粗),dim(淡化), ul(下划线), blink, reverse(选中)。当然,也可以只设置字体属性。
当自定义显示格式里面使用 %ad
或 %cd
显示提交时间的时候,可以使用 --date=选项
指定日期的显示格式。
常用选项有:
选项 | 作用说明 |
---|---|
relative | 只显示相对于现在时间的天数,如 “2 weeks ago” |
local | 显示在当前时区下的时间 |
short | 只显示日期,以 “YYYY-MM-DD” 的形式 |
raw | 以 “%s %z” 格式显示时间,%s 指自1970-01-01 00:00:00 以来的秒数,%z 指时区 |
default | 显示原始时区下的时间 |
也可以使用 --date=format:<string>
自定义时间的显示格式。比如 --date=format:"%Y-%m-%d %H:%M:%S"
,常用的格式占位符有:
选项 | 作用说明 |
---|---|
%A | 星期的英文全称 |
%a | 星期的英文简写 |
%B | 月份的英文全称 |
%b | 月份的英文简写 |
%Y | 年份全写,如 2022 |
%y | 年份简写,如 22 |
%M | 分钟,00-59 |
%m | 月份,00-12 |
%d | 日期,00-31 |
%H | 小时,00-23 |
%I | 小时,00-12 |
%S | 秒,00-59 |
%s | 自1970-01-01 00:00:00 以来的秒数 |
%z | 时区 |
%W | 一年中的第几周,以周一为一周的开始 |
%w | 一周中的第几天,0-6,周日是 0 |
%U | 一年中的第几周,以周日为一周的开始 |
%% | 输出一个百分号 |
git config --global alias.lg "log --no-merges --color --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cd) %C(bold blue)<%an>%Creset'"
git config --global alias.lgm "log --color --graph --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cd) %C(bold blue)<%an>%Creset'"
git config --global alias.lgs "log --no-merges --color --stat --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cd) %C(bold blue)<%an>%Creset'"