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 详解版本回滚的三种模式的主要内容,如果未能解决你的问题,请参考以下文章