现在你的本地仓库底下添加一个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. thread.event说明

    Python中的threading.Event()操控多线程的过程有: - 定义事件:man_talk_event = threading.Event() - 创建线程,传入对应事件:t1 = thr ...

  2. PHP:第五章——字符串输出函数

    <?php header("Content-Type:text/html;charset=utf-8"); /*字符串输出函数*/ //1.echo 输出一个或多个字符 // ...

  3. Qt Creatror使用designer修改了界面但是编译无反应的解决方法

    这个问题主要是UI没有更新导致的,根治的方法为: 项目中的.pro内增加 UI_DIR=./UI,同时删除掉源代码目录中ui_*.h,clear all,->qmake->rebuilt ...

  4. 知名第三方编译版tete009 Firefox 24.0

    Firefox除了官方版本上还有许多由爱好者自己编译修改的第三方版本. 其中 tete009 是十分流行的一个版本,目前tete009 Firefox 24.0 版本发布. tete009版Firef ...

  5. L194

    For many of us, asking for help is it difficult concept. We may feel as if we are admitting a weakne ...

  6. React Diff 算法

    React介绍 React是Facebook开发的一款JS库,用于构建用户界面的类库. 它采用声明式范例,可以传递声明代码,最大限度地减少与DOM的交互. 特点: 声明式设计:React采用声明范式, ...

  7. iOS-----简易地CocoaAsyncSocket使用

    CocoaAsyncSocket使用 代理的.h文件 //GCDAsyncSocketDelegate执行代理对象 #import <Foundation/Foundation.h> #i ...

  8. tomcat日志文件目录修改

    tomcat每次启动时,自动在logs目录下生产以下日志文件,造成日志文件众多: 将logs的日志文件放置到新建的文件夹位置,避免主硬盘空间的占用.主要更改catalina.out的文件位置和每日的日 ...

  9. ZetCode PyQt4 tutorial work with menus, toolbars, a statusbar, and a main application window

    !/usr/bin/python -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial This program create ...

  10. QLoo graphql engine了解

    参考架构图 处理流程 使用gloo注册服务api 发现断电以及serverless 函数 更新graphql schema 在qloo的resolvermap 中连接schema定义的字段 特性 不用 ...