git 的时光机 (简化版)

  • git log :查看历史记录
  • git commit -amend :重写上一次的提交历史

# git log

git 有一个特别实用的功能,可以让我们看到所有的历史更改记录。这个命令就是 git log .

首先我们新建一个仓库。随便进行 5 次更改, 5 提交。

执行如下的操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
➜  gitlearn git init .
Initialized empty Git repository in /private/tmp/gitlearn/.git/
➜ gitlearn git:(master) ✗ echo '第一行' > testGitLog
➜ gitlearn git:(master) ✗ git add .
➜ gitlearn git:(master) ✗ git commit -m "test git-log 1 "
[master (root-commit) 0718ac9] test git-log 1
2 files changed, 2 insertions(+)
create mode 100644 .gitignore
create mode 100644 testGitLog

➜ gitlearn git:(master) echo '第二行' >> testGitLog
➜ gitlearn git:(master) ✗ git commit -a -m "test git-log 2 "
[master f8248a5] test git-log 2
1 file changed, 1 insertion(+)

➜ gitlearn git:(master) echo '第三行' >> testGitLog
➜ gitlearn git:(master) ✗ git commit -a -m "test git-log 3 "
[master b282b88] test git-log 3
1 file changed, 1 insertion(+)

➜ gitlearn git:(master) echo '第四行' >> testGitLog
➜ gitlearn git:(master) ✗ git commit -a -m "test git-log 4 "
[master b9df1bb] test git-log 4
1 file changed, 1 insertion(+)

➜ gitlearn git:(master) echo '第五行' >> testGitLog
➜ gitlearn git:(master) ✗ git commit -a -m "test git-log 5 "
[master 769db1c] test git-log 5
1 file changed, 1 insertion(+)

运行一下 git log 我们查看一下输出的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
commit 769db1cd5ba091162707a3e648d67ec8e6913d2b (HEAD -> master)
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
Date: Tue Jul 21 15:36:11 2020 +0800

test git-log 5

commit b9df1bb5c10f6602f7fa889ca91759a2e45e69cb
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
Date: Tue Jul 21 15:36:01 2020 +0800

test git-log 4

commit b282b882317b118095eb921e707e449f45fdeef6
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
Date: Tue Jul 21 15:35:48 2020 +0800

test git-log 3

commit f8248a5fbc18a90710c95cee475b34797299bc61
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
Date: Tue Jul 21 15:35:30 2020 +0800

test git-log 2

commit 0718ac9a20021971d6f1a09a3ef72e36b6fd73c9
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
Date: Tue Jul 21 15:34:39 2020 +0800

test git-log 1

可以看到,我们没有传入任何参数的情况下, git log 会按照先后顺序列出所有的提交,时间最近的更新排在最上面。

该命令会列出每次提交的 SHA-1 校验和,作者的名字和电子邮箱,提交时间,以及提交说明。

git log 还有很多我们选项,我在后面有一篇文章写了 git 的命令大全,并且会保持更新哦。

# git log 命令选项

这里我们就先介绍一写常用的命令选项。

# 显示每次提交所引入的差异 --patch

git log --patch 或者 git log -p 会显示每次提交所引入的差异,会按照补丁的方式展示。后面也可以加上数字来限制下面显示几次提交。比如: git log -p -1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
commit 769db1cd5ba091162707a3e648d67ec8e6913d2b (HEAD -> master)
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
Date: Tue Jul 21 15:36:11 2020 +0800

test git-log 5

diff --git a/testGitLog b/testGitLog
index 11c20cd..844b7e8 100644
--- a/testGitLog
+++ b/testGitLog
@@ -2,3 +2,4 @@
第二行
第三行
第四行
+第五行

commit b9df1bb5c10f6602f7fa889ca91759a2e45e69cb
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
Date: Tue Jul 21 15:36:01 2020 +0800

test git-log 4

diff --git a/testGitLog b/testGitLog
index f1c8e85..11c20cd 100644
--- a/testGitLog
+++ b/testGitLog
@@ -1,3 +1,4 @@
第一行
第二行
第三行
+第四行

...

限制提交数演示:

