五、Git查看提交历史

如果想要查看提交历史,可以使用git log命令。

现在来看看我们学习了这么久,都进行了哪些提交:

$ git log # 查看提交历史,这里只贴了部分
commit 6a1006ae257767ef55ee588cf9481eb49a369921 (HEAD -> master) # SHA-1校验和·    1-
Author: hahaha <orcale.io@gmail.com> # 作者的名字和邮箱
Date:   Fri Sep 25 18:31:06 2020 +0800 # 提交时间

    rename app.txt -> application.txt # 提交说明

commit cfef1ea425a67883dba89d4b0d4503cda1648adb
Author: hahaha <orcale.io@gmail.com>
Date:   Fri Sep 25 18:18:22 2020 +0800

    delete readme.txt from repository and stage

commit d5051a2d851d6d5e02a4d4d8808f72af42ea38f0
Author: hahaha <orcale.io@gmail.com>
Date:   Fri Sep 25 18:10:06 2020 +0800

    delete test.txt

commit d1e9096cdee2ddca0c8213f887e02607d8b88b45
Author: hahaha <orcale.io@gmail.com>
Date:   Fri Sep 25 16:58:12 2020 +0800

    use commit -a -m  command to commit
......

在不传入任何参数的情况下,git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面。这个命令会列出每个提交的 SHA-1 校验和作者的名字和电子邮件地址、提交时间以及提交说明。

git log 有许多参数可以选择,-p--patch ,它会显示每次提交所引入的差异(按 补丁 的格式输出),你也可以限制显示的日志条目数量,例如使用 -2 选项来只显示最近的两次提交:

$ git log -p -2
commit 6a1006ae257767ef55ee588cf9481eb49a369921 (HEAD -> master)
Author: hahaha <orcale.io@gmail.com>
Date:   Fri Sep 25 18:31:06 2020 +0800

    rename app.txt -> application.txt

diff --git a/app.txt b/application.txt
similarity index 100%
rename from app.txt
rename to application.txt

commit cfef1ea425a67883dba89d4b0d4503cda1648adb
Author: hahaha <orcale.io@gmail.com>
Date:   Fri Sep 25 18:18:22 2020 +0800

    delete readme.txt from repository and stage

diff --git a/readme.txt b/readme.txt
deleted file mode 100644
index bcb9d8f..0000000
--- a/readme.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Git is a version control system.
-Git is free software.
-Git has a mutable index called stage.
-Git is so good
-Linus is god
-add app.txt file
-add google.txt file
-test git diff

该选项除了显示基本信息之外,还附带了每次提交的变化。 当进行代码审查,或者快速浏览某个同事的提交所带来的变化的时候,这个参数就非常有用了。

如果你想看到每次提交的简略统计信息,可以使用 --stat 参数:

$ git log --stat
commit 6a1006ae257767ef55ee588cf9481eb49a369921 (HEAD -> master)
Author: hahaha <orcale.io@gmail.com>
Date:   Fri Sep 25 18:31:06 2020 +0800

    rename app.txt -> application.txt

 app.txt => application.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit cfef1ea425a67883dba89d4b0d4503cda1648adb
Author: hahaha <orcale.io@gmail.com>
Date:   Fri Sep 25 18:18:22 2020 +0800

    delete readme.txt from repository and stage

 readme.txt | 8 --------
 1 file changed, 8 deletions(-)
 
 ......
 
commit c8731ea86c01c6e9597c14189651df80b1701395
Author: hahaha <orcale.io@gmail.com>
Date:   Fri Sep 25 16:53:37 2020 +0800

    commit by xxx
# 被修改的文件  受影响的行数     +表示添加,-表示删除,符号个数表示添加或删除了多少行
 readme.txt |    3              ++-
 test.txt   |    3              ++-
 2 files changed, 4 insertions(+), 2 deletions(-) # 总结

--stat 参数在每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了。 在每次提交的最后还有一个总结。

另一个非常有用的选项是 --pretty。 这个选项可以使用不同于默认格式的方式展示提交历史。 这个选项有一些内建的子选项供你使用。 比如 oneline 会将每个提交放在一行显示,在浏览大量的提交时非常有用。 另外还有 shortfullfuller 选项,它们展示信息的格式基本一致,但是详尽程度不一:

$ git log --pretty=oneline
6a1006ae257767ef55ee588cf9481eb49a369921 (HEAD -> master) rename app.txt -> application.txt
cfef1ea425a67883dba89d4b0d4503cda1648adb delete readme.txt from repository and stage
d5051a2d851d6d5e02a4d4d8808f72af42ea38f0 delete test.txt
d1e9096cdee2ddca0c8213f887e02607d8b88b45 use commit -a -m  command to commit
c8731ea86c01c6e9597c14189651df80b1701395 commit by xxx
f2e4019f887c78efefb9e33939fe9fa9fe10a4da add file .gitignore
b9cb70fb52a212cd017a4d62b6ed60d434d79fa5 update file content and add app.txt google.txt
0086f1a9f1f1152ec52aa9f526e870b0618138a3 update readme.txt
8ec32e3bc32518befcb10740cd6e58dd6c5f7a96 understand how stage works
d1bdde3d4757173c06ed6cf4ac005c39c00ddf58 write a readme file

如果你想定制记录的显示格式,可以使用format,这样的输出对后期提取分析格外有用:

