阿里云

Git系列之查看提交历史

本节来说下Git 的提交历史,在日常开发中我们每天都在提交自己的更新代码之仓库,那么作为管理人员或者自己如何来查看提交了哪些呢?


下面来说下Git命令之log:

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

接下来的例子会用我的开源企业站项目,运行下面的命令获取该项目源代码:

git clone https://gitee.com/ay2977/lt.git


然后在项目中运行git log命令:

git log


Git学习

看到下面的输出:

commit d976e7c3739fccf876c1e62cee471da7f75b3f08
Author: ay2977 <297760026@qq.com>
Date:   Thu Feb 21 21:44:23 2019 +0800

    添加人员列表

commit 81c1d4ca6c0799eaaf74f3b7376d287fe0d26ab3
Author: ay2977 <297760026@qq.com>
Date:   Mon Feb 18 21:01:12 2019 +0800

    添加人员

commit c2fd7edc22cc15c6bd1f24054495323f70df3c3c
Author: ay2977 <297760026@qq.com>
Date:   Sun Feb 17 11:39:15 2019 +0800

    更新登录

commit 17d4057a6620303a813233c5d1349287f796bfb6
Author: ay2977 <297760026@qq.com>
Date:   Sun Feb 17 10:13:57 2019 +0800

    更新后台首页折线图插件路径问题
:...skipping...
commit d976e7c3739fccf876c1e62cee471da7f75b3f08
Author: ay2977 <297760026@qq.com>
Date:   Thu Feb 21 21:44:23 2019 +0800

    添加人员列表

commit 81c1d4ca6c0799eaaf74f3b7376d287fe0d26ab3
Author: ay2977 <297760026@qq.com>
Date:   Mon Feb 18 21:01:12 2019 +0800

    添加人员

commit c2fd7edc22cc15c6bd1f24054495323f70df3c3c
Author: ay2977 <297760026@qq.com>
Date:   Sun Feb 17 11:39:15 2019 +0800

    更新登录


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

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

Git学习

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

$ git log -p
commit d976e7c3739fccf876c1e62cee471da7f75b3f08
Author: ay2977 <297760026@qq.com>
Date:   Thu Feb 21 21:44:23 2019 +0800

    添加人员列表

diff --git a/tp5/application/admin/controller/Base.php b/tp5/application/admin/controller/Base.php
index 85c5ac6..b9ad846 100644
--- a/tp5/application/admin/controller/Base.php
+++ b/tp5/application/admin/controller/Base.php
@@ -17,7 +17,7 @@ class Base extends Controller
         if($userName){
             $this->assign('userName',$userName);
         }else{
-            //$this->redirect('Login/index');
+            $this->redirect('Login/index');
         }
     }
 }
\ No newline at end of file
diff --git a/tp5/application/admin/controller/Login.php b/tp5/application/admin/controller/Login.php
index 80f1817..60ad819 100644
--- a/tp5/application/admin/controller/Login.php
+++ b/tp5/application/admin/controller/Login.php
@@ -54,7 +54,7 @@ class Login extends Controller
             $this->error('账号或密码错误,104');
         }
         session('userName', $userName, 'admin');
-        $this->success('登录成功');
+        $this->success('登录成功',url('Index/index'));
     }

     /**
@@ -73,4 +73,13 @@ class Login extends Controller
         $captcha = new Captcha($config);
         return $captcha->entry();
     }
+
+    /**
+     * 退出登录
+     */
+    public function doout()
+    {
+        session(null, 'admin');
+        $this->success('退出成功');
+    }
 }


该选项除了显示基本信息之外,还在附带了每次 commit 的变化。当进行代码审查,或者快速浏览某个搭档提交的 commit 的变化的时候,这个参数就非常有用了。

某些时候,单词层面的对比,比行层面的对比,更加容易观察。Git 提供了 --word-diff 选项。我们可以将其添加到 git log -p 命令的后面,从而获取单词层面上的对比。在程序代码中进行单词层面的对比常常是没什么用的。不过当你需要在书籍、论文这种很大的文本文件上进行对比的时候,这个功能就显出用武之地了。下面是一个简单的例子:

$ git log -U1 --word-diff
commit d976e7c3739fccf876c1e62cee471da7f75b3f08
Author: ay2977 <297760026@qq.com>
Date:   Thu Feb 21 21:44:23 2019 +0800

    添加人员列表

diff --git a/tp5/application/admin/controller/Base.php b/tp5/application/admin/controller/Base.php
index 85c5ac6..b9ad846 100644
--- a/tp5/application/admin/controller/Base.php
+++ b/tp5/application/admin/controller/Base.php
@@ -19,3 +19,3 @@ class Base extends Controller
        }else{
            [-//$this->redirect('Login/index');-]{+$this->redirect('Login/index');+}
        }
diff --git a/tp5/application/admin/controller/Login.php b/tp5/application/admin/controller/Login.php
index 80f1817..60ad819 100644
--- a/tp5/application/admin/controller/Login.php
+++ b/tp5/application/admin/controller/Login.php
@@ -56,3 +56,3 @@ class Login extends Controller
        session('userName', $userName, 'admin');
        [-$this->success('登录成功');-]{+$this->success('登录成功',url('Index/index'));+}
    }
@@ -75,2 +75,11 @@ class Login extends Controller
    }

    {+/**+}
{+     * 退出登录+}
{+     */+}
{+    public function doout()+}
{+    {+}
{+        session(null, 'admin');+}
{+        $this->success('退出成功');+}
{+    }+}
}


如你所见,这里并没有平常看到的添加行或者删除行的信息。这里的对比显示在行间。新增加的单词被 {+ +} 括起来,被删除的单词被 [- -] 括起来。在进行单词层面的对比的时候,你可能希望上下文( context )行数从默认的 3 行,减为 1 行,那么可以使用 -U1 选项。上面的例子中,我们就使用了这个选项。

另外,git log 还提供了许多摘要选项可以用,比如 --stat,仅显示简要的增改行数统计:

$ git log --stat
commit d976e7c3739fccf876c1e62cee471da7f75b3f08
Author: ay2977 <297760026@qq.com>
Date:   Thu Feb 21 21:44:23 2019 +0800

    添加人员列表

 tp5/application/admin/controller/Base.php     |  2 +-
 tp5/application/admin/controller/Login.php    | 11 ++++-
 tp5/application/admin/controller/User.php     | 16 +++++++-
 tp5/application/admin/view/Common/header.html |  4 +-
 tp5/application/admin/view/User/index.html    | 58 +++++++--------------------
 tp5/application/common.php                    | 21 ++++++++++
 tp5/application/common/logic/User.php         | 27 +++++++++++++
 tp5/application/common/model/User.php         | 13 ++++++
 tp5/public/static/common.js                   |  6 ---
 tp5/route/route.php                           |  6 ++-
 10 files changed, 108 insertions(+), 56 deletions(-)

以上只是简单介绍了一些 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

仅显示指定提交者相关的提交。


喜欢就点个赞吧

发表评论

需要先登录,才能发表评论哦!登录

网友评论
暂无评论