1、查看本地库历史版本

为了方便查看日志,且日志看起来比较多,这里我不断往test.txt文件中添加一行内容,每添加一行后都使用commit命令提交到本地库,现在test.txt文件内容如下:
图片

使用下面命令查看本地库的版本记录:

1
git log

图片

由于提交的内容有点多,一页显示不全,使用上下箭头依次向上向下翻一行,或者使用b向上翻一页,空格建向下翻一页,q退出。我们看到第一条记录:

commit e22bc415838f8781485a608cac7ca3e18ed85005 (HEAD -> master)
Author: sunnymaple sunnymaple@123.com
Date: Sun Jun 23 16:40:08 2019 +0800
n

第一行:
commit:表示一次提交;
e22bc415838f8781485a608cac7ca3e18ed85005:为本次提交的一个索引,它是一个哈希值,哈希是一系列的加密算法,Git底层采用的是SHA-1算法;
HEAD -> master:HEAD表示一个指针,指向当前分支最顶端的一个commit,该分支上一次commit后的节点,git版本的控制实质是HEAD指针的移动;
第二行:作者信息,即签名对应的user.name和user.email;
第三行:提交的日期;
第四行:git commit -m “n”,即双引号内提交的信息。
如果觉得上面git log命令看起来不够简洁,且内容多的时候看起来不方便,可以使用下面这些命令:

1
git log --pretty=oneline

图片

1
git log --oneline

图片

这里的索引号已经变短了,它取的是长索引号的前7个字符,虽然变的更短,但它足以保证不重复了。

1
git reflog

图片

其中HEAD@{n}:这个n代表的是当前版本,也就是HEAD->指向的版本移动到该版本所需要的步数。

2、本地库版本的移动

上一节我们说到版本的移动本质就是移动HEAD指针,然而我们有三种方式可以操作HEAD指针来移动本地库的版本,分别是基于索引值操作、基于“^”符号操作以及基于“~”符号操作。

2.1、基于索引值

直接上命令:

1
git reset --hard [<commit>]

由上一节的git reflog命令查看版本记录可以看出,当前本地库的版本处于e22bc41,如果我们要退回到d5e4028的版本,即test.txt文件最后一行的记录应该是k,在命令行中输入命令:

1
git reset --hard d5e4028

图片

然后我们再使用git reflog查看下版本记录:

图片

HEAD指针已经指向了版本d5e4028,我们在看看test.txt文件的内容:

图片

最后一行已是“kkkkkkkk”,我们想回到那个版本,就使用哪个版本索引值,无论是前进还是后退,就像有个时空隧道一样,我们可以在任意一个时代穿梭,非常方便,这个也是我最喜欢使用的一种方式。

2.2、基于“^”符号

该方式只能后退,也就是如果我们退到了k的版本,那在想回m的版本,使用该方式就不行了。

1
git reset --hard HEAD^

其中一个“^”表示退一步,n个表示退n步:

1
2
3
git reset --hard HEAD^
git reflog
cat test.txt

结果如下:

图片

那么问题来,退一步一个^,退两步^^,也许到10步十个^我们还能接受,那要是退100步、200呢,我们不是地主家的傻儿子学写字哈,肯定有其他办法,这就是接下来要讲的第三种方式。

2.3、基于“~”符号

该方式也只能后退,命令如下:

1
git reset --hard HEAD~n

其中n是数字,表示后退n步。

1
2
3
git reset --hard HEAD~2
git reflog
cat test.txt

结果如下:

图片

退2步到了h。

3、reset命令参数对比

在上一节讲解完三种方式移动本地库版本后,不知道大家是否和我有一样的疑问:
1、test.txt文件是在工作区的,为什么在使用reset命令移动本地库的版本后,test.txt文件也会随之改变呢?
2、既然工作区的内容会随之改变,那暂存区又是怎么变化的?
带着这两个疑问,我们首先使用git status命令查看当前的状态:

图片

好像并没有需要add或者commit的。
那再使用帮组命令:

1
git reset --help

输入命令后回车,会在浏览器中打开帮助文档(本地,而不是在线文档)

图片

这个帮助文档是本地的,而不是在线的,看到摘要的最后一行,rest 除了有hard参数外,还有soft、mixed、merge、keep参数,这些参数有什么区别呢?我们接着往下翻约这个帮组文档。

图片

1
git reset [<mode>] [<commit>]

