git reset 重置命令——版本控制的后悔药

命令简介

  分支在版本库的引用目录(.git/refs)中体现为一个引用文件.git/refs/heads/branchName,其内容就是分支中最新提交的提交ID。
  git reset 命令通常用于将分支引用文件的内容重置为指定的<commit>,并使用指定<commit>下的文件替换掉暂存区中文件,而工作区不会受到影响。

  当我们想要丢弃错误/意外的提交,又或者想要恢复到某个历史版本的提交时,就可以使用git reset命令。

<commit> 和 HEAD

  <commit>可以是提交ID(SHA1值),也可以是引用,引用相当于提交ID的别名。例如,下图中的分支名main就是一个引用(通常分支名又被称为游标 ),其指向当前分支的最新提交(01b5ef8)。在不引起歧义的情况下可以不必输入完整的提交ID,只需要输入前几位数字即可。

  HEAD被称为头指针,也是一个引用,更准确地说,HEAD是引用的引用,HEAD一般指向当前分支。如下图所示,HEAD指向main分支(工作区当前分支),而main指向(01b5ef8)提交,所以HEAD就间接地指向了(01b5ef8)提交。

git reset <commit>

在这里插入图片描述

git reset <commit>命令执行上图中的全部操作1、2,即:

  1、使用指定<commit>替换引用的指向,引用指向新的提交ID.。

  2、使用指定<commit>下的文件替换掉暂存区中文件,重置暂存区。

  在上图的例子中,执行如下命令可将引用重置为(89c49db)提交。

$ git reset 89c49db

  执行结果如下图所示,main游标的值被重置为(89c49db),暂存区中的文件被(89c49db)提交中的文件替换。而工作区中的文件则没有受到影响,因此我们最新的改动不会丢失。
在这里插入图片描述

进阶:git reset [--soft | --mixed | --hard] <commit>

  git reset 命令可以根据不同的选项,对暂存区或工作区进行重置。
在这里插入图片描述

--soft 参数

  使用--soft参数,如 git reset --soft <commit> 只会执行操作1,即:只更改引用的指向,不改变暂存区和工作区。

在这里插入图片描述

--mixed 参数

  使用--mixed 参数或不使用参数(默认为--mixed ),如 git reset <commit> 会执行操作1、2,即:更改引用的指向及重置暂存区,但是不改变工作区。
在这里插入图片描述

--hard 参数

  使用--hard 参数,如 git reset --hard <commit> 会执行全部操作1、2、3,即:更改引用的指向及重置暂存区和工作区。使用此参数将会同时丢失暂存区和工作区的更改。
在这里插入图片描述

<commit>对象访问方式

  <commit>可以省略(默认为HEAD),根据选项参数重置暂存区或工作区,而引用不会改变,因为引用重置到HEAD相当于没有重置。

  SHA1哈希值 代表指定的提交;

  HEAD 代表当前分支最近一次提交;

  HEAD^^^……(n个^) 代表HEAD的第n个父提交;

  HEAD~nHEAD^^^……(n个^)

  HEAD^n 代表HEAD多个父提交中的第n个父提交;

  main 代表main分支最近一次提交;

  refs/heads/mainmain,是main的全称;

总结

  git reset 用于重置分支为指定的提交;

  git reset 的修改对象是分支游标,如上图的main;

  <commit> 默认为HEAD;

  根据不同选项参数可重置暂存区或工作区;

  选项参数默认为--mixed。

猜你喜欢

转载自blog.csdn.net/weixin_44567318/article/details/109830957