大家好,今天我们来着重介绍一个非常关键的功能就是reset。在上一篇文章介绍修改历史记录的时候曾经提到过,当我们需要拆分一个历史提交记录的时候需要使用reset。估计很多小伙伴不明白,reset究竟做了什么,所以在这篇文章当中我们来详细聊聊。

git reset功能整体的操作分为三个步骤,我们拆分开来详细介绍。

第一步(移动指针)

虽然reset有三个步骤,但是我们通过加入不同的参数,可以实现在不同的步骤退出。但是不管怎么操作,第一步都是一定会执行的。

reset的第一步就是移动HEAD指针,HEAD指针我们都知道就是当前的工作目录的指针。说到移动指针,我们可能会想起checkout,checkout的功能就是移动指针。我们不仅可以移动到另外的分支,也可以移动到之前某一次的提交记录。

这是我们这个git专题的目录,如果我们执行git checkout bee9ce,那么我们的工作目录会被重置到这个提交之后的状态。而最新的add article 17这个commit的所有改动都会不可见,就好像发生了时间倒流一样,我们回到了刚刚commit完add new articles的状态。

reset虽然也一样是移动HEAD指针,但是它对于移动之后的处理不同。reset之后我们的commit不是不可见而是被回滚了。

我们来做个实验,现在我们在目录当中创建一个test.txt文件,我们把它commit。

然后我们执行git reset --soft HEAD~。

这里的HEAD~我们应该都了解了,HEAD表示当前位置,~表示前一个位置。所以连起来就是表示reset到HEAD之前的一个提交。soft参数表示我们reset的时候只执行第一个步骤,也就是移动指针的步骤。

reset之后我们发现test.txt这个文件并没有消失,仍然还在暂存区当中,只不过还没有被commit。这就是reset回滚commit的操作,它不会把改动抹除,但是会把commit取消。

第二步(更新暂存区)

如果我们在reset的时候加上了--soft的参数,它会在执行第一步结束之后就退出,后面的第二步和第三步都不会执行。

如果想要执行第二步,我们可以不传任何参数,或者是指定--mixed。因为reset的默认参数就是--mixed。

第二个步骤是更新暂存区,前面我们看见了,如果只是移动指针,那么在移动的时候会把中间的commit全部取消。虽然这些提交被取消了,但是它们对应的改动仍然存在,并且一样存放在暂存区当中,相当于执行完git add之后的状态。

如果我们继续执行第二步,git会把暂存区也给重置,回到git add之前的状态

如上图所示,我们执行了git reset HEAD~之后再执行git status可以看到test.txt回到了被add之前的状态。

第三步(回滚修改)

reset的最后一步是回滚修改,也就是在第二步的基础上,进一步把改动全部抹除,回滚到没有修改之前的状态。如果需要实现这一点,需要加上--hard参数。

这是一个非常危险的操作,它不仅会回滚已经被commit的所有改动,并且还会强制覆盖当前工作区,所有没有被提交的改动也一样会消失。只要是提交了的改动,即使reset了,也可以通过reflog找回来,但是如果没有提交的就没有办法了,所有的改动都会消失。对于开发者来说,这是一个巨大的打击,一定要切记慎重。

最后我们简单总结一下reset的用法。

git reset --soft,只会回滚commit操作,所有的改动都会保留在暂存区。相当于回到了执行git commit之前。

git reset --mixed,不仅会回滚commit操作,也会回滚暂存区内的内容。相当于回到了执行git add之前。

git reset --hard,会回滚一切,重置工作区。相当于回到了改动之前,没有被commit的内容会丢失

reset是一个很好用的功能,使用熟练可以起到非常大的作用,实现一些炫酷的功能。但是它也有很大的隐患,如果一不小心使用了--hard可能会导致一些悲剧发生。我就有过几次不小心把刚写完的代码回滚了的经历,所以大家在使用的时候一定要千万小心。

今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、关注、转发

