现在你的本地仓库底下添加一个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. HDU1102 最小生成树prim算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102 题意:给出任意两个城市之间建一条路的时间,给出哪些城市之间已经建好,问最少还要多少时间使所有的城 ...

  2. linux下informatica服务安装和配置

    本文中将会用infa简称代替informatica 1.安装前准备 介质名称 版本信息 描述 Informatica Powercenter 9.5.1 for Linux 64 bit 必须 Jav ...

  3. WebLogic发布S2SH应用时提示ClassNotFoundException: org.hibernate.hql.ast.HqlToken异常

    使用Spring+hibernate如下 <properties> <!--定义方言.fetch深度.是否显示sql--> <property name="hi ...

  4. Alpha冲刺一 (9/10)

    前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10034872.html 作业博客:https://edu.cnblogs.com/campus ...

  5. NodeJS反序列化漏洞利用

    原文来自:http://www.4hou.com/web/13024.html node.js是一个服务器端的运行环境,封装了Google V8引擎,V8引擎执行JavaScript速度非常快,性能非 ...

  6. New Concept English Two 14 34

    recently  busy  a lot ,just  practices   every   morning. $课文32  购物变得很方便 324. People are not so hone ...

  7. vue.js 源代码学习笔记 ----- html-parse.js

    /** * Not type-checking this file because it's mostly vendor code. */ /*! * HTML Parser By John Resi ...

  8. 基于zookeeper简单实现分布式锁

    https://blog.csdn.net/desilting/article/details/41280869 这里利用zookeeper的EPHEMERAL_SEQUENTIAL类型节点及watc ...

  9. java面试题6

    1.写一个冒泡排序的算法 升序排列: int[] nums = {5,6,9,10,20,30,28,27,15}; for(int i = 0;i<nums.length;i++){ for( ...

  10. NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

    NET Core 实战:使用 NLog 将日志信息记录到 MongoDB https://www.cnblogs.com/danvic712/p/10226557.html ASP.NET Core ...