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

git reset

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

63.Git Reset 详解版本回滚的三种模式_第1张图片
git各个区域和命令关系

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

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

1. git reset --hard

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

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

回退到上一版本:

git reset --hard HEAD^

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

git reset --hard 1a2b3c

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

2. git reset --soft

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

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

63.Git Reset 详解版本回滚的三种模式_第2张图片
--soft所带来的新的差异

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

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

3.git reset 不带参数或带--mixed

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

总结

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

回退到上一版本:

git reset --hard HEAD^

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

git reset --hard 1a2b3c

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

特别提示

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

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

你可能感兴趣的:(63.Git Reset 详解版本回滚的三种模式)