写日报老忘昨天做了啥,git log 朋友来帮忙
大家好,我是前端西瓜哥。
大概上个月开始,我们公司就开始要求写每日简报了,要写昨天做的工作和今天要做的工作。作为一名打杂前端,做的需求杂而小,很容易忘记做过的一些工作,每次都要想半天,太难了。
但是 git log 好朋友不会忘记我们的付出,我想我们可以找它帮帮忙。
那我们赶紧来学习如何和 git log 沟通吧。
(如果你熟悉 git log 的使用,直接跳到文末看实现)
git log
我们切换到项目的根目录下,输入 git log。
这种不提供任何参数的命令,可以得到具体的代码历史提交信息。
commit 会从最近到最旧排序,每个 commit 会显示:
- 完整的哈希值。用于标识唯一 commit
- 作者名和作者邮箱
- 提交时间
- 提交说明(message)
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
removed unnecessary test
git log -p
p 是补丁(patch)的意思,该命令会展示每个提交相对上一个提交,具体修改了什么内容。
如果只展示最近几个,可以加多个数字参数。如 git log -p -3
表示只展示最近三个提交的修改内容。
git log --stat
stat,是统计的意思。通过添加 --stat 参数,我们可以在默认 git log 的基础上,显示文件的改动统计。
具体是统计每个文件新增了几行,删除了几行内容,这是对于文本文件来说的。
README.md | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
对于像是图片的二进制类型图片来说,则是会显示字节数的变化。
0.jpg | Bin 20790 -> 96186 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
git log --prety=oneline
--pretty 参数可以用于自定义设置格式,git 为我们提供了很多可选项。
- online:一行显示完整哈希值,以及提交说明。
- short:显示哈希值、作者信息、提交说明。
- ...
可以使用的选项很多,这里就不一一讲解了,可以自己去看 git 的官方文档,然后自己在本地测试一波。
我们常用的 git log --oneline
其实就是 git log --pretty=oneline --abbrev-commit
的简写。
如果你想自定义 commit 内容格式,可以使用 format:<string>
。
比如你只想知道每个 commit 的(1)相对时间(2)提交说明,可以这样写:
git log --pretty=format:"%ar %s"
其中 %ar(author date, relative)表示 commit 的相对时间,%s(subject)表示提交说明。
更多占位符的说明可以看官方文档,这里不展开讲。
git log --graph
graph 选项可以让我们的 commint 以图形的方式去显示分支的分叉和合并变化。为了能够一个窗口范围能够看到更多的 commit,通常我们会配合上 --oneline。
git log --oneline --graph
git log --since=1.day
--since 可以用来设置时间筛选项目,比如 2.weeks 只显示最近两周的提交,1.day 显示最近一天的提交,也可以是具体的一个事件戳,如 '2022-03-17'。
限制范围的除了时间,还可以是作者(--author=<作者名>),提交说明(--grep="fix:")等。
git log -S
输出曾经删除或添加了特定字符串的所有 commit。这在我们在寻找一个函数的什么时候被删除和添加很有用。比如看看 getCurrentNode 函数是什么时候被删除的:
git log -S getCurrentNode
显示昨天所有的提交说明
我们学了很多 git log 的选项的使用,其中的一些用法正好可以用来实现我们的部分需求。
git log --since=1.day --author="watermelon" --pretty=format:"%ad %s" --date=format:"%m/%d %H:%M" --all --no-merges
- --since=1.day:限定一天内的提交
- --author="watermelon":限定作者为你自己的名字,你也可以换成同事的名字,看看谁摸鱼更厉害。
- --pretty=format:"%ad %s":只显示提交的绝对时间,以及提交说明。
- --date=format:"%m/%d %H:%M":对绝对时间设置自定义格式,原来的时间太长了,长这个样子:
Thu Mar 17 14:35:19 2022 +0800
,所以我改自定义格式改短一点,变成:03/17 14:35
。 - --all:范围扩展为所有的可通过 ref 访问的 commit。如果你在多个分支提交了修改,需要加上这个。
- --no-merges:隐藏 merge 提交。因为 merge 的说明通常是无意义的。
不过这行命令也太长了点,我们用 git alias 设置个短一点的别名:
git config --global alias.done 'log --since=1.day --author="huanghao" --pretty=format:"%ad %s" --date=format:"%m/%d %H:%M" --all --no-merges'
以后我们早上醒来,输入 git done
,就能轻松愉快地知道自己昨天做了什么需求工作了。
03/17 20:27 添加 index.html 文件
03/17 20:26 初始化
对了,还有周一早上醒来找上周五提交的情景,只要改为 --since-3.days,再配一个新的别名,比如 done3 就完事了。
当然这里也有不太智能的地方,有时候我们偶尔想看看两天内之间的提交,或者自己在另一个项目中的名字又不同了,就需要在命令行上做修改。
解决办法是有的,说一下思路。可以自己再写个 bash 脚本,接受时间范围参数,底层去调用 git 命令。时间范围不传的话,提供默认的 1.day。
执行脚本时,先通过 git config --get user.name
取得当前 git 用户名,再将这个名字和传入的时间注入到刚才那个非常长的脚本里,就可以实现灵活输出了。
这里读者朋友可以试着实现。
结尾
git log 的选项非常多,这里只是简单介绍了几个,更多复杂细节的选项可以看 git 文档,本地输入 git log --help
命令者访问 https://git-scm.com/docs/git-log 页面都可以。
不过一些基本的选项就足够我们的日常工作,或者说我们更常使用的是一些图形化工具。
我是每天写日报的前端西瓜哥,欢迎关注我。