63.Git Reset 详解版本回滚的三种模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了63.Git Reset 详解版本回滚的三种模式相关的知识,希望对你有一定的参考价值。

参考技术A

意思就是可以让HEAD这个指针指向其他版本。说白了就是通过此命令在版本之间进行穿梭。
它有三种模式,soft,mixed,hard,具体的使用方法下面这张图,展示的很全面了。

这三个模式理解了,对于使用这个命令很有帮助。在理解这三个模式之前,需要略微知道一点Git的基本流程。正如上图,Git会有三个区域:

Working Tree 当前的工作区域
Index/Stage 暂存区域,和git stash命令暂存的地方不一样。使用git add xx,就可以将xx添加近Stage里面
Repository 提交的历史,即使用git commit提交后的结果

首先, Git 必须知道当前版本是哪个版本,在 Git 中,用 HEAD 表示当前版本,上一个版本就是 HEAD^ ,上上一个版本就是 HEAD^^ ,以此类推,当然往上100个版本写100个 ^ 比较容易数不过来,所以写成 HEAD~100 。

--hard 会在重置 HEAD 和branch的同时,重置缓存区和工作目录里的内容。当你在 reset 后面加了 --hard 参数时,你的缓存区和工作目录里的内容会被完全重置为和HEAD的新位置相同的内容。换句话说,就是你的没有commit的修改会被全部擦掉。

回退到上一版本:

回退到指定版本号(以1a2b3c为例)的版本:

reset --hard:重置stage区和工作目录:

--soft 则会保留工作目录的内容,并把因为重置 HEAD 所带来的新的文件差异放进暂存区。

什么是「重置 HEAD 所带来的新的差异」?就是这里:

由于 HEAD 从 4 移动到了 3,而且在 reset 的过程中工作目录和暂存区的内容没有被清理掉,所以 4 中的改动在 reset 后就也成了工作目录新增的「工作目录和 HEAD 的差异」。这就是上面一段中所说的「重置 HEAD 所带来的差异」。

这就是--soft 和 --hard 的区别:--hard 会清空工作目录和暂存区的改动,*而 --soft则会保留工作目录的内容,并把因为保留工作目录内容所带来的新的文件差异放进暂存区。

git reset 如果不加参数,那么默认使用 --mixed 参数。此时表示要:保留工作目录,并清空暂存区。也就是说,工作目录的修改、暂存区的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录。简而言之,就是「把所有差异都混合(mixed)放在工作目录中」。

首先, Git 必须知道当前版本是哪个版本,在 Git 中,用 HEAD 表示当前版本,上一个版本就是 HEAD^ ,上上一个版本就是 HEAD^^ ,以此类推,当然往上100个版本写100个 ^ 比较容易数不过来,所以写成 HEAD~100 。

回退到上一版本:

回退到指定版本号(以1a2b3c为例)的版本:

--hard 会清空工作目录和暂存区的改动,
--soft则会保留工作目录的内容,并把因为保留工作目录内容所带来的新的文件差异放进暂存区。
--mixed 参数。git reset 如果不加参数,那么默认使用 --mixed 参数。此时表示要:保留工作目录,并清空暂存区。

HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令
git reset --hard commit_id

穿梭前,用 git log 可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用 git reflog 查看命令历史,以便确定要回到未来的哪个版本。

Git reset的三种模式 傻傻分不清楚

文章目录

【1】关于Git reset有三种模式

  • soft将版本回滚,工作区不动,暂存区=原来的+回滚后和回滚前的版本差异
  • mixed将版本回滚,回滚到了所有 git add 和 git commit 的命令执行之前。暂存区变为空,全部到了工作区
  • hard将版本回滚,将所有工作区和暂存区的文件修改全部清空,是真正的覆盖,不能找回了。

我在使用的时候总是搞不清他们之间到底怎么使用,下面我来说一下


【2】实例手把手讲解

2.1 首先我们新建一个项目

2.2 然后创建Git进行管理

2.3 两次提交方便等会回滚

先初始化提交

可以看到我们提交的信息了


新建分支

添加新文件,然后加入工作区

commit 1

再操作一次。commit 2

然后我们新建一个Test3,但是只存在工作区,不将他加到暂存区中。

看到Test3是变红的就对了,表示没有被git追踪,没有加到缓存区中。

2.4 soft模式讲解:

目前的状态:maser在init上,HEAD指针在dev开发分支上;工作区中有一个Test3没有加到缓存中


打开终端git reset --soft HEAD~ 回退上个版本


发现版本真的回退了,检查工作区和缓存区。

验证了这句话:将版本回滚,工作区不动,暂存区=原来的+回滚后和回滚前的版本差异
暂存区原来的为空+回滚差异那不就是Test2文件吗?ok,soft模式我们验证完了,再来看mixed。


2.5 mixed模式讲解:

我们将文件恢复,reflog,然后reset回去,这里就不演示了。
git reset HEAD~


版本回退了,然后我们看工作区和暂存区。

我们发现暂存区被清空了,没有文件,回滚差别文件放在工作区了,工作区=原来的+回滚差别;
将版本回滚,回滚到了所有 git add 和 git commit 的命令执行之前。暂存区变为空,全部到了工作区


2.6 hard模式讲解:

同样先恢复文件,并且添加一些代码到暂存区

git reset --hard HEAD~


已经回滚,这个不用说,reset本来就用来回滚。

暂存区没了,

Test2也没了

以上是关于63.Git Reset 详解版本回滚的三种模式的主要内容,如果未能解决你的问题,请参考以下文章

Git reset的三种模式 傻傻分不清楚

Git reset的三种模式 傻傻分不清楚

Git reset的三种模式 傻傻分不清楚

SrouceTree——Git的回滚的三个选项的详细说明

git reset 的三种模式

git reset 版本回退的三种用法总结