git log -p -1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
commit 769db1cd5ba091162707a3e648d67ec8e6913d2b (HEAD -> master)
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
Date: Tue Jul 21 15:36:11 2020 +0800

test git-log 5

diff --git a/testGitLog b/testGitLog
index 11c20cd..844b7e8 100644
--- a/testGitLog
+++ b/testGitLog
@@ -2,3 +2,4 @@
第二行
第三行
第四行
+第五行

这个选项可以在每次提交的下面列出所有修改过的文件,有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了。 在每次提交的最后还有一个总结。

# 查看每次提交的简略统计信息, git log --stat
1
2
3
4
5
6
7
8
9
10
11
12
commit 769db1cd5ba091162707a3e648d67ec8e6913d2b (HEAD -> master)
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
Date: Tue Jul 21 15:36:11 2020 +0800

test git-log 5

## 什么文件被修改了,增加还是删除
testGitLog | 1 +
## 一共修改了多少文件
1 file changed, 1 insertion(+)

...

# 格式化输出日志 --pretty

这个选项可以使不同于默认格式化的方式展示提交历史。它提供了几种内建的格式化方式,除此之外使用者还可以自定义格式化方式。

# 内建一:oneline
1
2
3
4
5
6
$ git log --pretty=oneline
769db1cd5ba091162707a3e648d67ec8e6913d2b (HEAD -> master) test git-log 5
b9df1bb5c10f6602f7fa889ca91759a2e45e69cb test git-log 4
b282b882317b118095eb921e707e449f45fdeef6 test git-log 3
f8248a5fbc18a90710c95cee475b34797299bc61 test git-log 2
0718ac9a20021971d6f1a09a3ef72e36b6fd73c9 test git-log 1
# 内建二: short
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ git log --pretty=short
commit 769db1cd5ba091162707a3e648d67ec8e6913d2b (HEAD -> master)
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>

test git-log 5

commit b9df1bb5c10f6602f7fa889ca91759a2e45e69cb
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>

test git-log 4

commit b282b882317b118095eb921e707e449f45fdeef6
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>

test git-log 3

commit f8248a5fbc18a90710c95cee475b34797299bc61
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>

test git-log 2

commit 0718ac9a20021971d6f1a09a3ef72e36b6fd73c9
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>

test git-log 1
# 内建三:full
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$ git log --pretty=full
commit 769db1cd5ba091162707a3e648d67ec8e6913d2b (HEAD -> master)
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
Commit: fangjiaxiaobai <fangjiaxiaobai@163.com>

test git-log 5

commit b9df1bb5c10f6602f7fa889ca91759a2e45e69cb
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
Commit: fangjiaxiaobai <fangjiaxiaobai@163.com>

test git-log 4

commit b282b882317b118095eb921e707e449f45fdeef6
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
Commit: fangjiaxiaobai <fangjiaxiaobai@163.com>

test git-log 3

commit f8248a5fbc18a90710c95cee475b34797299bc61
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
Commit: fangjiaxiaobai <fangjiaxiaobai@163.com>

test git-log 2

commit 0718ac9a20021971d6f1a09a3ef72e36b6fd73c9
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
Commit: fangjiaxiaobai <fangjiaxiaobai@163.com>

test git-log 1
# 内建四:fuller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ git log --pretty=fullter

commit 769db1cd5ba091162707a3e648d67ec8e6913d2b (HEAD -> master)
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
AuthorDate: Tue Jul 21 15:36:11 2020 +0800
Commit: fangjiaxiaobai <fangjiaxiaobai@163.com>
CommitDate: Tue Jul 21 15:36:11 2020 +0800

test git-log 5

commit b9df1bb5c10f6602f7fa889ca91759a2e45e69cb
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
AuthorDate: Tue Jul 21 15:36:01 2020 +0800
Commit: fangjiaxiaobai <fangjiaxiaobai@163.com>
CommitDate: Tue Jul 21 15:36:01 2020 +0800

test git-log 4

commit b282b882317b118095eb921e707e449f45fdeef6
Author: fangjiaxiaobai <fangjiaxiaobai@163.com>
AuthorDate: Tue Jul 21 15:35:48 2020 +0800
Commit: fangjiaxiaobai <fangjiaxiaobai@163.com>
CommitDate: Tue Jul 21 15:35:48 2020 +0800
...

