Git中reset的–soft、–mixed、–hard的区别?
前言
今天来记录一下git中进行版本回溯中要使用到的git reset命令,看了很多资料,都没有把这个命令讲解得很清楚;那么我们就来讨论下
- git reset命令到底做了什么?
- 有什么区别?
- 我们应该怎样使用?
先来交代一下我们的实战环境,先用git初始化好一个库,再用git依次添加1.p、2.p、3.p 3个文件到git仓库中,并依次产生3个commit消息分别为edtion1,editon2,edition3
我们先用git log查看此时edition3的唯一字符串,如d56x8f7a,将其先存起来,我们后面实战有用。
命令 “git reset --soft [版本号]”
当前我们的本地库HEAD指向最新的edition3,我们将回退两个版本回退到edition1
$ git reset --soft master^^
$ git reset --soft master~2
$ git reset --soft HEAD^^
$ git reset --soft HEAD~2
$ git reset --soft edition3^^ #这里用edition3代替git log中的唯一字符串
$ git reset --soft edition3~2
# 以上都是等价命令,使用其中一个,回退到edition版本3的前两个版本,也就是回到edition1,文件只有1.p的时候
git此时所做的操作,让我们的本地库LocalRepository就将head指针指向了edition1这个版本,暂存区和工作目录保持不变,两个都还是原来的1.p、2.p、3.p 3个文件。
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: 2.p
new file: 3.p
此时,使用git status
命令查看,暂存区里,相对于LocalRepository指向的edition1里的只有1.p文件, 2.p、3.p都可以被称为是新文件
命令 “git reset --mixed [版本号]”
为了接下来演示方便,我们先执行
git reset --hard "之前让保存的edition3唯一字符串"
这条命令先不管,它所起的作用就是让我们回到edition3的状态
此时,我们准备工作做好了,已经回到edition3状态,也就是图左边所示。
开始演示:我们执行
git reset --mixed master^^ #用mixed回退到edition1的状态
此时,这条命令所起的作用就是,将Local Repository本地库的指针指向了edition1,并用本地库edition1里的1.p覆盖掉暂存区index,注意,这里是先删除并清空原有的暂存区里的内容,再用edition1里的内容覆盖。
此时我们使用git status
命令,
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
2.p
3.p
nothing added to commit but untracked files present (use "git add" to track)
那么我们此时用git status
命令查看,工作目录里的1.p、2.p、3.p文件相对于暂存区index的1.p文件,工作目录的2.p、3.p都变成了未追踪文件
命令 “git reset --hard [版本号]”
还是使用以下命令先还原我们的操作环境
git reset --hard "之前让保存的edition3唯一字符串"
此时,我们准备工作做好了,已经回到edition3状态,也就是图左边所示。
开始演示:我们执行
git reset --hard master^^ #用hard回退到edition1的状态
此时我们的命令是如此的工作:先将Local Repository本地库的head指针指向edition1,再依次删除并清空暂存区Index和工作目录Working Directory的所有文件,并依次使用edition1里的文件1.p来覆盖暂存区与Working Directory工作目录。
此时使用git status,可以预知,肯定显示的没有什么可提交的;
$ git status
On branch master
nothing to commit, working tree clean