前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Git版本回退、跳转与数据恢复

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

作者头像
HTML5学堂
发布2018-03-13 11:32:03
1.6K0
发布2018-03-13 11:32:03
举报
文章被收录于专栏:HTML5学堂

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小时

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 懂点君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 今日内容:
  • 删除没用的文件
    • rm命令的基本语法
    • git status 与 git diff
    • 贴心的“后悔药服务”
      • “后悔药服务”得以运行的原理
        • 版本“跳转”与“分阶段跳转”
        • “后悔药服务”操作流程
          • git log命令
            • git reflog命令
              • git reset
                • git reset HEAD file
                  • git checkout -- file
                  • 实例讲解
                  • 总结
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档