九、查看Git版本库的提交历史
在提交了若干更新,又或者克隆了某个项目之后,你也许想看下版本库提交历史。 完成这个任务最简单而又有效的工具是 git log 命令。
在版本库中执行git log命令:
$ git log
commit 2c97086779fc3d4de014689f296d77f8ea4a865f (HEAD -> master)
Author: admin <admin@com>
Date: Sun Aug 29 13:57:40 2021 +0800
修改README.txt文件
commit a235818c40c14a444a0299c1af05e9f774287dce
Author: admin <admin@com>
Date: Sun Aug 29 10:31:32 2021 +0800
添加readme文件
需要注意的是,你看到的一大串类似2c9708677…的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,会有很多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。
对于git log命令,不传入任何参数的默认情况下,git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面。 正如你所看到的,这个命令会列出每个提交的 commit id、作者的名字和电子邮件地址、提交时间以及提交说明。
git log有一个非常有用的参数是--pretty。这个选项可以使用不同于默认格式的方式展示提交历史。 这个选项有一些内建的子选项供你使用。 比如 oneline 会将每个提交放在一行显示,在浏览大量的提交时非常有用。
$ git log --pretty=oneline
93f5bdb0f438321284a3d192ddbb094989ea280b (HEAD -> Devlopment) 添加设计文档
2c97086779fc3d4de014689f296d77f8ea4a865f (master) 修改README.txt文件
a235818c40c14a444a0299c1af05e9f774287dce 添加readme文件
最有意思的是 format ,可以定制记录的显示格式。 这样的输出对后期提取分析格外有用——因为你知道输出的格式不会随着 Git 的更新而发生改变:
$ git log --pretty=format:"%h - %an, %ar : %s"
93f5bdb - admin, 3 minutes ago : 添加设计文档
2c97086 - admin, 3 hours ago : 修改README.txt文件
a235818 - admin, 6 hours ago : 添加readme文件
下表列出了 format 接受的常用格式占位符的写法及其代表的意义。
选项 | 说明 |
---|---|
%H | 提交的完整哈希值 |
%h | 提交的简写哈希值 |
%T | 树的完整哈希值 |
%t | 树的简写哈希值 |
%P | 父提交的完整哈希值 |
%p | 父提交的简写哈希值 |
%an | 作者名字 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(可以用 --date=选项 来定制格式) |
%ar | 作者修订日期,按多久以前的方式显示 |
%cn | 提交者的名字 |
%ce | 提交者的电子邮件地址 |
%cd | 提交日期 |
%cr | 提交日期(距今多长时间) |
%s | 提交说明 |
一定奇怪 作者 和 提交者 之间究竟有何差别, 其实作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。 所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者。
当 oneline 或 format 与另一个 log 选项 --graph 结合使用时尤其有用。 这个选项会以图谱的形式来形象地展示你的分支、合并历史:
$ git log --all --oneline --graph
该命令的执行结果如下图所示:
下表列出了git log 的常用的选项,以及它们是如何影响 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 合用的简写。 |
除了定制输出格式的选项之外,git log 还有许多非常实用的限制输出长度的选项,也就是只输出一部分的提交。 比如只输出最近的两次提交信息, 实际上,你可以使用类似 -<n> 的选项,其中的 n 可以是任何整数,表示仅显示最近的 n 条提交。
$ git log --oneline -2
aeb65f4 (HEAD -> master) 添加需求文档
2c97086 修改README.txt文件
git log的命令非常强大,也非常有用,关于git log的其他高级使用方式在需要的时候参考Git官方手册或参考其他资料。