前言
随着年龄的增长和知识的积累,最近常常有种豁然开朗的感觉,或者对一个已经存在的事物突然有了新的认识,比如统计这个词很早就接触了,从没考虑过它是什么意思,而这篇总结的题目中用了统计一词,第一感觉应该是汇总、记录的意思,后来去查了词条定义,也确实就是类似的解释,从没有刻意去学这个词的含义,但是在每天的生活中已经潜移默化地归纳、总结出来了。
想要统计就得有数据源,而 git log
命令恰恰就能提供这个数据源,git log
本身就是一个显示日志的命令,日志记录的是代码库变化的数据,类似于描述代码库变化的 “史书”,想要描述历史就需要大量的数据支撑,想要统计修改的代码行数,只要我们从历史记录中找到需要计算的部分就可以了。
git log
在统计之前我们需要先整理数据,杂乱无章的数据不是不能统计,只是计算起来更加的麻烦,所以在统计前需要先将数据规范化,所以我们需要先学习一下 git log
的相关操作。
我们以 redis
开源库为例,切换到 6.0
分支,提交记录定位到 7bf665f125a4771db095c83a7ad6ed46692cd314
,以此为数据源,学习一下git log
的常用的查询方法,其实使用不同的条件查询就是整理、归类数据的过程。
git log
的用法多种多样,我们主要关心两个大类,分别是条件筛选和显示格式。
条件筛选
git log
条件筛选的选项非常多,使用条件筛选的选项会影响显示的提交记录的范围,查找到想要显示的提交记录。
查询最近几条log
使用 -number
参数可以查询最近几条提交提交记录:
1 | $ git log -3 |
查询指定作者提交
使用 --author
参数可以查询指定作者的提交记录:
1 | Albert@DESKTOP-6746UC3 MINGW64 /d/data/maingit/redis (6.0) |
查询指定时间段的日志
这个可选参数比较多,比如 --since
、--until
、--before
、--after
等等,从意思很容易分辨怎么使用:
查询2020-01-01到2020-04-01的提交记录
1 | $ git log -2 --after=2020-01-01 --before=2020-04-01 |
恰好逮到了原作者的提交~
查询1年前的提交记录
1 | $ git log -2 --until=1.year.ago |
查询包含指定描述内容的提交记录
这里用可以使用 --grep
参数,可以过滤出包含指定内容的提交记录,这里指的是在 commit 描述中筛选符合条件的提交,比如查找提交描述中包含 client 的提交记录:
1 | $ git log -2 --grep='client' |
查找指定分支的提交记录
使用 git log
默认查找的是当前分支的提交记录,如果想查询其他分支的记录直接在命令后面加上分支名字就行,比如查询 arm
分支上的提交记录:
1 | $ git log -2 arm |
其实在 git 体系中,分支名、commit、标签等拥有几乎相同的含义,所以在很多场景下可以扩展互换,比如 git log
后面加上分支名就可以查询指定分支的提交记录,如果加上 commit 就会查询这个 commit 之前的提交记录,如果加上标签,就可以查询这个标签之前的提交记录,比如我们加一个 commit 试试:
1 | $ git log -2 7329cc39818a05c168e7d1e791afb03c089f1933 |
因为 commit id 就是之前的 arm 分支最新的记录,所以这个命令等价于 git log -2 arm
查询指定 commit 之间的提交记录
如果想查询两个 commit 之前的提交记录,可以将两个 commit id 依次放在命令后面并用 ..
连接就可以了,格式为 git log commit1..commit2
,需要注意的是这样查询出来的提交记录列表中不包含 commit1,其实列举出的就是 commit1 之后又做了哪些修改提交。
1 | $ git log e15528bf1da1f1232fd08801ad382c915be94662..7bf665f125a4771db095c83a7ad6ed46692cd314 |
这个特性有一个应用就是在 merge 分支之前可以查询究竟会 merge 哪些记录,常见的用法比如 git log feature..dev
就是列举出 feature 分支合并到 dev 分支将要合并的提交记录有哪些。
1 | $ git log 6.0..unstable |
查询指定文件的提交记录
查询指定文件的提交记录一般直接在 git log
命令后面跟上文件名就可以,但是为了避免和分支名产生分歧,所以通常在文件名前面加上 --
用来区分,--
这个标识符就是用来防止混淆的,放在 --
前面的是分支名,放在后面的是文件名,相同的作用不仅仅在 git log
命令中,在其他命令比如 git checkout
中也有相同的用法。
1 | $ git log -2 -- redis.conf |
显示格式
git log
除了可以筛选提交记录,还可以控制显示格式,普通不加参数,会显示作者、邮件、提交描述信息、日期等信息。
1 | $ git log -1 |
通过添加参数可以控制和改变显示格式,下面来看几条常见的
显示单行信息
git log
默认会显示多行信息,使用 --oneline
后每条提交记录只显示一行信息,可以在一屏幕中查看到更多的信息
1 | $ git log -10 --oneline |
显示每条记录中文件修改的具体行数和行体统计
使用 --stat
参数就可以显示每条记录的中修改文件的具体行数和行数统计
1 | $ git log -2 --stat |
显示每条提交记录中文件的增加行数和删除行数
使用 --numstat
参数会把 --stat
参数中合并显示的修改行数拆分成增加行数和删除行数
1 | $ git log -2 --numstat |
依次罗列各提交记录中每个文件中增加的行数和删除的行数
要想达到这个目的需要用到 --prety=tformat: --numstat
参数,这样的显示格式便于统计
1 | $ git log -2 --pretty=tformat: --numstat |
统计修改的代码行数
有了前面的铺垫,想要统一修改的行数就容易了,只要配合 awk
工具就可以完成统计了
1 | $ $ git log -2 --pretty=tformat: --numstat | awk '{adds += $1; subs += $2; diffs += $1 - $2} END {printf "added lines: %s removed lines: %s, diff lines: %s\n", adds, subs, diffs}' |
还可以统计两个分支相差的代码行数
1 | $ git log 6.0..unstable --pretty=tformat: --numstat | awk '{adds += $1; subs += $2; diffs += $1 - $2} END {printf "added lines: %s removed lines: %s, diff lines: %s\n", adds, subs, diffs}' |
到这里可以发现前面的知识都可以用上,前面筛选的参数变了,得到的结果就变了,我们可以根据需求来调整不同的参数
总结
git log
就是一部代码库记录的“史书”,对于曾经所做的修改可以做到有史可查git log
的选项参数可以分为筛选参数和格式参数,筛选参数可以选择记录范围,格式参数可以控制显示样式- 统计就是按照一定规律来将数据进行汇总,在进行汇总前需要将数据进行整理,这样汇总的工作才会更加顺利
慌慌张张,匆匆忙忙,原来生活就是这样~
2020-9-7 00:05:18