上篇文章介绍了关于本地库的一些基本操作,如:初始化、添加、提交等等,本篇文章将介绍如何使用Git切换项目版本。

查看提交历史

在进行版本切换之前,我们需要了解一个指令:

git log

该指令能够查看提交历史,执行该指令,结果如下:

前面我们进行了两次提交,通过该指令就都显示出来了,包括提交的作者标识,提交时间,提交描述等。仔细观察,会发现这两次提交的信息展示不太一样:

首先是commit后面的字符串不一样,这是通过一系列hash算法计算出来的一个值,作为每次提交的索引;其次是在第二次提交中,有这么一个信息:(HEAD -> master),这里的HEAD其实是一个指针,它指向的是当前版本,所以要想实现版本的切换,我们就需要改变HEAD指针的指向。

为了后续测试,这里我再进行一次修改,然后提交:

查看提交历史的其它指令

使用git log指令虽然可以显示提交历史,但是显示得过于详细有时候也并不方便,当提交次数逐渐增多时,这样显然会加重我们查找某些重要信息的负担,所以我们还需要掌握几个关于查看提交历史的指令。

比如:

git log --pretty=oneline

意思是以只显示一行的方式来输出提交历史,结果如下:

还可以使用:

git log --oneline

运行结果:

该方式显示的内容将会更加简洁,哈希值只显示部分。

最后一条指令:

git reflog

运行结果:

这种方式显示提交历史的区别在于,它多了一个信息:HEAD@{0}

比如第二次提交信息中的HEAD@{1},意思是说,从当前版本切换到第二次提交的版本,需要将HEAD指针移动一次;
同理,HEAD@{2}表示切换到该版本需要将HEAD指针移动两次。

需要注意的是,只有git reflog能够显示所有版本的提交历史,什么意思呢?

假设有一个项目提交了很多次,此时想要回退到之前的版本,当你回退之后,其它查看提交历史的指令是无法看到当前版本之前的历史的,而git reflog可以。

如何进行版本切换

经过前面的铺垫,相信大家已经对版本切换的实现有了一个大体的认识,接下来就是掌握具体的指令了。
对于版本切换,Git提供了三种方式:

  1. 基于索引值
  2. 使用^符
  3. 使用~符

基于索引值进行版本切换

这是比较方便的一种切换版本的方式,既然是基于索引值,我们就得先得到索引值,执行指令:

git reflog


此时我若是想切换到第一次提交的版本,执行指令:

git reset --hard 43dc5b0

运行结果:

HEAD指针目前处于43dc5b0,版本切换成功。

切换版本时哈希值不必全部写出来,只需要写出部分能够唯一标识当前版本即可。

现在去看看工作区里的test.txt文件,打开一看:

文件是空的,此时证明版本已经回退到最初始的时候了。

该指令不光能回退,还能前进,比如我想前进到第二次提交时的版本,执行指令:

git reset --hard 47ee58a

运行结果:

再去看看test.txt文件:

没错,第二次提交的内容就是这个。

综上所述,通过索引值,我们能够切换到任意版本。

基于^符号进行版本切换

该符号也能实现版本切换,但它只能后退版本,无法前进。
我们先用索引值切换到最新的版本,执行指令:

git reset --hard 05f2f17

然后执行指令:

git reset --hard HEAD^

运行结果:

版本回退到了第二次提交的时候,查看test.txt文件内容:

指令中包含几个^符号则代表回退几个版本。

基于~符号进行版本切换

使用^符号虽然也能够实现版本切换,但我若是想回退几十个版本,那指令后面就得跟着几十个^符号,这显然不是一个好的选择,这时候就可以使用~符号。

假设我需要回退十五个版本,就可以执行如下指令:

git reset --hard HEAD~15

~符号后面的数字是多少则表示回退多少版本,所以该方式同样只能回退版本而无法前进。

reset指令的参数介绍

学习了版本切换之后,有同学可能会疑惑,git reset指令中的hard参数是什么意思?它是否有别的参数呢?

这里介绍reset指令的三个参数:

  1. soft
  2. mixed
  3. head

先看soft,这是官方文档对其的解释:

Does not touch the index file or the working tree at all (but resets the head to , just like all modes do). This leaves all your changed files “Changes to be committed”, as git status would put it.

意思是说,仅仅在本地库移动HEAD指针,完全不触及索引文件或工作树。

再看mixed:

Resets the index but not the working tree (i.e., the changed files are preserved but not marked for commit) and reports what has not been updated. This is the default action.

该方式会在本地库移动HEAD指针,并重置索引,但不重置工作树。

最后是head:

Resets the index and working tree. Any changes to tracked files in the working tree since are discarded.

该方式会在本地库移动HEAD指针,并重置索引和工作树。

soft参数

举个例子,目前我所处的是第二次提交的版本,执行如下指令:

git reset --soft 05f2f17

我们通过该指令切换到最新的版本,查看一下提交历史,执行指令:

gt reflog

运行结果:
目前HEAD指针确实指向了最新版本,但是我们去查看一下test.txt文件:

可以看到,test.txt文件并没有恢复到最新版本的内容,而且我们执行如下指令查看一下状态:

git status


看到这里,有些同学可能懵了,前面说了soft仅仅是改变了本地库中的HEAD指针,完全不触及索引和工作树,照这样说,工作区的内容应该完全没有变化,可通过git status指令,终端却提示我们有文件被修改了。这是为什么呢?

