Git版本回退、跳转与数据恢复

2018-03-13 11:32:03 浏览数 (1)

HTML5学堂-利利:上周,为大家介绍一款“分布式版本控制系统”——Git。除了介绍“分布式”的概念、对比SVN与Git之外,我们讲解了基本的Git初始化与提交文件。如果想具体了解Git与通过Git添加提交文件的请前往:Git与通过Git添加提交文件。今天我们来说说如何删除文件以及“撤销”我们的操作。

今日内容:

1 删除文件

2 Git的“提交”机制

3 版本回退与跳转

4 工作区、暂存区内容恢复

删除没用的文件

在上一篇文章当中,我们讲解了Git的基本知识,也提到了如何向Git中增加以及提交数据(git add和git commit命令),提到了“增加”,我们自然而然会想到“删除”。

删除无用文件的方式有两种,一种是直接在文件管理器中把没用的文件删除掉(翻译成人话就是:在打开的文件夹当中选中文件,并且delete);另一种方法是使用rm命令进行文件删除。

rm命令的基本语法

$ rm 文件名 (执行之后运行“git commit”提交)

如果发生了误删怎么办?!!

先别慌,Git为我们提供了“丰富”的“后悔药服务”,在了解“后悔药服务”之前,我们需要先掌握两个命令,用于我们更好的查看每个版本的区别以及状态

git status 与 git diff

通过git status查看当前版本库状态。

如果我们通过git status命令,发现Git版本库的状态发生了变化,那么,我们有可能想了解具体在哪里发生了变化。这时候,我们可以通过git diff查看版本的变化。

贴心的“后悔药服务”

“后悔药服务”得以运行的原理

利利在这里将Git这种服务戏称为“后悔药服务”,而更准确的说法应该是“Git的跳转”,“Git的跳转”既包括Git版本跳转,也包括“分阶段跳转(一些撤销服务)。Git的交互图如下:

初始状态下的工作区与Git版本库

工作区增加了一个index.css文件之后,工作区与Git版本库的状态:

执行git add命令后,工作区与Git版本库的状态:

执行git commit命令后,工作区与Git版本库的状态:会创建一个新的版本,并且让HEAD指向这个版本。

HEAD是什么:Git在内部有个指向当前版本的HEAD指针

版本“跳转”与“分阶段跳转”

上面的基本原理当中,很多地方都可以“回退”。

1 可以通过改变HEAD指针的指向,回退一个版本;

2 利用HEAD指针,实现从过去的版本到新的版本的“跳转”;

3 从版本库取备份,恢复暂存区

4 从暂存区取备份,恢复工作区

“后悔药服务”操作流程

1 利用git log命令或git reflog命令查看每次提交情况

2 使用git reset命令,进行版本库版本的“跳转”(主要是利用commit ID号码或HEAD指针)

3 使用git reset HEAD file命令从版本库取备份,恢复暂存区

4 使用git checkout -- file命令从暂存区取备份,恢复工作区

git log命令

我们可以通过git log方法获取到所有Git版本变化的历史,显示从最近到最远的提交日志。显示效果如下图:

利利个人是感觉信息挺完善的,如果大家觉得这样的信息太乱,太冗余(存在作者和更新时间),则可以采用这样的命令:$ git log --pretty=oneline。表示的在一行之内显示信息,信息中包括了一个ID号码和具体的操作,但是并不包括作者和时间。

关于那个ID号码:那个巨长的字符串就是commit的ID号,这个ID号码是一个十六进制的数字,这个数字是所有使用这个Git项目的人所通用的(因为Git是分布式的版本控制系统,有可能是多个人在同一个版本库里工作,这也是为何没有使用1,2,3……作为版本号)

git reflog命令

$ git reflog 可以打印出我们的每一次的Git命令历史;即便是我们进行版本回退之后,依旧能够检查到之前每次Git命令的ID,再通过ID去找到回退之前“比较新”的版本。

git reset

该命令主要是通过HEAD这个指针,在各个版本之间进行切换。由于每次版本库变化一次,都会创建一个版本分支。而HEAD就是指向各个版本分支的指针,我们可以利用HEAD的指向来改变当前的版本。比如:

回到上一个版本 $ git reset --hard HEAD^

回到上上个版本 $ git reset --hard HEAD^^

回到上上个版本 $ git reset --hard HEAD~2

Tips: 此处的数字表示要回退几个版本

另外,我们也能够通过commit ID,这个具有“唯一”特性的,能够标识每次Git提交操作的ID号码进行版本的跳转,如:

$ git reset --hard commit_id

git reset HEAD file

file表示的是具体文件名

用于从版本库取备份,并恢复暂存区

git checkout -- file

file表示的是具体文件名

用于从暂存区获取备份,并恢复工作区

“git checkout -- file”命令中的“--”很重要,没有“--”,就变成了“切换到另一个分支”的命令


实例讲解

举一个例子吧,我们当前的index.css文件内容如下:

我们现在操作了index.css中的一些代码,删除掉了一部分代码,如下为删除后的代码内容:

使用git diff命令进行检查,我们发现,Git告知我们当前暂存区与工作区不同。

接下来,我们使用git add命令,将index.css添加到暂存区,此时再比较则没有差别。

可是,就在我们即将提交之前,我们后悔了,我们发现这段代码不应该删掉,希望能够恢复当前index.css的代码,应当如何处理?

首先,使用“git reset HEAD file”命令,从版本库取index.css文件恢复到暂存区。

当我们使用git diff比较暂存区和工作区时,发现存在差别。这说明我们已经将暂存区的文件成功恢复了。

接下来,只需要再利用“git checkout -- file”命令,实现将暂存区文件恢复到工作区即可:

恢复工作区,再使用git diff命令时,我们发现,并没有返回任何内容,也就是说,当前工作区与暂存区的内容是一致的。

此时我们打开我们原有的index.css文件,发现已经恢复为修改前的状态了。任务完成~!!!


总结

1 Git存储的机制在于“工作区 ——> 暂存区 ——> 版本分支”

1.1 git add的命令在于将工作区的数据提交到暂存区

1.2 git commit的命令在于将暂存区的数据创建一个新的版本分支

1.3 版本库当中,存在一个HEAD指针,用于指向当前最新的版本

2 基于Git的存储方式,可以实现版本的回退与跳转,也可以实现工作区、暂存区的恢复

2.1 用git log可以查看提交历史,以便确定要回退到哪个版本

2.2 用git reflog查看命令历史,以便确定要跳转到未来的哪个版本

2.3 使用命令git reset --hard commit_id。能够直接到达某一版本

2.4 使用命令git reset HEAD file,可以利用当前版本数据恢复暂存区数据

2.5 使用命令git checkout -- file,可以利用暂存区数据恢复工作区数据

3 $ rm 文件名 删除文件

HTML5学堂小编 - 利利 耗时10小时

0 人点赞