查询
$ git log
查看提交记录
官方手册使用了simplegit项目用于演示。
$ git clone https://github.com/schacon/simplegit-progit
获取项目。
下面的例子都采用官方的项目来展示。
经常使用的参数:
-p
显示每次提交内容差异
$ git log -p -1
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the verison 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@gmail.com"
s.summary = "A simple gem for using Git in Ruby code."
这里我使用了-1
参数,如果不使用的话,Bash会自动调用分页程序,这个时候按Q
键可以终止显示。(后面都加上-1
属性,显示一条记录)
-<n>
显示最近的n次提交记录
$ git log -2
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the verison number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gmail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
removed unnecessary test code
--stat
显示每次更新的文件修改信息
$ git log --stat -1
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the verison number
Rakefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--shortstat
只显示--stat
中最后的行数修改添加删除统计
$ git log --shortstat -1
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the verison number
1 file changed, 1 insertion(+), 1 deletion(-)
--name-only
仅在提交信息后显示已修改的文件清单。
$ git log --name-only -1
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the verison number
Rakefile
--name-status
显示新增、修改、删除的文件清单。
$ git log --name-status -1
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the verison number
M Rakefile
--abbrev-commit
仅显示SHA-1的前几个字符,而非所有的40个字符。
$ git log --abbrev-commit -1
commit ca82a6d (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the verison number
--relative-date
使用较短的相对时间显示(比如,“2 weeks ago”)。
$ git log --relative-date -1
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date: 10 years ago
changed the verison number
刚开始我还没看到变化在哪里,原来只是让作者提交日期改成了多久之前的形式。
--graph
显示 ASCII 图形表示的分支合并历史。
$ git log --graph -1
* commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
| Author: Scott Chacon <schacon@gmail.com>
| Date: Mon Mar 17 21:52:11 2008 -0700
|
| changed the verison number
仔细观察是每行的前面添加*
和|
还有\
,/
等ASCII码符号,这个是和后面将要讲到的分支相关的,现在暂时放在这里。
--pretty
使用其他格式显示历史提交信息。可用的选项包括oneline
,short
,full
,fuller
,medium
,email
,raw
和format
(后跟指定格式)。
这个关键字要和后面的可用选项一起使用会有不同的显示方式。例如:
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD) changed the verison number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
其他的自己可以添加试一试。
单独再拿出来说一下format
后面要添加自定义的格式。例如:
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 10 years ago : changed the verison number
085bb3b - Scott Chacon, 10 years ago : removed unnecessary test code
a11bef0 - Scott Chacon, 10 years ago : first commit
定义格式的常用选项如下:
选项 说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 --date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
其中每一个选项都是英语单词的首字母缩写,所以很好理解。但是中间,有作者和提交者这两个身份的区别。这里官方给出的解释是:其实作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。 所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者。从我自己的理解来说,其实就不同的人为这个项目贡献源码,这个人就是作者。而提交者是这个项目的管理员,他负责管理每个作者提交的代码,最后合格的额并入最后的项目中。目前我的理解如此,后面学习到Git分布式的时候会有更细微的区别。
另外,当我们的项目记录越来越多的时候,我们需要限制指令的输出长度。如下有很多种限制方式来筛选我们想要看到的记录。
-n
之前已经提到的,仅显示最近的n
条信息
例子已有,不再重复。
--since
或者--after
仅显示指定时间之后的提交
$ git log --since=2008-5-3
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the verison number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gmail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
removed unnecessary test code
这里当初有疑惑!感觉很重要。这里我想要输出的是2008年5月3号之后的记录,但是这里显示出来的记录时间为什么是2008年3月15和17日的记录。原来,我才想起来,这里显示的是作者修改的时间信息,而不是提交时间。这里使用:$ git log –pretty=fuller
显示详细信息如下:
$ git log --pretty=fuller
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
AuthorDate: Mon Mar 17 21:52:11 2008 -0700
Commit: Scott Chacon <schacon@gmail.com>
CommitDate: Fri Apr 17 21:56:31 2009 -0700
changed the verison number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gmail.com>
AuthorDate: Sat Mar 15 16:40:33 2008 -0700
Commit: Scott Chacon <schacon@gmail.com>
CommitDate: Fri Apr 17 21:55:53 2009 -0700
removed unnecessary test code
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gmail.com>
AuthorDate: Sat Mar 15 10:31:28 2008 -0700
Commit: Scott Chacon <schacon@gmail.com>
CommitDate: Sat Mar 15 10:31:28 2008 -0700
first commit
可以看到我们之前打印出来的前两个记录的提交时间都是2009年4月17日。所以打印的结果是正确的。所以这里分清楚作者修改时间和提交者提交时间是很有必要的。
--unitl
或者--before
仅显示指定时间之前的提交
和上面的类似
--author
仅显示指定作者相关提交
官方的例子作者和提交者都只有一个人,下面我使用gitignore项目来做演示。
$ git log --pretty=short --author=Brendan -3 --abbrev-commit
commit 967cd64 (HEAD -> master, origin/master, origin/HEAD)
Merge: ca0d1e9 789c4cc
Author: Brendan Forster <brendan@github.com>
Merge pull request #2762 from EmreAtes/patch-1
commit ca0d1e9
Merge: cd872a9 5cd48ab
Author: Brendan Forster <brendan@github.com>
Merge pull request #2759 from AndyHee/master
commit cd872a9
Merge: 6cd6c88 b34c1e3
Author: Brendan Forster <brendan@github.com>
Merge pull request #2738 from jayvdb/patch-artifacts
这里是查看了Brendan Forster这位作者的前三个提交记录。
在填写作者项时,可以使用正则表达式,也可以使用子字符串匹配规则。从而筛选想要的记录,同理,下面的--committer
也是一样就不过多赘述。
--committer
仅显示指定提交者相关的提交
--grep
仅显示指定关键字的提交
$ git log --grep=Merlin
commit 14a95b9bcbeee3c9e0b33e42252128d98ee1073e
Author: KINSANG CHING <chengjsh@mail2.sysu.edu.cn>
Date: Fri Sep 15 12:45:14 2017 +0800
Update OCaml.gitignore
Merlin is a code completion for OCaml in Vim and Emacs. Such configuraing file is common
从提交的注释信息来搜索提交信息。这里可以使用正则表达式搜索,但是感觉和正则表达式有区别,不是很理解。可以参照icbm的CSDN博客:git log –grep 搜索提交注释的内容自己进行测试,我有一些没有成功。有问题欢迎在下面评论,帮助我理解。
-S
仅显示添加或者移除了某个关键字的提交
首先使用$ git log -p -10
查看到了如下一条修改信息
Author: Shawn Kovalchick <bamapookie@gmail.com>
Date: Mon Jul 2 13:50:02 2018 -0400
Separate module directory from project iml exclude
**diff --git a/Global/JetBrains.gitignore b/Global/JetBrains.gitignore**
**index 5434492..0d95b08 100644**
**--- a/Global/JetBrains.gitignore**
**+++ b/Global/JetBrains.gitignore**
@@ -26,7 +26,8 @@
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/modules.xml
-# .idea/**/*.iml
+# .idea/*.iml
+# .idea/modules
# CMake
cmake-build-*/
然后找到了添加内容信息# .idea/modules
然后使用$ git log -S “# .idea/modules”
得到如下结果:
$ git log -S "# .idea/module"
commit bb1c447d54a470c6110a78f6b05d0fbdb56c8fe0
Author: Shawn Kovalchick <bamapookie@gmail.com>
Date: Mon Jul 2 13:50:02 2018 -0400
Separate module directory from project iml exclude
commit 468a00afc9f8b06dae64a5e290be10034d9b8dcd
Author: Shawn Kovalchick <bamapookie@gmail.com>
Date: Fri Jun 29 08:50:57 2018 -0400
JetBrains: Optional excludes for auto-import
Add extra commented section to use when using Gradle or Maven auto-import.
These are mentioned in the original reference for optional excludes (https://intellij-support.jetbrains.com/hc/en-us/articles/206544839).
If this would be better as a separate, non-commented ignore file, let me know and I will resubmit.
可以看到得到的第一条结果是我们之前查询到的记录相同,而下面还有更早一些的记录说明这条记录之中也有修改我们输入的查询结果。
$ git log -S "# .idea/module" -p
commit bb1c447d54a470c6110a78f6b05d0fbdb56c8fe0
Author: Shawn Kovalchick <bamapookie@gmail.com>
Date: Mon Jul 2 13:50:02 2018 -0400
Separate module directory from project iml exclude
**diff --git a/Global/JetBrains.gitignore b/Global/JetBrains.gitignore**
**index 5434492..0d95b08 100644**
**--- a/Global/JetBrains.gitignore**
**+++ b/Global/JetBrains.gitignore**
@@ -26,7 +26,8 @@
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/modules.xml
-# .idea/**/*.iml
+# .idea/*.iml
+# .idea/modules
# CMake
cmake-build-*/
commit 468a00afc9f8b06dae64a5e290be10034d9b8dcd
Author: Shawn Kovalchick <bamapookie@gmail.com>
Date: Fri Jun 29 08:50:57 2018 -0400
JetBrains: Optional excludes for auto-import
Add extra commented section to use when using Gradle or Maven auto-import.
These are mentioned in the original reference for optional excludes (https://intellij-support.jetbrains.com/hc/en-us/articles/206544839).
If this would be better as a separate, non-commented ignore file, let me know and I will resubmit.
**diff --git a/Global/JetBrains.gitignore b/Global/JetBrains.gitignore**
**index 02d16aa..9cd884a 100644**
**--- a/Global/JetBrains.gitignore**
**+++ b/Global/JetBrains.gitignore**
@@ -21,6 +21,14 @@
.idea/**/gradle.xml
.idea/**/libraries
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/modules.xml
+# .idea/**/*.iml
+# .idea/libraries/**/*.xml
+
# CMake
cmake-build-*/
可以看到最后一个记录中有# .idea/modules.xml
的信息,说明确实是根据内容来查找的。
最后,推荐文章Git log高级用法。里面有一些点醒我的地方。
上一篇文章:Git 轻松入门学习笔记(一)
下一篇文章:Git 轻松入门学习笔记(三)
网友评论