0. 概述 git log 是查看git提交记录的一个命令,它有非常多的控制参数和选项,合理使用的话,可以达到任何的精准控制目的。这里列一些日常使用可能会用到的用法,全部的用法,请在命令行git help log
查看。
1. 基本用法 1.1. 无参数 使用git log
,会从新到旧显示所有的提交记录,按j
往下翻页,按k
往上翻页, 按q
退出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 commit 869cc0a22aea80d34f0728e184842bdea42fe43b (HEAD -> master, origin/master, origin/HEAD) Merge: 78aaac39 2e872840 Author: Johan Mabille <johan.mabille@gmail.com> Date: 2021-04-10 02:29:06 +0200 Merge pull request Refactoring of xchunked_view commit 2e872840a7ebc3e4e8b0f84cbae39360503243b1 Author: Johan Mabille <johan.mabille@gmail.com> Date: 2021-04-09 16:59:16 +0200 One xchunk_iterator to rule them all commit 42fc49080522c94ea784541b53ef302ccb0344c0 Author: Johan Mabille <johan.mabille@gmail.com> Date: 2021-04-08 22:40:14 +0200 Refactoring of xchunked_view ....
通过增加-<n>
选项来显示最近n次的提交记录,如git log -2
仅显示最近的2次提交;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 commit 869cc0a22aea80d34f0728e184842bdea42fe43b (HEAD -> master, origin/master, origin/HEAD) Merge: 78aaac39 2e872840 Author: Johan Mabille <johan.mabille@gmail.com> Date: 2021-04-10 02:29:06 +0200 Merge pull request Refactoring of xchunked_view commit 2e872840a7ebc3e4e8b0f84cbae39360503243b1 Author: Johan Mabille <johan.mabille@gmail.com> Date: 2021-04-09 16:59:16 +0200 One xchunk_iterator to rule them all
此外如果想显示每次提交代码修改的地方,可以增加-p
参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 commit 869cc0a22aea80d34f0728e184842bdea42fe43b (HEAD -> master, origin/master, origin/HEAD) Merge: 78aaac39 2e872840 Author: Johan Mabille <johan.mabille@gmail.com> Date: 2021-04-10 02:29:06 +0200 Merge pull request #2353 from JohanMabille/chunk Refactoring of xchunked_view commit 2e872840a7ebc3e4e8b0f84cbae39360503243b1 Author: Johan Mabille <johan.mabille@gmail.com> Date: 2021-04-09 16:59:16 +0200 One xchunk_iterator to rule them all @@ -126,10 +128,16 @@ namespace xt template <class S> const_stepper stepper_end(const S& shape, layout_type) const noexcept; - const shape_type& chunk_shape() const; + const shape_type& chunk_shape() const noexcept; + size_type grid_size() const noexcept; + const shape_type& grid_shape() const noexcept; + chunk_storage_type& chunks(); const chunk_storage_type& chunks() const; + chunk_iterator_type chunk_begin(); + chunk_iterator_type chunk_end();
1.2. 显示统计信息 增加--stat
选项可以显示某次提交文件的修改信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 commit 869cc0a22aea80d34f0728e184842bdea42fe43b (HEAD -> master, origin/master, origin/HEAD) Merge: 78aaac39 2e872840 Author: Johan Mabille <johan.mabille@gmail.com> Date: 2021-04-10 02:29:06 +0200 Merge pull request Refactoring of xchunked_view commit 2e872840a7ebc3e4e8b0f84cbae39360503243b1 Author: Johan Mabille <johan.mabille@gmail.com> Date: 2021-04-09 16:59:16 +0200 One xchunk_iterator to rule them all include/xtensor/xchunked_array.hpp | 45 ++++++++++- include/xtensor/xchunked_assign.hpp | 246 +++++++++++++++++++++++++++++++++++++++++++++------------- include/xtensor/xchunked_view.hpp | 164 +++++++++++---------------------------- 3 files changed, 280 insertions(+), 175 deletions(-)
1.3. 过滤选项 默认所有的提交都显示,如果我们想搜索某段时间或某个人的提交记录,该怎么办呢?git提供了详细的命令来进行过滤,下面详细举例说明。
1.3.1. 过滤作者 通过--author
选项可以只显示某个人的提交记录,以这个仓库为例,下面的写法(FirstName,LastName, Email, FirstName + LastName, FirstName + LastName + Email)都可以:
1 2 3 4 5 git log --author=Johan git log --author=Mabille git log --author=johan.mabille@gmail.com git log --author="Johan Mabille" git log --author="Johan Mabille <johan.mabille@gmail.com>"
1.3.2. 过滤代码关键字 通过-S<keyword>
的形式可以搜索代码中增加或删除keyword
的提交记录,比如git log -Sxchunked_array
就会显示所有关于xchunked_array
关键字的提交。结合前面的-p
和-<n>
参数,我们能很好的达到我们的搜索目的,比如只显示最近两次提交中关键词的修改内容:
1 git log -Sxchunked_array -p -2
1.3.3. 过滤提交信息中的关键字 此外还可以利用--grep
选项来对commit内容进行过滤,比如我们想搜索所有包含fix
的提交:
1.3.4. 过滤日期 另一个很有用的选项是根据日期来过滤提交。日期过滤有好多形式,比如今年以来的提交,最近一周的提交,git提供了详细的控制命令,具体如下表:
关键词
说明
例子
after=
从xxx到现在的所有提交
after=”2020-01-01”
since=
从xxx到现在的所有提交,与after同义
since=”2020-01-01”
before=
xxx之前的所有提交
before=”2020-01-01”
until=
xxx之前的所有提交,与before同义
until=”2020-01-01”
日期格式如下:
时间格式
说明
例子
YYYY-MM-DD
到某个具体日期的提交
since=2020-01-01
n.minute
n分钟内的提交
since=3.minute
n.hour
n小时内的提交
since=3.hour
n.day
n天内的提交
since=3.day
n.week
n周内的提交
since=3.week
n.month
n个月内的提交
since=3.month
n.year
n年内的提交
since=1.year
组合
上述形式的组合
since=1.year,10.month
比如要显示2天内的所有提交,可以用下面的命令:
2. 显示格式调整 默认的显示格式比较松散,一次提交占的空间太大,有没有办法显示地更紧凑呢?是有的,可以通过--format=oneline
来设置:
1 2 3 4 869cc0a22aea80d34f0728e184842bdea42fe43b (HEAD -> master, origin/master, origin/HEAD) Merge pull request 2e872840a7ebc3e4e8b0f84cbae39360503243b1 One xchunk_iterator to rule them all 42fc49080522c94ea784541b53ef302ccb0344c0 Refactoring of xchunked_view ....
这下每条记录在一行显示,包括提交hash串,commit信息。
那么 git 支持哪些format参数呢,总结下来如下表:
格式名称 格式说明
oneline
short
1 2 3 4 commit <hash > Author: <author> <title-line>
medium
1 2 3 4 5 6 7 commit <hash > Author: <author> Date: <author-date> <title-line> <full-commit-message>
full
1 2 3 4 5 6 7 commit <hash > Author: <author> Commit: <committer> <title-line> <full-commit-message>
fuller
1 2 3 4 5 6 7 8 9 commit <hash > Author: <author> AuthorDate: <author-date> Commit: <committer> CommitDate: <committer-date> <title-line> <full-commit-message>
reference
1 <abbrev-hash> (<title-line>, <short-author-date>)
email
1 2 3 4 5 6 From <hash > <date> From: <author> Date: <author-date> Subject: [PATCH] <title-line> <full-commit-message>
还有一些别的选项,可以访问这里 详细了解。
3. 自定义显示 上述命令在某些情况下可能并不能满足我们的需求,比如--format=oneline
选项没有显示提交时间。因此我们需要自定义log显示的方式。git提供了对commit信息中各部分的描述符号,可以让我们方便地自定义log显示。
下面列出了常见的选项:
选项
全称
含义
%cd
commit date
提交日期
%H
Hash
commit 的完整哈希串
%h
hash
commit 的简短哈希串
%an
author name
提交者名字
%ae
author email
提交者邮箱
%s
message
提交信息
利用这些描述符,我们可以定制log显示格式,比如git log --format="%cd|%h|%an|%ae|%s"
就是显示提交日期,commit简短hash,提交者的名字和邮箱,以及提交内容:
1 2 3 2022-03-23 09:52:22 +0100|b2e23d05|Johan Mabille|johan.mabille@gmail.com|Merge pull request 2022-03-18 20:59:53 -0300|a5a70449|spectre-ns|dahubley@hotmail.ca|Updated C++20 option for visual studio builds C++2a no longer a valid std option. 2022-03-18 10:59:57 +0100|f603205a|Johan Mabille|johan.mabille@gmail.com|Merge pull request
4. 命令组合 git log最强大的地方在于可以组合上述所有的选项,大大缩小搜索范围,能更方便地定位到想要的提交。例如我通过下面的命令,可以将搜索范围从3711条缩小到6条:
1 2 3 4 5 6 7 8 9 10 11 12 $ git log --oneline |wc 3177 19594 159959 $ git log --since="2020-01-01" --until="2020-02-01" --grep fix --oneline af5cc6c4 Merge pull request 0f3caa37 benchmark/CMakeLists.txt: fixed a tiny spelling mistake 218dcbe7 Merge pull request 38cb9617 Merge pull request 31cbd6d2 Merge pull request f363e9d1 fix older cmak