菜鸟笔记
提升您的技术认知

Git系列:版本回退

•写在前面

在前面个一篇文章中,已经大致完成了基本的仓库创建和文件提交。现在我们在前一篇文章所做的工作(往提交了一个README.txt文件)下,进行接下来的操作,不知道的可以先去看看前一篇文章Git系列:如何创建和初始化仓库,添加更新修改

•查看仓库状态(status、diff)

已经往仓库中提交了一份README.txt文本,接下来对这个文本进行修改,更改里面的内容(随便打一段文字就好),然后我们可以使用如下指令查看当前仓库的状态。

$ git status
#这个指令可以查看当前仓库的一个状态,不过这个指令只会告诉你操
#作了哪些文件,并不会告诉你具体修改了啥,想要具体指导也很简单
#可以使用下面的这条指令,查看细节

$ git diff
#这条指令可以用于查看操作的细节

•版本回退

前面的修改使用add、commit指令提交更新之后,到此时为止,就已经提交了两个版本,你还可以多试几次修改并提交,顺便温习一下相关的指令。想一下,一两次提交还好,但是如果当你提交了非常多的版本之后,你还能记住提交了几次,啥时候提交的么?Git早就帮我们准备好了,这个时候可以使用如下指令查看。在下图输出的信息中,commit后面跟的一大串字符串是commit id(版本号),这个版本号怎么生成的呢?它是一个SHA1计算出来的非常大的数字,用十六进制表示,这样做的好处是避免在多人协作中的版本号冲突问题。

#查看仓库提交日志,包括提交人、时间以及相关文件,输出顺序是由近到远
$ git log 
#当然,你如果嫌命令行中输出的东西太多,只想查看时间线上的版本号,可以在末尾添加参数,如下
$ git log --pretty=oneline

 

知道了这个提交日志的时间线以及版本之后,我们现在尝试回退到我们想要的版本,相关的指令如下

#在Git中,当前版本表示用:HEAD,上一个版本表示用:HEAD^,
上上一个版本表示用:HEAD^^,在往上可以表示用:HEAD~n表示

$ git reset --hard HEAD^ #表示上一个版本
$ git reset --hard HEAD^^  #表示上上一个版本
$ git reset --hard HEAD~100  #表示前100个版本

回退到上个版本之后,我们可以使用cat指令查看一下README.txt中的内容,看一下是否回退了,指令如下。查看之后,你会发现目前所在版本已经回退了。

$ cat README.txt #查看README.txt文本的内容

值得注意的是,这个时候你可以再次执行上面的git log指令,查看当前时间线上的历史版本,如下图,你会发现最新的那个版本不见了。很慌,怎么办?这个时候,只要你原来的命令行还没有关掉,你可以使用用前面的查看的版本对应的commit id,回到对应的未来的某个版本,其中commit id的版本号没有必要写全,只要足够表示该版本唯一就行,Git会更具这个id找到唯一的那个版本,指令和相关操作图如下。(我的未来的那个版本号是:23dd7cc45ab3098897fdd4a54d123e9569a1e1c9,注意哦,你的不一定和我一样)。

$ git reset --hard 版本号

 

Git就是这么方便,这种回退可以理解成一个数组或者指针(实际上是指针),只要你有对应的索引或地址,就可以找到对应的版本。前面提到过,你查询了版本号,没有关掉Git窗口,所以你可以很容易找到版本号,但是万一你关掉了Git窗口,并且没有保存相关的版本号怎么办?不要担心,你可以使用如下指令,查询该仓库下的每一次操作命令。

$ git reglog  #该指令查询该仓库下历史的操作指令

•Git工作分区说明

这里我引用一下Git官方的文档说明(具体地址点这里),是英文文档,我大致解释一下,加上一些通俗的理解。官方的解释是说Git分为工作树、暂存区和Git目录。

工作树是项目的一个版本的单个引出,这些文件将从Git目录中的压缩数据库中拿出来,把那个放在磁盘上供开发者使用或修改。
暂存区是一个文件,通常包含在开发者的Git目录中,用于储存有关的下一次提交的内容信息。用专业一点的术语来说叫“索引”。
Git目录就是Git储存项目的元数据和对象数据库的地方。这是Git最重要的部分,它是从一台计算机克隆储存库时复制的内容。
基本的Git工作流程如下所示:
1、修改工作树中的文件。
2、可以有选择地暂存您要成为下一次提交的一部分的更改,这只会将这些更改添加到暂存区域。
3、执行一次提交,该提交将按阶段区域中的文件原样获取文件并将该快照永久存储到您的Git目录中。
如果文件的特定版本位于Git目录中,则视为已提交。如果已被修改,并加入到临时区域。如果检出之前尚未更改,但已对其进行了更改,则将对其进行修改。

说的比较emmm你懂的,其实没有很复杂,可以简单的理解成工作区和暂存区,暂存区里面有叫做stage的暂存区,以及Git帮我自动创建的主分支master。工作区就是我们项目的工程目录,就是在我的gittest目录下。暂存区就在隐藏的.git文件中。大致的工作流程就是,你在工作区的工程目录中进行了修改,提交到stage中,历史中对仓库的所有操作分支都是往master上加的。

•下一步

到目前为止,大致的讲解了Git对版本回退的一些流程和指令,下一步我将对修改和删除进行讲解。