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> [--] [<path>]

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

--soft 选项 —— 仅重置 HEAD 引用

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

在这里插入图片描述

--mixed 选项 —— 重置暂存区和 HEAD 引用

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

--hard 选项 —— 重置工作区、暂存区和 HEAD 引用

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

-- <path> 限定文件 —— 仅重置暂存区

  可以使用路径限定要重置的文件,包含路径的用法仅会重置暂存区,不会更改 HEAD 引用,--表明随后的参数是路径,这在文件名与选项有歧义时十分有用。

<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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值