git log高级使用

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
3
git log f52c471
git show f52c471 filename #只看某个条中某个文件的变化
git show -s --pretty=raw f52c471 #查看某个提交

git 其他查看某个文件修改历史的命令

选项 说明 举例
show 查看某次提交的修改(查看diff) git show –stat #–stat 可以不加
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
3
git log --pretty=format:"$h %cn %cr %s"
// 或者
git log --format="$h %cn %cr %s"

自定义 git log –format 后输出内容的颜色

git log --format 后,输出的内容是没有颜色区分的,我们其实是可以给输出的内容自定义颜色,便于让内容更有辨识度。
方法为在 format 的内容选项前,加上 %C() 选项。其中:

  1. 括号内放代表颜色的字符串,颜色字符串支持24位的RGB值(要带#号)
  2. 也可以是以下的颜色名称:
    • normal
    • black
    • red
    • green
    • yellow
    • blue
    • magenta
    • cyan
    • white
  3. 这些颜色名称还可以跟这些修饰属性绑定使用,可叠加多个使用。注意,这些修饰只能修饰前景色:
    • bold // 加粗
    • dim // 颜色减淡
    • ul // 下划线
    • blink // 闪烁效果
    • reverse // 前景色背景色交换
  4. 也可以放两个颜色字符串,第一个将被识别为前景色,第二个将被识别为背景色
  5. 在 git v1.7 版本后,对于 red、green、blue 三个颜色来说,括号是可选的。(但是这样就只能使用一个颜色,即前景色)
  6. 颜色和颜色修饰,是会传播到之后的输出内容样式,除非在内容前或者该内容后,重置颜色和修饰:%Creset。或则剔除修饰:noxxx(xxx 代表修饰名,例如nodim)。所以每设置完一个内容的颜色,最好是在该内容后紧跟一个%Creset,以防影响后面内容的样式。
  7. 重置颜色和剔除修饰也是会传播的。

事例

命令:

1
git log --format="%C(magenta)%h %C(red)%d %C(yellow)(%cr) %C(green)%s"

效果:
git-log--format-with-color1
命令:

1
git log --format="%C(white ul bold magenta)%h%Creset %C(yellow)(%cr)%Creset %C(green)%s%Creset %C(dim)%cd"

效果:
git-log--format-with-color2
命令:

1
git log --format="%C(reverse ul black)%h%Creset %C(yellow)(%cr)%Creset %C(green)%s%Creset %C(dim)%cd"

效果:
git-log--format-with-color3

自定义规则快捷键——别名

每次都要输入这一长串的命令非常繁琐且容易出错,我们可以将调整好的这一串命令保存在git配置文件里,并给它起一个别名,下次只需要输入这个别名,就可以看到符合自己习惯的日志格式和样式了。

  1. 进入~/.gitconfig
  2. 添加:(注意,format后的值必须要用单引号,双引号会报错。)

    1
    2
    [alias]
    logs = log --format='%C(reverse ul red)%h%Creset %cn %C(yellow)(%cr)%Creset %C(green)%s%Creset'
  3. 然后在命令行只需要输入 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
19
44032af (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
19
44032af (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