$ git log --pretty=format:"%h - %an, %ar : %s"
6a1006a - hahaha, 63 minutes ago : rename app.txt -> application.txt
cfef1ea - hahaha, 76 minutes ago : delete readme.txt from repository and stage
d5051a2 - hahaha, 84 minutes ago : delete test.txt
d1e9096 - hahaha, 3 hours ago : use commit -a -m  command to commit
c8731ea - hahaha, 3 hours ago : commit by xxx
f2e4019 - hahaha, 5 hours ago : add file .gitignore
b9cb70f - hahaha, 7 hours ago : update file content and add app.txt google.txt
0086f1a - hahaha, 2 days ago : update readme.txt
8ec32e3 - hahaha, 2 days ago : understand how stage works
d1bdde3 - hahaha, 2 days ago : write a readme file

git log --pretty=format 接受的常用格式占位符的写法及其代表的意义:

选项 说明
%H 提交的完整哈希值
%h 提交的简写哈希值
%T 树的完整哈希值
%t 树的简写哈希值
%P 父提交的完整哈希值
%p 父提交的简写哈希值
%an 作者名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 --date=选项 来定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期(距今多长时间)
%s 提交说明

作者和提交者的区别:

作者:实际对项目做出修改的人

提交者:将作者对项目做出的修改提交的仓库的人,更多时候,作者和提交者都为同一人。

onelineformat 与另一个 log 选项 --graph 结合使用时尤其有用。 这个选项添加了一些 ASCII 字符串来形象地展示你的分支、合并历史:

$ git log --pretty=formt:"%h %s" --graph # 还没有将分支,所以这个看不到效果,之后将分支时再演示

git log 的常用选项:

选项 说明
-p 按补丁格式显示每个提交引入的差异。
--stat 显示每次提交的文件修改统计信息。
--shortstat 只显示 --stat 中最后的行数修改添加移除统计。
--name-only 仅在提交信息后显示已修改的文件清单。
--name-status 显示新增、修改、删除的文件清单。
--abbrev-commit 仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。
--relative-date 使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。
--graph 在日志旁以 ASCII 图形显示分支与合并历史。
--pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。
--oneline --pretty=oneline --abbrev-commit 合用的简写。

限制输出长度

我们可以使用-<n>选项限制输出长度,其中n可以是任何整数,表示显示最近的n条提交,例如前面提到的-2,显示最近的两条提交。不过这个不是很实用,如果输入的数字过大,git默认会自动分页,所以一次也就只能看到一页的内容。

但是,类似 --since--until 这种按照时间作限制的选项很有用。 例如,下面的命令会列出最近一周的所有提交:

$ git log --since=1.weeks # 最近一周的所有提交
$ git log --since="1 day ago"  # 一天前的提交,下面是一天前的提交
commit 6a1006ae257767ef55ee588cf9481eb49a369921 (HEAD -> master)
Author: hahaha <orcale.io@gmail.com>
Date:   Fri Sep 25 18:31:06 2020 +0800

    rename app.txt -> application.txt

commit cfef1ea425a67883dba89d4b0d4503cda1648adb
Author: hahaha <orcale.io@gmail.com>
Date:   Fri Sep 25 18:18:22 2020 +0800

    delete readme.txt from repository and stage

commit d5051a2d851d6d5e02a4d4d8808f72af42ea38f0
Author: hahaha <orcale.io@gmail.com>
Date:   Fri Sep 25 18:10:06 2020 +0800

    delete test.txt

commit d1e9096cdee2ddca0c8213f887e02607d8b88b45
Author: hahaha <orcale.io@gmail.com>
Date:   Fri Sep 25 16:58:12 2020 +0800

    use commit -a -m  command to commit

commit c8731ea86c01c6e9597c14189651df80b1701395
Author: hahaha <orcale.io@gmail.com>
Date:   Fri Sep 25 16:53:37 2020 +0800

    commit by xxx

该命令可用的格式十分丰富——可以是类似 "2020-01-15" 的具体的某一天,也可以是类似 "1 years 1 day 3 minutes ago" 的相对日期。

还可以过滤出匹配指定条件的提交。 用 --author 选项显示指定作者的提交,用 --grep 选项搜索提交说明中的关键字。

$ git log --author="hehehe" --grep="rename" # 查看用户名为"hahaha" 并且 提交说明中有rename关键字的提交
commit 6a1006ae257767ef55ee588cf9481eb49a369921 (HEAD -> master)
Author: hahaha <orcale.io@gmail.com>
Date:   Fri Sep 25 18:31:06 2020 +0800

    rename app.txt -> application.txt

你可以指定多个 --author--grep 搜索条件,这样会只输出 任意 匹配 --author 模式和 --grep 模式的提交。然而,如果你添加了 --all-match 选项, 则只会输出 所有 匹配 --grep 模式的提交。

另一个非常有用的过滤器是 -S, 它接受一个字符串参数,并且只会显示那些添加或删除了该字符串的提交。 假设你想找出添加或删除了对某一个特定函数的引用的提交,可以调用:

$ git log -S function_name

最后一个很实用的 git log 选项是路径(path), 如果只关心某些文件或者目录的历史提交,可以在 git log 选项的最后指定它们的路径。 因为是放在最后位置上的选项,所以用两个短划线(--)隔开之前的选项和后面限定的路径名。

$ git log -- app.txt # 查看app.txt的相关提交,如果是在某个文件夹下,应该写成git log -- xxx/app.txt

git log的选项

选项 说明
-<n> 仅显示最近的 n 条提交。
--since, --after 仅显示指定时间之后的提交。
--until, --before 仅显示指定时间之前的提交。
--author 仅显示作者匹配指定字符串的提交。
--committer 仅显示提交者匹配指定字符串的提交。
--grep 仅显示提交说明中包含指定字符串的提交。
-S 仅显示添加或删除内容匹配指定字符串的提交。

隐藏合并提交:
按照你代码仓库的工作流程,记录中可能有为数不少的合并提交,它们所包含的信息通常并不多。 为了避免显示的合并提交弄乱历史记录,可以为 log 加上 --no-merges 选项。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356