`
wbj0110
  • 浏览: 1611171 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

查看提交历史

    博客分类:
  • Git
Git 
阅读更多

在提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,可以使用 git log 命令查看。

接下来的例子会用我专门用于演示的 simplegit 项目,运行下面的命令获取该项目源代码:

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

然后在此项目中运行 git log,应该会看到下面的输出:

$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test code

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    first commit

默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面。看到了吗,每次更新都有一个 SHA-1 校验和、作者的名字和电子邮件地址、提交时间,最后缩进一个段落显示提交说明。

git log 有许多选项可以帮助你搜寻感兴趣的提交,接下来我们介绍些最常用的。

我们常用 -p 选项展开显示每次提交的内容差异,用 -2 则仅显示最近的两次更新:

$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,5 +5,5 @@ require 'rake/gempackagetask'
 spec = Gem::Specification.new do |s|
     s.name      =   "simplegit"
-    s.version   =   "0.1.0"
+    s.version   =   "0.1.1"
     s.author    =   "Scott Chacon"
     s.email     =   "schacon@gee-mail.com

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test code

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
\ No newline at end of file

This option displays the same information but with a diff directly following each entry. This is very helpful for code review or to quickly browse what happened during a series of commits that a collaborator has added.

Sometimes it's easier to review changes on the word level rather than on the line level. There is a --word-diff option available in Git, that you can append to the git log -p command to get word diff instead of normal line by line diff. Word diff format is quite useless when applied to source code, but it comes in handy when applied to large text files, like books or your dissertation. Here is an example:

$ git log -U1 --word-diff
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -7,3 +7,3 @@ spec = Gem::Specification.new do |s|
    s.name      =   "simplegit"
    s.version   =   [-"0.1.0"-]{+"0.1.1"+}
    s.author    =   "Scott Chacon"

As you can see, there is no added and removed lines in this output as in a normal diff. Changes are shown inline instead. You can see the added word enclosed in {+ +} and removed one enclosed in [- -]. You may also want to reduce the usual three lines context in diff output to only one line, as the context is now words, not lines. You can do this with -U1 as we did in the example above.

在做代码审查,或者要快速浏览其他协作者提交的更新都作了哪些改动时,就可以用这个选项。此外,还有许多摘要选项可以用,比如 --stat,仅显示简要的增改行数统计:

$ git log --stat
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the 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

    removed unnecessary test code

 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

    first commit

 README           |    6 ++++++
 Rakefile         |   23 +++++++++++++++++++++++
 lib/simplegit.rb |   25 +++++++++++++++++++++++++
 3 files changed, 54 insertions(+)

每个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行数小计。 还有个常用的 --pretty 选项,可以指定使用完全不同于默认格式的方式展示提交历史。比如用 oneline 将每个提交放在一行显示,这在提交数很大时非常有用。另外还有 shortfullfuller 可以用,展示的信息或多或少有些不同,请自己动手实践一下看看效果如何。

$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit

但最有意思的是 format,可以定制要显示的记录格式,这样的输出便于后期编程提取分析,像这样:

$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 11 months ago : changed the version number
085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
a11bef0 - Scott Chacon, 11 months ago : first commit

表 2-1 列出了常用的格式占位符写法及其代表的意义。

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

你一定奇怪作者(author)提交者(committer)之间究竟有何差别,其实作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者。我们会在第五章再详细介绍两者之间的细微差别。

用 oneline 或 format 时结合 --graph 选项,可以看到开头多出一些 ASCII 字符串表示的简单图形,形象地展示了每个提交所在的分支及其分化衍合情况。在我们之前提到的 Grit 项目仓库中可以看到:

$ 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

以上只是简单介绍了一些 git log 命令支持的选项。表 2-2 还列出了一些其他常用的选项及其释义。

选项 说明
-p 按补丁格式显示每个更新之间的差异。
--word-diff 按 word diff 格式显示差异。
--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 还有许多非常实用的限制输出长度的选项,也就是只输出部分提交信息。之前我们已经看到过 -2 了,它只显示最近的两条提交,实际上,这是 -<n> 选项的写法,其中的 n 可以是任何自然数,表示仅显示最近的若干条提交。不过实践中我们是不太用这个选项的,Git 在输出所有提交时会自动调用分页程序(less),要看更早的更新只需翻到下页即可。

另外还有按照时间作限制的选项,比如 --since--until。下面的命令列出所有最近两周内的提交:

$ git log --since=2.weeks

你可以给出各种时间格式,比如说具体的某一天(“2008-01-15”),或者是多久以前(“2 years 1 day 3 minutes ago”)。

还可以给出若干搜索条件,列出符合的提交。用 --author 选项显示指定作者的提交,用 --grep 选项搜索提交说明中的关键字。(请注意,如果要得到同时满足这两个选项搜索条件的提交,就必须用 --all-match 选项。否则,满足任意一个条件的提交都会被匹配出来)

另一个真正实用的git log选项是路径(path),如果只关心某些文件或者目录的历史提交,可以在 git log 选项的最后指定它们的路径。因为是放在最后位置上的选项,所以用两个短划线(--)隔开之前的选项和后面限定的路径名。

表 2-3 还列出了其他常用的类似选项。

选项 说明
-(n) 仅显示最近的 n 条提交
--since, --after 仅显示指定时间之后的提交。
--until, --before 仅显示指定时间之前的提交。
--author 仅显示指定作者相关的提交。
--committer 仅显示指定提交者相关的提交。

来看一个实际的例子,如果要查看 Git 仓库中,2008 年 10 月期间,Junio Hamano 提交的但未合并的测试脚本(位于项目的 t/ 目录下的文件),可以用下面的查询命令:

$ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \
   --before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attribute
acd3b9e - Enhance hold_lock_file_for_{update,append}()
f563754 - demonstrate breakage of detached checkout wi
d1a43f2 - reset --hard/read-tree --reset -u: remove un
51a94af - Fix "checkout --track -b newbranch" on detac
b0ad11e - pull: allow "git pull origin $something:$cur

Git 项目有 20,000 多条提交,但我们给出搜索选项后,仅列出了其中满足条件的 6 条。

使用图形化工具查阅提交历史

有时候图形化工具更容易展示历史提交的变化,随 Git 一同发布的 gitk 就是这样一种工具。它是用 Tcl/Tk 写成的,基本上相当于 git log 命令的可视化版本,凡是 git log 可以用的选项也都能用在 gitk 上。在项目工作目录中输入 gitk 命令后,就会启动图 2-2 所示的界面。


图 2-2. gitk 的图形界面

上半个窗口显示的是历次提交的分支祖先图谱,下半个窗口显示当前点选的提交对应的具体差异。

分享到:
评论

相关推荐

    Git 教程之查看提交历史详解

    在Git的使用中,查看提交历史是一项基本且重要的操作。本文将详细介绍如何使用Git查看提交历史,包括各种命令和参数的使用方法。 首先,查看提交历史的基本命令是`git log`。使用这个命令可以列出所有的提交记录,...

    Linux运维-04-日志分析-日志监控ELK-day03-生产案例及Git版本控制-10-查看提交历史与版本回退.mp4

    Linux运维-04-日志分析-日志监控ELK-day03-生产案例及Git版本控制-10-查看提交历史与版

    golang实现的文件去重小工具,有git提交历史、注释、windows,linux可执行文件。

    本文将详细讲解基于Golang实现的文件去重小工具,以及与之相关的技术知识点,包括Git提交历史查看、代码注释、跨平台可执行文件构建、Excel数据处理和Docker容器化部署。 首先,我们要讨论的是Golang语言本身。...

    MyEclipse使用CVS

    可以查看项目的历史版本信息,包括提交人、日期、提交注释等,通过`Team` -&gt; `Show History`来查看。 8. **工作副本** 在MyEclipse中,你的项目就是一个CVS的工作副本,你可以随时查看它的状态,如是否已更新、...

    Git添加与提交文件与查看

    本文将详细讲解如何在Git中添加、提交文件以及查看提交历史。 一、Git添加文件 1. 首先,你需要在终端或命令提示符中定位到你的Git项目目录。在Linux中,你可以使用`cd`命令,例如`cd d/目录/目录`。而在Windows...

    Webstorm 提交代码到Git

    1. **查看提交历史**:在Webstorm的版本控制工具窗口可以查看提交历史记录,确认最新的提交是否已经出现在列表中。 2. **访问GitHub仓库**:登录GitHub网站,进入对应的仓库页面查看提交记录。在页面右侧可以看到...

    SVN常用操作----查看代码提交以及改动记录方法

    查看单个文件的提交历史 如果你只关心某个文件的提交历史,只需右键点击该文件,选择"SVN查看日志",然后按照上述步骤查看其改动。 ### 6. 使用命令行工具 除了图形界面,SVN还提供了命令行工具。例如,`svn log...

    git常见问题解决方法.pdf 1. 提交代码步骤 2. 查看当前工作目录树的工作修改状态 3. 将状态改变的代码提交至缓存

    例如,可以使用 `git log` 命令查看提交历史记录,使用 `git diff` 命令查看代码的差异,使用 `git reset` 命令回退到之前的版本。 六、使用 Phabricator 进行代码 review 使用 Phabricator 进行代码 review 可以...

    Git 详细教程.rtf

    git log --oneline # 精简方式查看提交历史 4.5 分支管理 创建并切换到新分支 git checkout -b 分支名 # 创建新分支并切换到该分支 查看分支 git branch # 查看所有本地分支 git branch -r # 查看所有远程...

    (源码)基于Java的版本控制系统.zip

    提交与历史查看用户可以提交代码变更,并通过git log命令查看提交历史。 回滚操作支持通过git reset命令回滚到指定的提交,包括基于提交次数的回滚和基于具体提交标识的回滚。 分支管理用户可以创建多个分支,并...

    常用 git 命令

    2. 查看指定文件的提交历史:`git log -p &lt;file&gt;` - 查看指定文件的提交历史。 3. 查看当前分支历史纪录:`gitk` - 查看当前分支历史纪录。 4. 查看某分支历史纪录:`gitk &lt;branch&gt;` - 查看某分支历史纪录。 5. ...

    Git提交历史:Git提交历史

    了解如何查看和理解Git提交历史对于开发者来说至关重要,这能帮助追踪代码演变过程、回溯错误、协同工作并保持代码库整洁有序。 Git提交历史可以通过`git log`命令来查看。这个命令会显示一系列的提交,通常按照...

    svn回到某个历史版本的做法.rar

    你可以通过以下命令查看提交历史: ```bash svn log URL ``` 这里的`URL`是你的项目仓库地址。这个命令会列出所有提交的信息,包括作者、日期和提交信息。 二、选择要回退的版本 通过`svn log`命令,你可以找到...

    git log日志 git log日志git log日志git log日志git log日志

    Git是世界上最流行的分布式版本控制系统,而`git log`是它的一个核心命令,用于查看提交历史。这个命令在日常开发和代码版本管理中扮演着至关重要的角色。本文将深入探讨`git log`的功能、用法以及如何解读其输出,...

    软件一部培训教程(7)代码提交步骤1

    如果发现本地已有提交或者已推送的代码有误,可以使用`git log .`查看提交历史。找到需要回退到的commit ID(如:fc2d8f4724b8cdce465ce894f804c6b48ff0a),然后运行`git reset --hard &lt;commit ID&gt;`进行回退。但请...

    常用的git命令完整详细109条

    3. **git commit -m "备注"**:将暂存区的所有变更提交到仓库,"-m"后面接的是本次提交的描述信息,方便日后查看提交历史。 4. **git status**:显示当前仓库的状态,包括哪些文件被修改、添加或删除,以及哪些文件...

    asp.net作业在线提交系统的设计与实现(源代码+论文).zip

    系统需支持批量下载作业、查看提交历史等功能,便于教师管理大量作业。 6. 消息通知:系统应具备消息通知功能,如当学生提交作业或教师批阅后,通过邮件或站内消息及时通知相关人员。 7. 安全性:除了用户认证外,...

    git提交项目到码云步骤及出现问题解决办法

    - `git log`:查看提交历史记录。 - `git diff`:查看尚未提交的改动。 - `git branch`:查看或管理分支。 - `git merge`:合并分支。 通过以上步骤,你可以顺利地将本地项目提交到码云,并且能够妥善处理在...

    git-time-machine 一款方便开发者查看 git 历史提交内容的 Atom 扩展.zip

    Git-Time-Machine是一款专为Atom文本编辑器设计的插件,它使得开发者能够更直观、更便捷地探索Git仓库的提交历史。这款开源项目旨在增强Git的可视化体验,帮助程序员追溯代码变动,从而提高开发效率。 Git是分布式...

Global site tag (gtag.js) - Google Analytics