想成为Git大神?从学会reset开始吧的更多相关文章

  1. 学会了这一招,距离Git大神不远了!

    大家好,今天我们来介绍git当中一项非常重要的功能--交互式工具 有的时候如果我们要处理的文件很多,使用git add .等操作会非常有隐患,因为很有可能我们一不小心就疏忽了一些内容.如果我们使用一个 ...

  2. 详解git rebase,让你走上git大神之路

    在之前的文章当中我们介绍了git merge的用法,明白了通过git merge我们可以合并两个分支的改动.这样我们就可以很方便地进行协同开发了,每个人都在自己的分支下开发代码,开发完毕之后再一起合并 ...

  3. 要想成为前端大神,那些你不得不知晓的web前端命名规范。

    一.Web语义化 1.1 H5的语义化 对于经验资深的前端er,在给web布局时,相信都会很注重标签和命名的规范.尤其是随着html5的普及发展,更是把web前端语义化推向一个新的台阶上.比如html ...

  4. javascript大神修炼记(1)——入门介绍

    读者朋友们好,从今天开始,我将带领新朋友们,从了解javascript开始,一步一步地进阶到大神境界,别的不废话,现在开始,我们就一点一点地从入门阶段开始. 我们还是介绍一下javascript的身世 ...

  5. PS大神的作品,每张都是科幻大片!

    相信大家在网上一定见过 各种PS的作品 但是要想成为“PS大神”, 不仅仅要会P图, 最关键的就是脑洞! 同样的马路破坏效果 在大神操作后变成了大片! 摩托车换成了骏马 这效果果然不一般! 这个绝对牛 ...

  6. 将一台电脑上的虚拟机上的系统复制到另一台电脑的虚拟机上!!!and想询问大神们问题的解决办法??

    虚拟机是Oracle VM VitualBox版本 前段日子oracle老师让课下安装虚拟机+windows8+oracle数据库,但悲伤的我安了七八遍(重装系统+安装数据库+配置数据库)依旧在配置数 ...

  7. 刚看完了一本关于javascript的书感觉受益匪浅,原来不懂的东西这么多,想问问怎么成为大神?求教!!!!!!

    刚看完了一本关于javascript的书感觉受益匪浅,原来不懂的东西这么多,想问问怎么成为大神?求教!!!!!!

  8. 真想用c#开发个 wp五笔输入法。。。奈何网上资料太少,源码都是c++写的。求大神指点!!!

    真想用c#开发个 wp五笔输入法...奈何网上资料太少,源码都是c++写的.求大神指点!!!!

  9. 【推荐】Java工程师如何从普通成为大神值得一读

    本文源自 http://www.hollischuang.com/archives/489 一点感悟 java作为一门编程语言,在各类编程语言中作为弄潮儿始终排在前三的位置,这充分肯定了java语言的 ...

随机推荐

  1. H3CNE认证(题库)

    H3CNE考试的题库,均为发烧友收集的,拥有将近认证考试的百分之八十五的题,但答案不具备官方性,但是题库具有解析. https://huxiaoyao.lanzous.com/b01tr2skd 密码 ...

  2. VM15 Ubuntu18.04下固定IP

    输入su 进入root用户 为下面修改文件内容提供权限 1.查看自己网卡名称:输入命令: ifconfig -a 或者 ip link 或者 ip addr 所以我的网卡名称是:ens33 2. 然后 ...

  3. JS代码下载百度文库纯文本文档

    下载百度文库纯文本文档流程 1.按 F12 或  Ctrl+Shift+I打开后台(或点击右键,在点击检查)[建议使用谷歌浏览器] 2.切换到控制台,赋值粘贴以下js代码,回车后,浏览器将自动下载保存 ...

  4. 第15.26节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QListWidget详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 列表部件(List Widget)对应类QListWidget,是从QListView派生 ...

  5. 第11.24节 Python 中re模块的其他函数

    一. re.compile函数 正则表达式编译函数,在后面章节专门介绍. 二. re.escape(pattern) re.escape是一个工具函数,用于对字符串pattern中所有可能被视为正则表 ...

  6. Metasploit魔鬼训练营第一章作业

    1, Samba服务 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在局域网上共 ...

  7. Jenkins环境搭建(8)-邮件未能正常发送

    昨天,在使用jenkins构建项目时,出现了个问题,问题是:jenkins控制台日志显示邮件发送成功,但实际没有成功. 此前,jenkins的配置,项目构建后,是能正常发送邮件的,可这次突然就不行了, ...

  8. 手把手教你写DI_0_DI是什么?

    DI是什么? Dependency Injection 常常简称为:DI. 它是实现控制反转(Inversion of Control – IoC)的一个模式. fowler 大大大神 "几 ...

  9. 苹果M1芯片各种不支持,但居然可以刷朋友圈!你会买单吗?

    上个月和大家一起分享过,最新的苹果M1芯片上支持的各种开源软件.什么?还没读过?赶紧点这里:一文解读苹果 M1 芯片电脑上的开源软件. 现在已经过去了半个月,想必有不少的同学都已经入手了最新的苹果M1 ...

  10. do{}while(false)的用法

    do{}while(false): 在工作中我们能经常发现有人写 do{}while(false)  这样的代码,初看时让人迷惑不解,按照上面的语法 do{}while(false) 这样 do{} ...