Git笔记(6) 查看提交历史


1. 提交历史

在提交了若干更新,又或者克隆了某个项目之后
也许想回顾下提交历史

完成这个任务最简单而又有效的工具是 git log 命令。

使用 “simplegit” 项目作为示例
首先克隆该项目:

$ git clone https://github.com/schacon/simplegit-progit

2. 查看

在此项目中运行 git log 命令时,可以看到下面的输出:

在这里插入图片描述
默认情况下,git log按时间先后顺序 列出所有的提交,最近的更新排在最上面
列出了每个提交的 SHA-1 校验和、作者名字和电子邮件地址、提交时间以及提交说明


3. 常用选项

选项 说明
-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

3.1. 差异

其中一个比较有用的选项是 -p,它会显示每次提交所引入的差异
与此同时,也可以使用 -2 选项来仅显示最近的两次提交

$ git log -p -2

在这里插入图片描述
该选项除了显示基本信息之外,还附带了每次 commit 的变化

适用于当进行代码审查
或者快速浏览某个搭档提交所带来的变化的时候


3.2. 总结

可以使用 --stat 选项,查看每次提交的简略统计信息:

$ git log --stat

在这里插入图片描述
在每次提交的下面列出所有被修改过的文件、有多少文件被修改了


3.3. 自定义格式

可以使用 --pretty选项,自定义格式的方式展示提交历史
这个选项有一些内建的 子选项


3.3.1. 整合一行

比如 oneline 会将每个提交 放在一行显示,在浏览大量的提交时非常有用

在这里插入图片描述


3.3.2. 详尽程度

另外还有 shortfullfuller 选项,它们展示信息的 格式详尽程度 不一:

在这里插入图片描述


3.3.3. 定制格式

还有 format,可以 定制要显示的记录格式
这样的输出对后期提取分析格外有用

$ git log --pretty=format:"%h - %an, %ar : %s"

在这里插入图片描述
下表列出了常用的格式占位符写法及其代表的意义:

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

作者:实际作出修改的人
提交者:最后将此工作成果提交到仓库的人

所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时
你就是作者,而那个核心成员就是提交者


3.4. 形象展示

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

$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
*  5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Added a method for getting the current branch.
* | 30e367c timeout code and tests
* | 5a09431 add timeout protection to grit
* | e1193f8 support for heads with slashes in them
|/
* d6016bc require time for xmlschema
*  11d191e Merge branch 'defunkt' into local

3.5. 限制输出长度

Git 默认会将所有的输出传送到 分页程序
所以一次只会看到一页的内容

除了定制输出格式的选项之外,
git log 还有许多非常实用的限制输出长度的选项,也就是只输出一部分的提交

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

3.5.1. 时间

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

$ git log --since=2.weeks

该命令可用的格式十分丰富——可以是类似 “2014-11-10” 的具体的某一天
也可以是类似 “2 years 1 day 3 minutes ago” 的相对日期


3.5.2. 过滤

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

请注意,如果要 同时对作者和提交说明进行过滤 就必须添加 –all-match 选项
否则该命令将会匹配满足其中任意一个条件的提交

另一个非常有用的过滤器是 -S
它接受一个字符串参数,并且只会显示那些添加或删除了该字符串的提交

假设想找出添加或删除了对某一个特定函数的引用的提交,可以调用:

$ git log -Sfunction_name

3.5.3. 路径

如果只关心某些文件或者目录的历史提交
可以在 git log 选项的最后指定它们的路径(path)

在这里插入图片描述

因为是放在最后位置上的选项
所以用两个短划线(–)隔开之前的选项和后面限定的路径名


3.5.4. 实例

如果要查看 2008 年 10 月期间 Git 源代码仓库中
由 Junio Hamano 提交的修改了测试文件并且尚未合并的提交,可以使用下面的命令:

$ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \
   --before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attributes are in use
acd3b9e - Enhance hold_lock_file_for_{update,append}() API
f563754 - demonstrate breakage of detached checkout with symbolic link HEAD
d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths
51a94af - Fix "checkout --track -b newbranch" on detached HEAD
b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch

在近 40000 条提交中,上面的输出仅列出了符合条件的 6 条记录


参考: git

以上内容,均根据git官网介绍删减、添加和修改组成


相关推荐:

Git笔记(5) 状态记录
Git笔记(4) 获取仓库
Git笔记(3) 安装配置
Git笔记(2) 入门认知
Git笔记(1) 版本控制


谢谢

发布了231 篇原创文章 · 获赞 299 · 访问量 294万+

猜你喜欢

转载自blog.csdn.net/qq_32618327/article/details/104258107