# 最 NB 的:format

这个选项目可以让我们定制记录的显示格式,这种并不会随着 git 的更新而发生改变。

1
2
3
4
5
6
7
$ git log --pretty=format:"%h-%an,%ar:%s"

769db1c - fangjiaxiaobai, 27 minutes ago:test git-log 5
b9df1bb - fangjiaxiaobai, 27 minutes ago:test git-log 4
b282b88 - fangjiaxiaobai, 27 minutes ago:test git-log 3
f8248a5 - fangjiaxiaobai, 27 minutes ago:test git-log 2
0718ac9 - fangjiaxiaobai, 28 minutes ago:test git-log 1

format 后面的分别代表什么含义呢?
这里列出了 Format 的常用参数。

参数 含义
%H 提交的完整哈希值
%h 提交的简写哈希值
%T 树的完整哈希值
%t 树的简写哈希值
%P 父提交的完整哈希值
%p 父提交的简写哈希值
%an 作者名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 --date = 选项 来定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期(距今多长时间)
%s 提交说明

咦~?作者和提交这有什么区别呢?^❷
这里,小白就要卖一个关子了。不过答案就在这个系列里~。因为在目前这总单分支的本地开发环境里,提交者就是作者。
另外在多分支的开发过车中,使用 format 配合 --graph 选项就尤为有用。后面介绍~

# 限制输出性的选项

上面用过了 -<number> 的方式来显示 git log 输出日志的条数,git 还提供了 类似于: --since--until , --before 等时间限制的选项目。

比如: git log --since=2.weeks 输出 2 周之内的提交记录。

该命令可用的格式十分丰富 —— 可以是类似 “2008-01-15” 的具体的某一天,也可以是类似 “2 years 1 day 3 minutes ago” 的相对日期。
还可以过滤出匹配指定条件的提交。 用 --author 选项显示指定作者的提交,用 --grep 选项搜索提交说明中的关键字。

另一个非常有用的过滤器是 -S(俗称 “pickaxe” 选项,取 “用鹤嘴锄在土里捡石头” 之意), 它接受一个字符串参数,并且只会显示那些添加或删除了该字符串的提交。 假设你想找出添加或删除了对某一个特定函数的引用的提交,可以调用:

1
$ git log -S function_name

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

# git commit --amend

这个命令可以让我们重写上一次的提交记录。
比如有下面这样的场景:

小白修改了一个文件,提交了之后发现写了一个错别字,小白又想保持 git 提交历史的整洁。这时 git commit -amend 就派上了用场了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
➜  gitlearn git:(master) git log --pretty=oneline
➜ gitlearn git:(master) echo '第留行' >> testGitLog
➜ gitlearn git:(master) ✗ git commit -a -m "test git-log 6 "
[detached HEAD f65b589] test git-log 6
1 file changed, 1 insertion(+)
➜ gitlearn git:(master) vim testGitLog
➜ gitlearn git:(master) ✗ git commit -a --amend -m "test git-log 6 "
[detached HEAD 1afd020] test git-log 6
Date: Tue Jul 21 16:36:43 2020 +0800
1 file changed, 1 insertion(+)

# 查看提交日志
➜ gitlearn git:(master) git log --pretty=oneline
1afd020466eb9b519cec80415cb1e9c587612511 (HEAD) test git-log 6
769db1cd5ba091162707a3e648d67ec8e6913d2b test git-log 5
b9df1bb5c10f6602f7fa889ca91759a2e45e69cb test git-log 4
b282b882317b118095eb921e707e449f45fdeef6 test git-log 3
f8248a5fbc18a90710c95cee475b34797299bc61 test git-log 2
0718ac9a20021971d6f1a09a3ef72e36b6fd73c9 test git-log 1
(END)

注意! 这里第二次提交的结果会替换掉之前的一次提交。

以上就是本次 简约版本时光机的所有内容了。下一篇 远程仓库

# 最后

期望与你一起遇见更好的自己

期望与你一起遇见更好的自己