查看提交历史
在创建了多个提交之后,或者如果克隆了一个具有现有提交历史的存储库,可能会想要回顾一下发生了什么。最基本和强大的工具就是 git log 命令。
运行下git log查看下输出状态
默认情况下,不带任何参数运行 git log 命令会以逆时间顺序列出该存储库中所做的提交;也就是说,最近的提交会先显示。正如所看到的,这个命令会列出每个提交及其 SHA-1 校验和、作者的姓名和电子邮件、编写日期以及提交消息。
git log 命令提供了大量丰富的选项,以便准确地显示所需要的信息。在这里,我们将展示一些最常用的选项。
其中一个更有帮助的选项是 -p 或 --patch,它显示每个提交引入的差异(补丁输出)。还可以限制显示的日志条目数量,比如使用 -2 只显示最近的两个条目。
这个选项显示相同的信息,但在每个条目后面直接跟着一个 diff。这对于代码审查或快速浏览协作者添加的一系列提交期间发生了什么非常有帮助。还可以使用一系列的摘要选项来使用 git log。例如,如果想要为每个提交看到一些简略的统计信息,你可以使用 --stat 选项:
如所见,--stat 选项在每个提交条目下打印了一个修改的文件列表,显示了有多少文件被修改以及这些文件中添加和删除了多少行。它还在最后放置了一个摘要信息。
另一个非常有用的选项是 --pretty。这个选项可以将日志输出格式更改为除默认格式之外的其他格式。有几个预定义的选项值可供使用。对于这个选项,oneline 值会将每个提交打印在单独的一行上,这在查看大量提交时非常有用。此外,short、full 和 fuller 值以大致相同的格式显示输出,但信息量更少或更多,分别如此:
最有趣的选项值是 format,它允许指定自己的日志输出格式。当生成用于机器解析的输出时,这是特别有用的------因为明确指定了格式,所以知道它不会随着 Git 的更新而改变。
git log --pretty=format 的一些更有用的格式说明符如下:
|-------------------|-------------------------------------------------|
| Specifier | Description of Output |
| %H | Commit hash |
| %h | Abbreviated commit hash |
| %T | Tree hash |
| %t | Abbreviated tree hash |
| %P | Parent hashes |
| %p | Abbreviated parent hashes |
| %an | Author name |
| %ae | Author email |
| %ad | Author date (format respects the --date=option) |
| %ar | Author date, relative |
| %cn | Committer name |
| %ce | Committer email |
| %cd | Committer date |
| %cr | Committer date, relative |
| %s | Subject |
可能想知道作者(author)和提交者(committer)之间的区别是什么。作者是最初编写工作的人,而提交者是最后应用工作的人。所以,如果向一个项目提交一个补丁,然后核心成员之一应用了这个补丁,那么你和核心成员都会得到认可------你作为作者,核心成员作为提交者。我们稍后在分布式 Git 中会更详细地介绍这个区别。
oneline 和 format 选项值特别适用于另一个名为 --graph 的日志选项。该选项添加了一个漂亮的小ASCII图,显示了分支和合并历史:
随着我们在下一章中介绍分支和合并,这种类型的输出将变得更加有趣。
这只是 git log 的一些简单输出格式选项,还有许多其他选项。常见的 git log 选项列出了我们到目前为止已经介绍的选项,以及一些其他常用的格式选项,可能会对日志命令的输出产生影响。
|-----------------|------------------------------------------------------------------------------------------------------------------------------------------|
| Option | Description |
| -p | Show the patch introduced with each commit. |
| --stat | Show statistics for files modified in each commit. |
| --shortstat | Display only the changed/insertions/deletions line from the --stat command. |
| --name-only | Show the list of files modified after the commit information. |
| --name-status | Show the list of files affected with added/modified/deleted information as well. |
| --abbrev-commit | Show only the first few characters of the SHA-1 checksum instead of all 40. |
| --relative-date | Display the date in a relative format (for example, "2 weeks ago") instead of using the full date format. |
| --graph | Display an ASCII graph of the branch and merge history beside the log output. |
| --pretty | Show commits in an alternate format. Option values include oneline, short, full, fuller, and format (where you specify your own format). |
| --oneline | Shorthand for --pretty=oneline --abbrev-commit used together. |
限制log输出
除了输出格式选项外,git log 还接受许多有用的限制选项;也就是说,这些选项允许只显示一部分提交。已经见过其中一种选项了-------2 选项,它只显示最近的两次提交。实际上,不太可能经常使用这个选项,因为 Git 默认会将所有输出通过一个分页器进行分页,所以一次只能看到一页的日志输出。
然而,时间限制选项,比如 --since 和 --until,非常有用。例如,下面的命令获取了在过去两周内进行的提交列表:
这个命令可以使用许多格式------可以指定一个特定的日期,比如 "2008-01-15",或者一个相对日期,比如 "2 years 1 day 3 minutes ago"。
还可以将列表过滤为符合某些搜索条件的提交。--author 选项允许你根据特定的作者进行过滤,--grep 选项则允许你在提交消息中搜索关键词。
说明:可以指定多个 --author 和 --grep 搜索条件的实例,这将限制提交输出为与任何 --author 模式和任何 --grep 模式匹配的提交;然而,添加 --all-match 选项将进一步限制输出,只显示与所有 --grep 模式匹配的提交。
另一个非常有帮助的过滤器是 -S 选项(俗称 Git 的"锤子"选项),它接受一个字符串,并仅显示更改了该字符串出现次数的提交。例如,如果想找到最后一次添加或移除对特定函数引用的提交,可以调用:
$ git log -S function_name
作为过滤器传递给 git log 的另一个非常有用的选项是路径。如果指定一个目录或文件名,可以将日志输出限制为引入了对这些文件的更改的提交。这通常是最后一个选项,并且通常在路径之前使用双破折号(--)进行分隔:
$ git log -- path/to/file
在用于限制 git log 输出的选项中,我们将列出这些以及其他一些常见的选项供参考。
|-------------------|------------------------------------------------------------------------------|
| Option | Description |
| -<n> | Show only the last n commits. |
| --since, --after | Limit the commits to those made after the specified date. |
| --until, --before | Limit the commits to those made before the specified date. |
| --author | Only show commits in which the author entry matches the specified string. |
| --committer | Only show commits in which the committer entry matches the specified string. |
| --grep | Only show commits with a commit message containing the string. |
| -S | Only show commits adding or removing code matching the string. |