Git 之二 - 显示日志、恢复文件、比较文件

Git 显示提交的日志信息(本地库)

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
# 查看所有分支的所有操作的日志信息(包括commit和reset的操作),一般用于数据恢复
$ git reflog

# 显示每条提交日志信息的详细内容
$ git log

# 显示每条提交日志信息的详细内容,包括reflog的日志信息
$ git log -g

# 显示每条提交日志信息更详细的内容
$ git log --pretty=raw

# 将每条提交日志信息输出为一行显示
$ git log --pretty=oneline

# 将每条提交日志信息的摘要内容输出为一行显示
$ git log --oneline

# 将每条提交日志信息的摘要内容输出为一行显示,并指定显示多少条日志
$ git log --oneline -2

# 指定从第几条日志信息开始显示,例如从第三条日志信息开始显示
$ git log --skip 2

# 显示每条提交日志信息的详细内容,包含每次提交对应的文件操作类型(增删改)
$ git log --name-status

# 显示每条提交日志信息的详细内容,包含文件详细的改动记录
$ git log -p

# 绘制提交的线索图
$ git log --graph

Git 搜索提交的日志信息(本地库)

1
2
3
4
5
6
7
8
# 匹配签名信息(例如:“peter@gmail.com”)中的任意内容,搜索某人提交的所有日志信息
$ git log --author peter

# 根据提交时填写的备注信息,搜索提交的日志信息
$ git log --grep keywords

# 搜索某个文件的所有改动记录,参数是文件完整的相对路径或者绝对路径
$ git log -p -- config/my.config

Git 恢复到某个提交的历史版本(本地库)

此操作适用于文件的删除或修改操作 commit 之后,想找回已删除的文件,或者将文件还原到修改前的某个历史版本,成功的前提是被删除或者被修改的文件必须曾经 commit 到本地库

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
# 查看所有分支的所有操作的日志信息(包括commit和reset的操作),一般用于数据恢复
$ git reflog
4630fa3 HEAD@{0}: commit: update message
346f528 HEAD@{1}: commit: update message
b86daaa HEAD@{2}: commit: update message
fdbbf3c HEAD@{3}: commit: update message
775a0c5 HEAD@{4}: commit: update message
42a3d41 HEAD@{5}: commit: update message
81f4118 HEAD@{6}: commit: update message
0c05880 HEAD@{7}: commit: update message
670e552 HEAD@{8}: commit (initial): update message

# 基于索引值恢复到指定历史版本(推荐),可以随意往前往后恢复
$ git reset --hard 346f528

# 基于^符号恢复(只能往后恢复),当同时使用N个^符号时,表示顺序往后恢复N个版本
$ git reset --hard HEAD^

# 基于~符号恢复(只能往后恢复),数字N表示顺序往后恢复N个版本
$ git reset --hard HEAD~1

# 恢复到当前本地库中HEAD指针指向的历史版本,一般指的就是HEAD@{0}
$ git reset --hard HEAD

# reset操作的定义域(必须明确指定,否则可能造成数据不可恢复的丢失)
$ git reset --soft 只在本地库移动HEAD指针,暂存区和工作区都不会受影响
$ git reset --mixed 默认选项,在本地库移动HEAD指针,暂存区同步到指定的提交,工作区不受影响
$ git reset --hard 在本地库移动HEAD指针,暂存区和工作区都同步到指定的提交,强烈建议预先执行一次commit操作,否则可能造成数据不可恢复的丢失

Git 将某个文件回滚到指定版本

在使用 Git 时,可能会遇到这种问题:一次 commit 了多个文件,但是提交后发现有一个文件不应该被提交,如果把整个 commit 回滚会很麻烦(因为正确提交的文件也会被回滚),这时就需要单独回滚某个文件,具体操作如下:

1
2
3
4
5
6
7
8
# 首先找到特定文件要回滚的版本的hash值
$ git log api.json

# 利用hash值回滚特定文件(可以直接使用hash值的前六位)
$ git checkout 2d1ed0 api.json

# 提交回滚后的文件
$ git commit -m api.json

Git 比较文件差异(本地库)

1
2
3
4
5
6
7
8
9
10
# 将工作区的文件与暂存区的文件进行比较
$ git diff api.json

# 将工作区的文件和本地库中HEAD指针指向的历史版本的文件进行比较
$ git diff HEAD api.json

# 将工作区的文件和本地库上一个历史版本的文件进行比较
$ git diff HEAD^ api.json

# 注意:当“git diff”命令不指定文件名参数,则代表比较工作区的所有文件