现在你的本地仓库底下添加一个readme.txt文件

第一次readme.txt的内容如下::

Git is a version control system
Git is free sofwore

然后提交到版本库

$ git add readme.txt

$ git commit -m "wrote a readme file"
[master (root-commit) d3dba3b] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt

然后修改readme.txt 文件如下:

Git is a distributed version control system
Git is free sofwore

然后尝试提交

$ git add readme.txt

$ git commit -m "add distributed"
[master 31e2d76] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)

然后再一次对readme.txt进行修改如下:

Git is a distributed version control system
Git is free sofwore distributed under the GPL

然后尝试提交

$ git add readme.txt

$ git commit -m "append GPL"
[master b336dab] append GPL
1 file changed, 1 insertion(+), 1 deletion(-)

像这样你不断的对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态,有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始,Git也是一样,每当你觉得文件修改到一定程度的时候,就可以"保存一个快照",这个快照在Git中被称为commit,一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

  现在我们回归一下readme.txt文件一共有几个版本被提交到Git仓库里了

  版本1:wrote a readme file

    Git is a version control system.

    Git is free software.

  版本2:add distributed

    Git is a distributed version control system.

    Git is free software.

  版本3:append GPL

    Git is a distributed version control system.

   Git is free software distributed under the GPL.

  当然了,在实际工作中,我们脑子里怎么会可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么,版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看

$ git log
commit b336dab7d633341298a9f39972ac12b91630c2bf (HEAD -> master)
Author: xiaoqingchen17 <1277981353@qq.com>
Date: Fri Sep 14 16:21:04 2018 +0800

append GPL

commit 31e2d7628ee7d98c65af520fbbc78ca44b62cd29
Author: xiaoqingchen17 <1277981353@qq.com>
Date: Fri Sep 14 16:20:20 2018 +0800

add distributed

commit d3dba3b6000964766611a15c9c474b3e2aa328a1
Author: xiaoqingchen17 <1277981353@qq.com>
Date: Fri Sep 14 16:19:21 2018 +0800

wrote a readme file

  git log命令显示从最近到最远的提交日志,我们可以看到三次提交,最近一次是append GPL,上一次是add distributed,最早一次是wrote a readme file

  如果嫌输出的信息太多,看得眼花缭乱,可以试试加上--pretty=oneline参数 

