git reset详解

在开发过程中有时候可能在执行完git commit之后发现代码有问题,需要撤除提交,这时候我们可以使用以下git reset命令来实现

比较常见的git reset命令包括

  • mixed 重置HEAD和index,默认参数,保留工作区
  • soft 重置 HEAD,保留index区和工作区,让仓库恢复到执行git commit之前的状态
  • hard 重置HEAD,index和工作区

一、git提交流程复习

在这里插入图片描述

1、默认情况下工作区,暂存区和本地仓库区是一样的

在这里插入图片描述
2、当工作区文件发生变化后,工作区和其他两个区会产生差别

在这里插入图片描述
2、当我们使用git add命令把文件添加到暂存区后,工作区和暂存区保持一样的状态,只有和本地仓库区不同

在这里插入图片描述
3、最后当我们执行完git commit命令后,三个区域又都变为一样的,这个时候HEAD指针会指向最近的一次commit

在这里插入图片描述

二、HEAD指针和commit的关系

我们在前面的 git提交流程文章中有介绍到git中分支和HEAD的指向关系,如下图所示
在这里插入图片描述
在实际工作中我们可能会存在多笔commit,但是HEAD在默认情况下都会指向最新的一次commit。所有大致的commit和HEAD的指向关系如图

在这里插入图片描述

三、git reset

在复习了git提交流程与HEAD指针与commit关系之后,我们就可以先使用git reset命令来重置文件状态了。

1、git reset --mixed

–mixed是默认参数,该命令是重置HEAD和index区

2、重置index区

例如我们修改了工作区的一个文件并通过git add命令添加到index 区,但是又想要恢复刚刚的git add操作,首先我们使用git status查看状态,如图

在这里插入图片描述
我们执行git reset或者git reset --mixed命令之后得到的结果如
在这里插入图片描述
在这里插入图片描述
这种情况下会重置index区的变更,保留工作区内容

3、重置本地仓库repository区

如果我们已经执行完git commit命令,但是想要进行恢复重置的话也可以使用git reset命令,但是会稍微有一些区别

  • git commit 后用git log查看提交记录
    在这里插入图片描述
    这个时候我们可以使用以下命令来恢复
git reset HEAD^

在这里插入图片描述
这个时候就会重置index区域和repository区,但是会保留工作区内容

4、git reset --soft

该命令的主要功能是重置HEAD,保留index和工作区。
例如我们已经执行完git commit操作,使用git log查看提交记录为
在这里插入图片描述
这时我们发现需要commit内容存在错误,需要恢复。我们可以执行

git reset --soft HEAD^

在这里插入图片描述
可以看到,在执行了reset soft命令后repository区域的已经被重置,而index区域的依然被保留

5、git reset --hard

该命令会重置掉工作区,index区和repository区,所以在使用的使用一定要小心。在执行完git commit后我们查看一下提交log

在这里插入图片描述
这时我们使用git reset --hard命令

git reset --hard HEAD^

执行完毕后我们发现之前修改的内容已经被重置了

在这里插入图片描述
在这个例子中,执行完reset --hard命令后我们发现会在日志中输出以下内容

HEAD is now at 9f91224 git test

参考我们在本文开头中画出来的git HEADcommit的指向关系图我们可以看到,这个命令在执行前和执行后的指向关系图分别为:

执行前

在这里插入图片描述
执行后

在这里插入图片描述

四、重置版本

使用reset命令,可通过移动HEAD指针达到回退版本的目的,重要信息:reset不是回退到HEAD指针,而是重置HEAD指针,即移动HEAD指针,

reset soft

git reset --soft < commit-id>

将指针指向 暂存区的内容变为两个版本之间的差异(改动),工作区内容不变,仍然为旧HEAD的内容

reset

命令:git reset < commit-id>

将指针指向 暂存区的内容变为,工作区内容不变,仍然为旧HEAD的内容

reset hard

命令:git reset --hard <commit-id> 将指针指向<commit-id> ,暂存区和工作内容都变为<commit-id>版本内容

特点:都改变HEAD指针到,程度(reset-soft, reset, reset-hard)逐步扩大,只有reset-hard重置时,才会实际修改当前代码,其余两种会有一点细微区别

支持^和~

git reset --hard HEAD^
git reset --hard HEAD^^
git reset --hard HEAD~10

关于-hard

-hard 会覆盖暂存区和工作区的内容,但是还有一些恢复的方法的,即使使用了–hard,一些提交不见了,但他们仍然存在git的仓库当中,还记得提交号的话,就可以再次将HEAD指回,(依然使用reset命令)原来的提交,由于有暂存区和工作区是不受控的,即使恢复了版本工作区的内容和暂存区(改动)将无法找回。

Git中,git reset命令用于将当前分支的HEAD指针移动到指定的提交,并且可以选择是否将更改的文件还原到暂存区或工作区。根据不同的情况,可以使用不同的git reset命令来实现不同的操作。 如果在使用git add提交之前,想要撤销对文件的修改,可以使用以下命令: - git checkout .:将暂存区的文件覆盖工作区的文件,相当于撤销对文件的修改。\[2\] 如果已经使用git add将文件提交到暂存区,但还未进行commit操作,想要撤销暂存区的修改,可以使用以下命令: - git reset:将HEAD指针覆盖当前的暂存区内容,相当于将暂存区的修改撤销。\[1\] 需要注意的是,执行reset命令后,之前的commit仍然存在,只是不可见。如果想要恢复被reset掉的commit,可以使用以下命令: - git reflog:查看操作记录的id。 - git reset <commit_id>:使用reset命令回到指定的commit_id,从而恢复被reset掉的commit。\[3\] 总结起来,git reset命令可以用于撤销对文件的修改或撤销暂存区的修改,而使用git reflog和git reset命令可以恢复被reset掉的commit。 #### 引用[.reference_title] - *1* *2* [【git撤销操作】git reset详解](https://blog.csdn.net/qq_38987146/article/details/125149888)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Git 笔记 - git reset](https://blog.csdn.net/Yuki_yuhan/article/details/122931045)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值