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

Git is a distributed version control system.
Git is free software distributed under the GPL.

然后尝试提交:

$ git add readme.txt
$ git commit -m "append GPL"
[master 3628164] append GPL
1 file changed, 1 insertion(+), 1 deletion(-)

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

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

版本1:wrote a readme fileGit is a version control system.
Git is free software.版本2:add distributedGit is a distributed version control system.
Git is free software.版本3:append GPLGit is a distributed version control system.
Git is free software distributed under the GPL.

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

$ git log
commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Tue Aug 20 15:11:49 2013 +0800append GPLcommit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Tue Aug 20 14:53:12 2013 +0800
add distributedcommit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Mon Aug 19 17:51:55 2013 +0800
wrote a readme file

git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是“append GPL”,上一次是“add distributed”,最早的一次是“wrote a readme file”。如果嫌输出信息太多,看得眼花缭乱的,可以试试加上
--pretty=oneline参数:

$ git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file

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

每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线:

好了,现在我们启动时光穿梭机,准备把readme.txt回退到上一个版本,也就是“add distributed”的那个版本,怎么做呢?

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

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

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

--hard参数有啥意义?这个后面再讲,现在你先放心使用。

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

$ cat readme.txt
Git is a distributed version control system.
Git is free software.

果然。

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

$ git log
commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Tue Aug 20 14:53:12 2013 +0800add distributedcommit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Mon Aug 19 17:51:55 2013 +0800wrote a readme file

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

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

$ git reset --hard 3628164
HEAD is now at 3628164 append GPL

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

再小心翼翼地看看readme.txt的内容:

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

果然,我胡汉山又回来了。

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

改为指向“add distributed”:

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

您的浏览器不支持播放该MP4视频

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

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

$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file

终于舒了口气,第二行显示“append GPL”的commit id是3628164,现在,你又可以乘坐时光机回到未来了。

您的浏览器不支持播放该MP4视频

小结

现在总结一下:

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

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

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

转自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013744142037508cf42e51debf49668810645e02887691000

git 版本回退相关推荐

  1. git版本回退简单记录

    简单记录git版本回退的命令,参考的是这篇文章1 首先查看以前存档的版本: git log 1. 知道要回退的版本和现在的版本差了多少代 回退上一代版本(1个以前) git reset –hard H ...

  2. git 版本回退 git reset --hard HEAD

    git 版本回退 git reset --hard HEAD 一不小心用git pull拉取远程仓库代码 ,把本地开发的新代码直接覆盖掉,这时想恢复本地代码要如何操作 1.进入到项目git本地仓库文件 ...

  3. Git版本回退并强制推送到远端

    Git版本回退并强制推送到远端 本文参考廖雪峰的Git教程 前言:本文章解决问题的前提是本人不小心修改了本地代码仓库的最外层目录权限,不知道原权限是什么,导致本地git提示几十个文件被修改过,实际内容 ...

  4. git误删文件找回方法/git版本回退方法

    使用git命令 git rm css/\*.css 我删掉了css文件夹下所有以.css结尾的文件,那么要怎样才能把文件找回来呢,下面说说方法,删掉其他的文件也是一样的方式找回. 第一步:使用git ...

  5. GIt版本回退还不会用?轻松学会不怕失误

    场景 本地Commit了两次,等到推送到github时,发现第一次commit提交的文件有一个大于100m,无法提交成功, 所以需要将版本回退到两次提交之前. 实现 首先输入: git reflog ...

  6. Git版本回退之 reset 和 revert

    在开发过程中,可能会遇到过错误提交的情况.这种情况下,先不要着急,可以通过以下两个命令来帮助你优雅的实现版本回退. git reset 假如现在有如下几个提交: 其中:A 和 B 是正常提交,而 C ...

  7. git版本回退命令_Git学习版本回退和管理文件的修改及删除操作

    版本回退 前面我们成功的提交了一次mygit.txt,下面咱对它进行修改,内容如下: Hello Git Git is so easy. 然后用git status来跟踪该文件的状态: 可以看到hel ...

  8. git版本回退(3)

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

  9. Git——版本回退【git reset / git log / git reflog】

    前言:下面是在版本回退中常用的命令. 1. git log -- 查看版本日志 $ git log   HEAD为当前指向的版本指针.使用git log 查看版本日志后,显示了它们的版本号是一系列SH ...

  10. git 版本回退之关于git reset --hard 和 --soft区别

    去年刚接触android源码开发时候第一次接触git,当时因为framework修改和别人冲突造成不少合并失败,后来学习到了这两个指令,经常用,所以记录一下. git reset --hard HEA ...

最新文章

  1. 构建之法阅读笔记01
  2. vue中echarts 5.0版本以上不支持因为官方移除了地图数据和map文件夹
  3. OpenGL 实例化 Instancing
  4. 如何在官网中下载历史版本的火狐浏览器
  5. 两个分布的特征映射_跨语言分布表示学习方法概述
  6. 雷军喜获2019年复旦企业管理杰出贡献奖!
  7. 很多人都忽视了账号基建重要性
  8. 你知道吗?还有比自回归方式更快更好的序列生成!
  9. Self-introduction (自我介绍)
  10. 词法分析器(不讲武德java版)
  11. SnowNLP自然语言处理模块具体用法
  12. ElementUI表单构建
  13. 解析MOS管电流方向反及其体二极管能过多大电流问题
  14. 面试官问我 RabbitMQ 消息如何插队?
  15. 小人物走路、奔跑的VC++游戏特效,适合刚学习VC++游戏编程的朋友
  16. STM32F103C8T6基于HAL库制作RTC时钟
  17. oral-b app Android,oral b app
  18. The Shawshank Redemption-18
  19. 10.Unity2D 横版 简单AI 之 敌人随机移动+自动巡逻+障碍物跳跃+悬崖处转身+射线检测
  20. Android电子书阅读器开发笔记(1):创建电子书阅读器项目

热门文章

  1. 摄像机忘记密码怎么办
  2. Win系统蓝牙设备删除失败 - 解决方案
  3. liteos简介(一)
  4. 【动态规划】HDU 1081 XMU 1031 To the Max
  5. PAT甲级1005 Spell it Right 【20】【字符串操作】
  6. JMeter与其它工具对比
  7. centos安装rvm(菜鸟安装)
  8. 微博图床php上传,使用新浪微博图床
  9. python中类的首字母一定得大写吗_Python学习
  10. MySQL数据的独立性包括_数据库独立性是指数据库和什么相互独立?