前言

git有一个非常关键的功能就是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的用法总结

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

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

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

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

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

最后的最后

送各位小伙伴一个好玩的学习教程吧,你可以根据自己需要选择订阅。
玩转Git分布式版本控制系统实战

趣话题:git三部曲(二)-拆分历史提交记录reset相关推荐

  1. 怎么使用Git远程删除某个历史提交记录

    这篇文章主要介绍"怎么使用Git远程删除某个历史提交记录"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"怎么使用Git远程删除某个 ...

  2. SVN迁移至GIT,并附带历史提交记录

    文章目录 SVN代码同步至GIT 背景 准备工作 操作步骤 SVN代码同步至GIT 背景 近年随着信息工程的多元化发展,GIT逐渐取代SVN成为主流的版本管理工具,部门的项目代码也决定迁移至git进行 ...

  3. GitHub/GitLab/Gitee中项目互拷贝后仍保留历史提交记录的方法

    GitHub.GitLab.Gitee等在同一个网站中执行复制或拷贝一个已有项目到一个新项目比较简单,因为它们在每一个项目上都有一个Fork按钮,直接点击此Fork按钮即可,Fork后的新项目会保留原 ...

  4. git删除相关历史提交记录,相关文件保持当前状态

          git删除相关历史提交记录,相关文件保持当前状态 引言   新年新气象,趁着现在新的一年开始项目的事情还不是非常繁忙的时候,多整点下酒菜.这不实战类型的博客记录又开始了!当然实战类型的博客 ...

  5. git删除所有历史提交记录,只留下最新的干净代码

    git删除所有历史提交记录,只留下最新的干净代码 1.Checkoutgit checkout --orphan latest_branch2. Add all the filesgit add -A ...

  6. 彻底删除git中的较大文件(包括历史提交记录)

    场景 适用于从一个git项目中,将体积较大的资源彻底从git中删除,包括历史提交记录. 如果仅仅在目录中删除一个文件是不够的,只要在提交记录中有这个文件,那么 .git 中就会有这个文件的信息. 用 ...

  7. 对不同的项目设置不同的git提交用户名和清除贡献者信息和历史提交记录

    对不同的项目设置不同的git提交用户名 在项目目录下的(存在.git文件夹,如果不存在.git文件夹说明没有初始化git仓库,此目录下打开cmd输入git init一下就好了,但是要注意这时此目录应该 ...

  8. github 删除历史提交记录的可行方案

    github 删除历史提交记录的可行方案 删除历史版本 亲自研究发现的可行方案 一.创建新分支,复制所有内容并提交 获取最新 : git pull origin master切换分支:git chec ...

  9. Android2.2查看svn历史提交记录

    一开始时是没有显示历史提交记录的,方法很简单 VCS--Subversion--ShowHistory,之后在下面的Version control就会显示"History-项目名" ...

最新文章

  1. 微软终于想通把Script56文档更新了
  2. hdoj1175 连连看(dfs+剪枝)
  3. SpringMVC一例 是否需要重定向
  4. Jsoup(二)-- Jsoup查找DOM元素
  5. FutureTask 示例
  6. uboot启动第一阶段——start.S
  7. poj2387TillCowsComHome Dijlstra
  8. jupyter notebook如何打开其他文件夹下的iqynb文件
  9. 多系统并行服务器,具有分布式并行I/O接口的分布式并行服务器系统的性能研究...
  10. Struts2之类型转换器
  11. 解决MacOS 下载的文件名字乱码问题
  12. was控制台的用户和密码怎样加密使用_交换机密码忘记了,怎么办,密码恢复一分钟了解下...
  13. 力扣算法题—069x的平方根
  14. 奇怪的规律:飞机事故总是凑在一段时间内
  15. (转)UCS vs UTF-8 as Internal String Encoding
  16. VirtualBox备份Vagrant虚拟机镜像
  17. Hadoop基础【HDFS的shell,客户端操作、上传下载流程】
  18. linux 输入法成繁体字_寻找Ubuntu中繁体字输入法
  19. MVX Android设计架构浅析-MVC
  20. 餐饮店如何做活动吸引人

热门文章

  1. 【渝粤教育】国家开放大学2018年春季 0275-22T内科护理学 参考试题
  2. html纵向滚动特效,带视觉差效果的垂直全屏整页滚动特效
  3. java快速排序算法_JAVA版排序算法之快速排序示例
  4. 【MFC系列-第15天】关联变量的概念与用法
  5. Ollydbg使用教程学习总结(一)
  6. mpu 配置内存空间_PCIE的内存地址空间、I/O地址空间和配置地址空间
  7. 对linux的mv命令设计测试用例,测试用例中的细节 - 八音弦的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. php读取csv指定行_PHP快速读取CSV大文件指定行
  9. [http]HTTP状态码含义
  10. WPF快速入门系列(2)——深入解析依赖属性