$ git log --pretty=oneline
b336dab7d633341298a9f39972ac12b91630c2bf (HEAD -> master) append GPL
31e2d7628ee7d98c65af520fbbc78ca44b62cd29 add distributed
d3dba3b6000964766611a15c9c474b3e2aa328a1 wrote a readme file

  需要友情提示得是,你看到得一大串b336dab7d633341298a9f39972ac12b91630c2bf的是commit id(版本号),和SVN不一样,Git的commid不是1,2,3.......递增的数字,而是一个SHA1计算出来的一个非常打的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准,为什么commit id 需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,如果有很多人在同一个版本库里工作,如果大家都用1,2,3......作为版本号的话,那肯定就冲突了

  如果我们要把readme.txt回退到上一个版本,也就是add distributed的那个版本怎么做呢?

  首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交b336dab7.....(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,当然往上100个版本写100个^比较容易数不过来,所以成HEAD~100

  现在,我们要把当前版本append GPL回退到上一个版本add distributed,就可以使用git reset命令:  

  $ git reset --hard HEAD^
  HEAD is now at 31e2d76 add distributed

--hard参数有啥含义?这个以后再讲。

看看readme.txt的内容是不是版本add distributed:

果然被还原了。

还可以继续会退到上一个版本wrote a readme file,不过且慢,我们用git log再看看现在版本库的状态

$ git log
commit 31e2d7628ee7d98c65af520fbbc78ca44b62cd29 (HEAD -> master)
Author: xiaoqingchen17 <1277981353@qq.com>
Date: Fri Sep 14 16:20:20 2018 +0800

add distributed

commit d3dba3b6000964766611a15c9c474b3e2aa328a1
Author: xiaoqingchen17 <1277981353@qq.com>
Date: Fri Sep 14 16:19:21 2018 +0800

wrote a readme file

最新的那个版本append GPL已经看不到了,好比你从21世纪做时光穿梭机来到了19世纪,想再回去已经回不去了,怎么办?

办法其实还是有的,只要上面的命令行窗口还没有关掉,你就可以顺着往上找啊找,找到那个append GPL的commit id是b336da..........,于是就可以指定回到未来的某个版本

$ git reset --hard b336da
HEAD is now at b336dab append GPL

版本号没有必要写全,前几位就可以了,Git 会自动去找,当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了

再看看readme.txt的内容:

$ cat readme.txt
Git is a distributed version control system
Git is free sofwore distributed under the GPL

果然,我胡汉三又回来了

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL

改为指向add distributed

然后顺便把工作区的文件更新了,所以你让HEAD指向哪个版本号,你就把当前版本定位在哪

现在,你回退了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commid id怎么办?

在Git总有后悔药可以吃,当你用给git reset --hard HEAD^回退到add distributed版本时,再想恢复到append GPL,就必须找到append GPl的commit id,Git提供了一个命令Git reflog用来记录你的每一次命令:

$ git reflog
b336dab (HEAD -> master) HEAD@{0}: reset: moving to b336da
31e2d76 HEAD@{1}: reset: moving to HEAD^
b336dab (HEAD -> master) HEAD@{2}: commit: append GPL
31e2d76 HEAD@{3}: commit: add distributed
d3dba3b HEAD@{4}: commit (initial): wrote a readme file

从输出可知,append GPL的commit id是b336dab,现在你又可以乘坐时光机回到未来了

小结

现在总结一下:

  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

Git---时光穿梭机之版本回退02的更多相关文章

  1. 第二课 ---git时光穿梭(版本回退)

    1.  git  status  掌握仓库当前的状态. 2.  git  diff 查看修改的内容部分. //版本回退: 1.查看更新的历史记录. git log git log --pretty=o ...

  2. Git入门 时光穿梭鸡 版本回退 工作区 暂存区

    分布式集中式 CVS及SVN都是集中式的版本控制系统 , 而Git是分布式版本控制系统 集中式版本控制系统,版本库是集中存放在中央服务器的, 而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得 ...

  3. Git时光机穿梭之版本回退

    现在,你已经学会了修改文件,然后把修改提交到Git版本库,现在,再练习一次,修改readme.txt文件如下: Git is a distributed version control system. ...

  4. git-【二】本地git操作提交、版本回退

    一.创建版本库,提交文件 什么是版本库?版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任 ...

  5. 【git】远程仓库版本回退方法

    1 简介 最近在使用git时遇到了远程分支需要版本回滚的情况,于是做了一下研究,写下这篇博客. 2 问题 如果提交了一个错误的版本,怎么回退版本? 如果提交了一个错误的版本到远程分支,怎么回退远程分支 ...

  6. Git 基础教程 之 版本回退

    不断对文件进行修改,然后不断提交修改到版本库里. 当你觉得文件修改到一定程度时,可以保存一个“快照”,这个“快照”在Git中称为“commit”. 一旦文件被改乱了.误删了,都可以从最近一个“comm ...

  7. 【Git】三、版本回退&撤消修改&文件删除

    提要 //查看git操作日志 $ git log //单行格式查看操作日志 $ git log --pretty=oneline //还原操作到上一次版本,有几个^就上几次 $ git reset - ...

  8. git 撤销修改和版本回退

    1. 工作区 文件只是在工作区进行了修改,还没有提交到暂存区(未进行 git  add 操作) 此时可以使用  git  checkout  --  filename  撤销工作区文件的修改 效果相当 ...

  9. Git 时光穿梭机

    git log 提交日志 git reflog 命令日志 git status 查看状态 管理修改 git diff 工作区与暂存区 git diff master 工作区与版本库 git diff ...

随机推荐

  1. POJ 2251 Dungeon Master bfs 难度:0

    http://poj.org/problem?id=2251 bfs,把两维换成三维,但是30*30*30=9e3的空间时间复杂度仍然足以承受 #include <cstdio> #inc ...

  2. javascript浅拷贝和深拷贝

    /* 浅拷贝 */ function extend(parent, child) { var i; child = child || {}; for (i in parent) { if (paren ...

  3. hdu5818

    题解: 维护两个左偏树 按照左偏树模板来做 代码: #include<cstdio> #include<cmath> #include<algorithm> #in ...

  4. delphi从dll中调用图片资源

    假定你的一个dll中有bmp图片,其中图片的别名为'img'(如何将图片放入dll中百度上有图文教程) 当想将dll中的bmp导出时,可以用如下实例代码: procedure TForm1.FormC ...

  5. IDEA12使用初体验

    最近将开发工具IDEA升级到了12.0版本,被它新的UI界面深深吸引,看下面,很酷哦~ 一.下载安装 在IDEA官网下载最近版本12.0,有免费的社区版,还有收费的无限制版,大家可以自行下载. 下载后 ...

  6. 解决Jenkins权限配置错误,导致登录时出现没有Overall/read权限

    问题 由于初次接触jenkins,于是在搭建好jenkins以后,想要对用户进行管理,于是乎开始在系统管理->configure Global Security里设置用户的权限. 在启用安全-& ...

  7. linux内存查看工具

    这里帮你总结了一下Linux下查看内存使用情况的多种方法~ 在做 Linux 系统优化的时候,物理内存是其中最重要的一方面.自然的,Linux 也提供了非常多的方法来监控宝贵的内存资源的使用情况.下面 ...

  8. 【thrift】什么是rpc

  9. /etc/fstab和/etc/mtab

    一./etc/fstab和/etc/mtab的区别 1./etc/fstab /etc/fstab是开机自动挂载的配置文件,在开机时起作用.相当于启动linux的时候,自动使用检查分区的fsck命令和 ...

  10. 便捷的Jenkins jswidgets

    很多时候我们在构建完成之后需要查看构建的状态,类似github 中的build Status 插件安装 搜索插件 使用 目前好像只支持自由项目的构建 代码集成 <!DOCTYPE html> ...