-
A1. 附录 A:其他环境下的 Git
- A1.1 图形界面
- A1.2 Visual Studio 中的 Git
- A1.3 Visual Studio Code 中的 Git
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的 Git
- A1.5 Sublime Text 中的 Git
- A1.6 Bash 中的 Git
- A1.7 Zsh 中的 Git
- A1.8 PowerShell 中的 Git
- A1.9 总结
-
A2. 附录 B:在应用程序中嵌入 Git
-
A3. 附录 C:Git 命令
2.3 Git 基础 - 查看提交历史
查看提交历史
在创建了若干提交之后,或是克隆了一个已有提交历史的仓库,通常会想要查看下提交历史记录。完成这个任务最基础也最强大的工具是 git log
命令。
下面的例子会用到一个名为 “simplegit” 的简单项目。 要获取该项目,请运行
$ git clone https://github.com/schacon/simplegit-progit
如果在这个项目运行 git log
,你应该会得到类似下面的输出
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
Remove unnecessary test
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
Initial commit
默认不用任何参数的情况下,git log
会按提交时间列出所有的更新,最近的更新排在最上面。正如你所看到的,这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮箱、提交日期以及提交说明。
git log
命令提供了大量的选项来帮助你搜寻提交历史。 在这里,我们介绍些常用的。
其中,最常用的选项可能是 -p
或 --patch
,该选项会显示每次提交所引入的差异(patch 输出)。 你也可以限制显示的日志条目数量,例如使用 -2
来只显示最近两次提交。
$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = "simplegit"
- s.version = "0.1.0"
+ s.version = "0.1.1"
s.author = "Scott Chacon"
s.email = "schacon@gee-mail.com"
s.summary = "A simple gem for using Git in Ruby code."
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
Remove unnecessary test
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index a0a60ae..47c6340 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -18,8 +18,3 @@ class SimpleGit
end
end
-
-if $0 == __FILE__
- git = SimpleGit.new
- puts git.show
-end
该选项显示相同的信息,但是会在每条提交记录后附带一条差异信息。 这对代码审查或者快速浏览协作者提交的更新时非常有用。 除了上面介绍的,你还可以使用一系列的总结性选项。 例如,如果你想看到每次提交的简略统计信息,可以使用 --stat
选项
$ git log --stat
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
Rakefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
Remove unnecessary test
lib/simplegit.rb | 5 -----
1 file changed, 5 deletions(-)
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
Initial commit
README | 6 ++++++
Rakefile | 23 +++++++++++++++++++++++
lib/simplegit.rb | 25 +++++++++++++++++++++++++
3 files changed, 54 insertions(+)
正如你所见,--stat
选项在每个提交条目下方打印一个修改文件的列表,显示有多少文件被更改,以及这些文件中添加和删除了多少行。它还在最后总结了这些信息。
另一个非常有用的选项是 --pretty
。此选项将日志输出更改为默认格式以外的其他格式。您可以使用一些预构建的选项值。此选项的 oneline
值将每个提交打印在单行上,如果您要查看大量提交,这将非常有用。此外,short
、full
和 fuller
值以大致相同的格式显示输出,但分别包含更少或更多的信息。
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 Change version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Remove unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 Initial commit
最有趣的选项值是 format
,它允许您指定自己的日志输出格式。当您生成用于机器解析的输出时,这尤其有用,因为您显式地指定了格式,所以您知道它不会随着 Git 的更新而更改。
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : Change version number
085bb3b - Scott Chacon, 6 years ago : Remove unnecessary test
a11bef0 - Scott Chacon, 6 years ago : Initial commit
git log --pretty=format
的有用说明符 列出了 format
可以使用的一些更有用的说明符。
说明符 | 输出描述 |
---|---|
|
提交哈希值 |
|
缩写的提交哈希值 |
|
树哈希值 |
|
缩写的树哈希值 |
|
父哈希值 |
|
缩写的父哈希值 |
|
作者姓名 |
|
作者电子邮件 |
|
作者日期(格式遵循 |
|
作者日期,相对时间 |
|
提交者姓名 |
|
提交者电子邮件 |
|
提交者日期 |
|
提交者日期,相对时间 |
|
主题 |
您可能想知道 *author* 和 *committer* 之间有什么区别。作者是最初编写工作的人,而提交者是最后应用工作的人。因此,如果您向项目提交一个补丁,并且其中一个核心成员应用了该补丁,那么你们两个都会获得认可 — 您作为作者,核心成员作为提交者。我们将在 分布式 Git 中更详细地介绍这种区别。
oneline
和 format
选项值与另一个名为 --graph
的 log
选项特别有用。此选项添加了一个漂亮的 ASCII 图,显示了您的分支和合并历史记录。
$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 Ignore errors from SIGCHLD on trap
* 5e3ee11 Merge branch 'master' of https://github.com/dustin/grit.git
|\
| * 420eac9 Add 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
当我们将在下一章中介绍分支和合并时,这种类型的输出将变得更有趣。
这些只是 git log
的一些简单的输出格式化选项 — 还有更多。git log
的常用选项 列出了我们到目前为止介绍的选项,以及其他一些可能有用的常用格式化选项,以及它们如何更改 log
命令的输出。
选项 | 描述 |
---|---|
|
显示每个提交引入的补丁。 |
|
显示每个提交中修改文件的统计信息。 |
|
仅显示来自 |
|
在提交信息后显示修改文件的列表。 |
|
显示受影响的文件列表以及添加/修改/删除信息。 |
|
仅显示 SHA-1 校验和的前几个字符,而不是全部 40 个字符。 |
|
以相对格式(例如,“2 weeks ago”)显示日期,而不是使用完整的日期格式。 |
|
在日志输出旁边显示分支和合并历史记录的 ASCII 图。 |
|
以备用格式显示提交。选项值包括 |
|
一起使用的 |
限制日志输出
除了输出格式化选项外,git log
还接受许多有用的限制选项;也就是说,允许您仅显示提交子集的选项。您已经看过其中一个选项 — -2
选项,它仅显示最后两个提交。实际上,您可以执行 -<n>
,其中 n
是任何整数,以显示最后的 n
个提交。实际上,您不太可能经常使用它,因为默认情况下,Git 通过分页器管道传输所有输出,因此您一次只能看到一页日志输出。
但是,诸如 --since
和 --until
之类的时限选项非常有用。例如,此命令获取过去两周内所做的提交列表。
$ git log --since=2.weeks
此命令适用于多种格式 — 您可以指定一个特定的日期,例如 "2008-01-15"
,或者一个相对日期,例如 "2 years 1 day 3 minutes ago"
。
您还可以将列表过滤为与某些搜索条件匹配的提交。--author
选项允许您按特定作者进行过滤,而 --grep
选项允许您在提交消息中搜索关键字。
注意
|
您可以指定多个 |
另一个非常有用的过滤器是 -S
选项(通常称为 Git 的“镐头”选项),它接受一个字符串,并且仅显示更改该字符串出现次数的那些提交。例如,如果您想查找添加或删除对特定函数的引用的最后一次提交,您可以调用
$ git log -S function_name
作为过滤器传递给 git log
的最后一个非常有用的选项是路径。如果指定目录或文件名,则可以将日志输出限制为对这些文件引入更改的提交。这始终是最后一个选项,通常以双破折号 (--
) 开头,以将路径与选项分开。
$ git log -- path/to/file
在 限制 git log
输出的选项 中,我们将列出这些选项以及其他一些常用选项以供您参考。
选项 | 描述 |
---|---|
|
仅显示最后的 n 个提交。 |
|
将提交限制为在指定日期之后进行的提交。 |
|
将提交限制为在指定日期之前进行的提交。 |
|
仅显示作者条目与指定字符串匹配的提交。 |
|
仅显示提交者条目与指定字符串匹配的提交。 |
|
仅显示包含字符串的提交消息的提交。 |
|
仅显示添加或删除与字符串匹配的代码的提交。 |
例如,如果您想查看 2008 年 10 月期间,由 Junio Hamano 提交的,对 Git 源代码历史记录中测试文件的修改提交,并且不是合并提交,则可以运行如下命令
$ git log --pretty="%h - %s" --author='Junio C Hamano' --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
在 Git 源代码历史记录中的近 40,000 个提交中,此命令显示了与这些条件匹配的 6 个提交。
提示
|
阻止显示合并提交
根据您的存储库中使用的工作流程,您的日志历史记录中相当大比例的提交可能只是合并提交,这些提交通常不是很信息量。要阻止合并提交混乱您的日志历史记录,只需添加 |