你不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit
。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit
恢复,然后继续工作,而不是把几个月的工作成果全部丢失。在Git中,我们用git log
命令查看
$ git log
commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 15:11:49 2013 +0800
append GPL
commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 14:53:12 2013 +0800
add distributed
commit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <askxuefeng@gmail.com>
Date: Mon Aug 19 17:51:55 2013 +0800
wrote a readme file
默认不用任何参数的话,git log
会按提交时间列出所有的更新,最近的更新排在最上面。 正如你所看到的,这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
一个常用的选项是,-p
用来显示每次提交的内容差异。 你也可以加上-2
会来仅显示最近两次提交:
$ git log -p -2 commit a839149804f6ccf0f727fd2e0e6431be2b0933e4 Author: BadBoy <613163851@qq.com> Date: Sat Sep 10 23:02:13 2016 +0800 append GPL diff --git a/readme.txt b/readme.txt index 013b5bc..99e0e11 100644 --- a/readme.txt +++ b/readme.txt @@ -1,2 +1,2 @@ Git is a distributed version control system. -Git is free software. \ No newline at end of file +Git is free software distributed under the GPL. \ No newline at end of file commit 3482d7511e91dfc0b2a8d3d928a2f5a13cb53dbe Author: BadBoy <613163851@qq.com> Date: Sat Sep 10 23:00:58 2016 +0800 add distributed该选项除了显示基本信息之外,还在附带了每次 commit 的变化。 当进行代码审查,或者快速浏览某个快照提交的 commit 所带来的变化的时候,这个参数就非常有用了。 你也可以为
git log
用
附带一系列的总结性选项。 比如说,如果你想看到每次提交的简略的统计信息,你可以使用
为
--stat
用
选项:
$ git log --stat -2 commit a839149804f6ccf0f727fd2e0e6431be2b0933e4 Author: BadBoy <613163851@qq.com> Date: Sat Sep 10 23:02:13 2016 +0800 append GPL readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) commit 3482d7511e91dfc0b2a8d3d928a2f5a13cb53dbe Author: BadBoy <613163851@qq.com> Date: Sat Sep 10 23:00:58 2016 +0800 add distributed readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)正如你所看到的, 在每次提交的下面列出额所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了。 在每次提交的最后还有一个总结。另外一个常用的选项是
--pretty
。 这个选项可以指定使用不同于默认格式的方式展示提交历史。 这个选项有一些内建的子选项供你使用。 比如用 oneline
将每个提交放在一行显示,查看的提交数很大时非常有用。 另外还有 short
,full
和 fuller
可以用,展示的信息或多或少有些不同,请自己动手实践一下看看效果如何。
$ git log --pretty=oneline a839149804f6ccf0f727fd2e0e6431be2b0933e4 append GPL 3482d7511e91dfc0b2a8d3d928a2f5a13cb53dbe add distributed aee8243cb9369c4829989fb945368eadbc72e108 wrote a readme file
但最有意思的是 format,可以定制要显示的记录格式。 这样的输出对后期提取分析格外有用 — 因为你知道输出的格式不会随着Git的更新而发生改变:
$ git log --pretty=format:"%h - %an, %ar : %s" a839149 - BadBoy, 40 minutes ago : append GPL 3482d75 - BadBoy, 41 minutes ago : add distributed aee8243 - BadBoy, 43 minutes ago : wrote a readme file
git log --pretty=format
常用的选项
选项 | 说明 |
---|---|
| 提交对象(commit)的完整哈希字串 |
| 提交对象的简短哈希字串 |
| 树对象(tree)的完整哈希字串 |
| 树对象的简短哈希字串 |
| 父对象(parent)的完整哈希字串 |
| 父对象的简短哈希字串 |
| 作者(author)的名字 |
| 作者的电子邮件地址 |
| 作者修订日期(可以用 --date= 选项定制格式) |
| 作者修订日期,按多久以前的方式显示 |
| 提交者(committer)的名字 |
| 提交者的电子邮件地址 |
| 提交日期 |
| 提交日期,按多久以前的方式显示 |
| 提交说明 |
log
选项
--graph
结合使用时尤其有用。 这个选项添加了一些ASCII字符串来形象地展示你的分支、合并历史:
$
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
的常用选项
选项 | 说明 |
---|---|
| 按补丁格式显示每个更新之间的差异。 |
| 显示每次更新的文件修改统计信息。 |
| 只显示 --stat 中最后的行数修改添加移除统计。 |
| 仅在提交信息后显示已修改的文件清单。 |
| 显示新增、修改、删除的文件清单。 |
| 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。 |
| 使用较短的相对时间显示(比如,“2 weeks ago”)。 |
| 显示 ASCII 图形表示的分支合并历史。 |
| 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。 |
git log
输出的选项
选项 | 说明 |
---|---|
| 仅显示最近的 n 条提交 |
| 仅显示指定时间之后的提交。 |
| 仅显示指定时间之前的提交。 |
| 仅显示指定作者相关的提交。 |
| 仅显示指定提交者相关的提交。 |
| 仅显示含指定关键字的提交 |
| 仅显示添加或移除了某个关键字的提交 |