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