这里注意理解,事实上工作区里的文件确实没有被修改,只是因为版本区的HEAD指针被修改了,此时暂存区里的内容无法与版本区对应,相对来说,暂存区的内容被修改了。也就是说,版本区的版本往回退,相当于暂存区的内容往前了,所以终端才会提示我们有文件被修改了。事实上并不是真正意义上的被修改,可能思维会有点绕。

mixed参数

现在我们版本是处于最新版本,我们通过mixed参数回退到最初始的版本试一试:

git reset --mixed 43dc5b0

运行结果:

此时成功回退到最初始版本,我们看看test.txt文件:

文件依然没有变化,我们再执行git status指令查看一下状态:

这里又变成红色了, 红色表示未被暂存区追踪,这又该如何理解呢?

还是一样的道理,mixed参数会改变版本区的指针并重置索引,此时本地库和暂存区处于同一版本,它们都回退了,此时相对来说,工作区的版本就往前了,这并不是真正意义上的,而是相对而言的。

hard参数

该参数使得版本区、暂存区和工作区的版本同时变化,所以是没有前面的问题的。


微信搜索【码视界】或者扫描下方二维码关注我的微信公众号,更多精彩等着你!

轻松掌握Git开发(三)版本的切换相关推荐

  1. 轻松使用git命令查看版本记录

    目前开始使用git的用户大部分都经历过subversion,对于这两种版本管控系统的切换需要一定时间去适应.本文旨在帮助这些用户恢复部分熟悉的日志查阅习惯. 我们以一个具体的实例来熟悉git中log的 ...

  2. Git基础-git的历史版本查看与版本回退(版本切换)

    1.谈一谈git中的版本回退 1.我们在git中的每一次 git commit 操作就会提交一个历史版本: 2.每一个历史版本都有一个唯一的hash值进行记录: 3.每一个历史版本实际上就是我们对工作 ...

  3. 基于git(分布式版本控制系统)的各种服务器权限工具对比 Gitlab服务器搭建 以及邮箱、LDAP配置 实现公司多人协同开发

    前言 作为大一的小朋友,虽然学的专业和CS有那么一点关系,但放到实习的工作当中,那是完全不够用了:( 在实习老师的指导和帮助下,在实习的头个礼拜,逐步接触了解了git--开源分布式版本控制系统.并在第 ...

  4. Git命令大全:轻松掌握Git工具,提高代码管理效率

    文章目录 Git命令大全 一.前言 二.安装 1. Windows系统上的Git安装 2. Linux系统上的Git安装 3. MAC系统上的Git安装 三.配置 四.配置用户名和邮箱地址 五.创建仓 ...

  5. Git学习笔记 -- 安装git、创建版本库、时光穿梭、远程仓库

    一.Git的安装 在window系统上安装:从https://git-for-windows.github.io下载,然后按默认选项安装即可: 安装完成后,在"桌面"上右击,在弹出 ...

  6. git分散式版本管理系统,从安装到基本使用

    首先,当然是安装git了,不用寻思,官网下载即可 https://git-scm.com/downloads 第二是设置账户,鼠标右键,选择git bush,在命令窗口中进行设置 git config ...

  7. git回退历史版本无法上传_git下载历史版本

    git下载历史版本以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 1.git 获取历史版本的几种方式 我们简单的描述一个 ...

  8. GIT (分布式版本控制系统)

    Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. [1] Git的读音为/gɪt/. Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版 ...

  9. Git分支的创建,切换及分支指针移动的理解

    分支的掌握和理解到位对于我们工作中的并行开发十分重要,今天我们一起来研究它. 一,两人在一个分支上开发 程序员小王入职,拉取了仓库的代码,开发新需求. git clone https://github ...

最新文章

  1. 2022-2028年中国综艺节目市场深度调研及投资前景预测报告
  2. 2022-2028年中国金融云行业市场研究及前瞻分析报告
  3. 程序员的自我修养--链接、装载与库笔记:可执行文件的装载与进程
  4. 像证券交易员一样思考和行动_3纪律与心态
  5. Boost::context模块callcc的无限循环测试程序
  6. 模板:广义二项式反演/广义容斥(组合数学)
  7. NLP将迎来黄金十年,7个案例带你入门(附Python代码)
  8. 【Web页面测试】测试点和测试用例
  9. spring之@value设置默认值
  10. /usr/bin/ld: cannot find -lstdc++ -lz问题
  11. 好好学习,好好Show
  12. 387.字符串中的第一个唯一字符
  13. APP扫码登录WEB系统
  14. idea 配置svn插件
  15. CH341/CH340Linux驱动使用教程
  16. matlab ode45 二阶微分,matlab用ode45求解二阶微分方程为题 - 数学 - 小木虫 - 学术 科研 互动社区...
  17. 老机首选:龙行天下GHOST XP SP2万能预装系统软件自选安装终结版 201007
  18. Ubuntu虚拟机中安装分区(可用)
  19. qt qml StackView 触摸滑动返回(swiping pop)
  20. a星地图测试工具_A星算法地图编辑器

热门文章

  1. 学习笔记21.07.14:桑基图组合
  2. 用html查成绩,好分数怎么查询成绩?好分数查询成绩的方法
  3. word朗读功能在哪里?怎么用
  4. python VTK(十五) ----图像平滑 均值滤波 高斯平滑 中值滤波 各向异性滤波
  5. 11.12PTA训练 人狼羊菜过河 搜索,位运算
  6. 男士时尚鞋怎么搭配好?
  7. Oracle 9i迁移升级到Oracle 10g过程
  8. web初学经验:对于IOS不兼容 text-algin:justify
  9. chatGPT教你算法(4)——分治法
  10. 苹果html5插件,纯CSS打造各种超逼真的苹果(Apple)设备模型