git log 是我们经常使用的git命令之一,它可以展示分支上的历史提交信息。但是除了 git log 这一个命令,其实它还为我们提供了很多辅助的参数来从不同维度展示我们需要的日志信息,包括展示格式、只看某个分支的日志,只看某个用户提交的日志,只看某个文件上的提交等等,有的时候,这些方法可以帮助我们快速地定位问题。
git log 选项
选项 | 说明 | 举例 |
---|---|---|
-n | 查看最近n次的提交信息 | git log -2 #查看最近2次提交记录 |
-p | 查看具体的修改diff | git log -p src/index.js #显示某个文件每次提交的diff;git log -p commit-id #显示某次提交的diff |
–stat | 查看提交的修改文件列表 | git log -2 –stat #查看最近两次提交的修改文件列表表 |
–shortstat | 只显示 –stat 中最后的行数和修改添加移除的统计 | |
–filename | 查看指定文件的提交信息,文件名要放到参数的最后位置,通常在前面加上 -- 并用空格隔开表示是文件。 |
git log – file1 file2 |
branchname | 查看某个分支上的提交记录 | git log dev |
tagName | 查询指定标签的提交记录 | git log v1.0.. #查询从v1.0以后的提交历史记录(不包含v1.0) |
–grep | 仅显示含指定关键字的提交 | |
–S | 仅展示添加或者移除了某个关键字的提交 | |
–author | 查询指定作者的提交记录 | git log –author=sam |
–commiter | 查询指定提交者的提交记录 | git log –commiter=sam |
–grep | 通过关键字过滤提交日志 | git log –grep=mod #列出所有包含 mod 字样提交信息的记录 |
–graph | 显示ASCLL码图形表示的分支河滨管理师 | git log –graph |
git log 过滤分支
git log test..master 查询master分支中的提交记录但不包含test分支记录
git log master..test 查询test分支中的提交记录但不办含master分支记录
git log master…test 查询master或test分支中的提交记录。
git log test –not master 屏蔽master分支
根据 commit id 或者 HEAD 查询日志
commit id 可以是提交哈希的简写模式,也可以使用HEAD替代。HEAD指向当前分支,HEAD^为最后一个提交,等同于HEAD~1,HEAD~2代表倒数第二次提交1
2
3git log f52c471
git show f52c471 filename #只看某个条中某个文件的变化
git show -s --pretty=raw f52c471 #查看某个提交
git 其他查看某个文件修改历史的命令
选项 | 说明 | 举例 |
---|---|---|
show | 查看某次提交的修改(查看diff) | git show |
blame | 显示文件的每一行是在哪个版本最后修改的 | git blame filename |
whatchanged | 显示某个文件的每个版本提交信息:提交日期、提交人员、版本号、提交备注 | git whatchanged filename |
–pretty 按指定格式显示日志信息
可选项有:
oneline
, short
, medium
, full
, fuller
, email
, raw
, format
默认为medium,可以通过修改配置文件来指定默认的方式:1
git log (--pretty=)oneline
常见的 format 选项:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18选项 说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示 例如:1 day ago
%ci 提交日期,按ISO 8601 格式显示 例如:2021-02-04 23:00:45 +0800
%s subject 提交说明
%d body
事例:1
2
3git log --pretty=format:"$h %cn %cr %s"
// 或者
git log --format="$h %cn %cr %s"
自定义 git log –format 后输出内容的颜色
git log --format
后,输出的内容是没有颜色区分的,我们其实是可以给输出的内容自定义颜色,便于让内容更有辨识度。
方法为在 format 的内容选项前,加上 %C() 选项。其中:
- 括号内放代表颜色的字符串,颜色字符串支持24位的RGB值(要带#号)
- 也可以是以下的颜色名称:
- normal
- black
- red
- green
- yellow
- blue
- magenta
- cyan
- white
- 这些颜色名称还可以跟这些修饰属性绑定使用,可叠加多个使用。注意,这些修饰只能修饰前景色:
- bold // 加粗
- dim // 颜色减淡
- ul // 下划线
- blink // 闪烁效果
- reverse // 前景色背景色交换
- 也可以放两个颜色字符串,第一个将被识别为前景色,第二个将被识别为背景色
- 在 git v1.7 版本后,对于 red、green、blue 三个颜色来说,括号是可选的。(但是这样就只能使用一个颜色,即前景色)
- 颜色和颜色修饰,是会传播到之后的输出内容样式,除非在内容前或者该内容后,重置颜色和修饰:%Creset。或则剔除修饰:noxxx(xxx 代表修饰名,例如nodim)。所以每设置完一个内容的颜色,最好是在该内容后紧跟一个%Creset,以防影响后面内容的样式。
- 重置颜色和剔除修饰也是会传播的。
事例
命令:1
git log --format="%C(magenta)%h %C(red)%d %C(yellow)(%cr) %C(green)%s"
效果:
命令:1
git log --format="%C(white ul bold magenta)%h%Creset %C(yellow)(%cr)%Creset %C(green)%s%Creset %C(dim)%cd"
效果:
命令:1
git log --format="%C(reverse ul black)%h%Creset %C(yellow)(%cr)%Creset %C(green)%s%Creset %C(dim)%cd"
效果:
自定义规则快捷键——别名
每次都要输入这一长串的命令非常繁琐且容易出错,我们可以将调整好的这一串命令保存在git配置文件里,并给它起一个别名,下次只需要输入这个别名,就可以看到符合自己习惯的日志格式和样式了。
- 进入~/.gitconfig
添加:(注意,format后的值必须要用单引号,双引号会报错。)
1
2[alias]
logs = log --format='%C(reverse ul red)%h%Creset %cn %C(yellow)(%cr)%Creset %C(green)%s%Creset'然后在命令行只需要输入
git logs
就可以得到你要的效果了。
更多详细可查看 git documentation Pretty Formats
–name-only 列出修改过(新增、修改、删除)的文件清单
1 | git log --name-only --oneline |
输出:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1944032af (HEAD -> master, origin/master) add timeout error handler
src/utils/http.js
92e2cf5 update readme
README.md
64ed4bd make http request with wrapped api function
src/views/Home.vue
0f0aad3 wrap apis
src/api/home.js
src/api/index.js
4a14830 wrap axios
package-lock.json
package.json
src/utils/http.js
0de3bde get prepared
.browserslistrc
.editorconfig
.eslintrc.js
.gitignore
README.md
–name-status 列出修改过的文件和修改状态
1 | git log --name-status |
输出:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1944032af (HEAD -> master, origin/master) add timeout error handler
M src/utils/http.js
92e2cf5 update readme
M README.md
64ed4bd make http request with wrapped api function
M src/views/Home.vue
0f0aad3 wrap apis
A src/api/home.js
A src/api/index.js
4a14830 wrap axios
M package-lock.json
M package.json
A src/utils/http.js
0de3bde get prepared
A .browserslistrc
A .editorconfig
A .eslintrc.js
A .gitignore
A README.md