即soft/mixed/hard等参数,而即我们使用git log查看历史版本记录的那个commit索引值,而当缺省时,默认使用mixed。

3.1、soft参数

只在本地库移动HEAD指针,不会改变工作区和暂存区。

1
2
3
git reset --sofy 1de85c6
git reflog
cat test.txt

图片

本地库变成了g的版本,而工作区最后一行还是h,并没有变成g,接下我们查看状态:

图片

正好,工作区和缓存区一致,但是本地库中后退了一个版本,所有出现了绿色的“modified:test.txt”字样,说明test.txt文件需要commit以下从缓存区提交到本地库。

3.2、mixed参数

mixed参数不仅在本地库移动HEAD指针,还会重置暂存区,使得暂存区和本地库一致,我们使用mixed参数再将HEAD指针回退一个版本:

1
2
3
git reset --sofy 765deba
git reflog
cat test.txt

图片

这里工作区的test.txt文件依然没有改变,而本地库后退到f的版本,似乎本没有看出它和soft的区别,那我们再查看下状态:
图片

这时候出现了红色的“modified: test.txt”字样,说明缓存区和本地库的版本都后退了,而工作区还存在修改的内容未被add到缓存区,当然,使用commit也可以直接提交到本地库。

3.3、hard参数

该参数作用比较强一些,它不仅会移动本地库的HEAD指针,还同时会重置缓存区和工作区。它功能演示我们已经在第二节已经说明了,这里我们使用hard参数来找回被删除的文件。

3.3.1、找回已添加到缓存区的文件

我们先创建一个test2.txt文件,然后添加到缓存区,再提交到本地库:

1
2
3
4
5
vi text2.txt
git add .
git commit -m "create text2.txt"
git status
ll

图片

工作区现在是两个文件,test.txt和text2.txt,然后我们吧text2.txt文件删除:

1
2
3
4
rm text2.txt
git add .
git status
ll

图片

那要如何找回text2.txt文件呢,使用下面的命令(不改变本地库,重置工作区和缓存区):

1
git reset --hard HEAD

图片

3.3.2、找回已提交到本地库的文件

先执行下面这些命令,将文件text2.txt文件删除,然后提交到本地库:

1
2
3
rm text2.txt
git add .
git commit -m "delete text2txt."

图片

查看状态和历史版本:

1
2
3
git status
ll
git reflog

图片

我们看到版本索引号0c4148f正好是创建文件是commit的记录,所以输入命令:

1
2
git reset --hard 0c4148f
ll

图片

删除的文件被找回。

4、比较文件的差异

4.1、工作区和暂存区比较

我们先删除在test.txt文件最后一行随便输入一行内容,然后将g对应一行的数据删除,然后输入命令:

1
git diff test.txt

图片
绿色的+表示添加的内容,红色的-表示删除的内容。

4.2、工作区和本地库比较

1
git diff [HEAD] <file>

其中[HEAD]可以为版本索引值,“^”符号:HEAD^,“”符号:HEADn,如:

1
 git diff e22bc41 test.txt

图片

5、总结

①、查看本地库历史版本:

1
2
3
4
git log
git log --pretty=oneline
git log --oneline
git reflog

②、本地库版本移动:
本地库版本移动有三种方式:
基于索引值:其中为每次提交的版本索引号,可以为soft、mixed以及hard等。
soft:只移动本地库;
mixed:移动本地库,同时重置缓存区;
hard:移动本地库,同时重置工作区和缓存区。

1
git reset [<mode>] [<commit>]

基于“^”符号:只能后退,不能前进,n个“^”符号表示后退n步

1
git reset [<mode>] HEAD^

基于“~”符号:也只能后退,不能前进,n表示后退n步

1
git reset [<mode>] HEAD~n

③、找回删除的文件
找回已在工作区删除,且已添加到缓存区的文件,但还未提交到本地库的文件:

1
git reset --hard HEAD

找回在工作区已删除,且已提交到本地库的文件,为对应的版本索引:

1
git reset --hard [<commit>]

④、文件差异比较
工作区和暂存区比较:

1
git diff <file>

工作区和本地库比较:其中[HEAD]可以为版本索引值,“^”符号:HEAD^,“”符号:HEADn

1
git diff [HEAD] <file>

最后更新: 2019年06月24日 09:26

原始链接: https://www.sunnymaple.cn/2018/08/06/Git本地基本操作(二)/

× 请我吃糖~
打赏二维码