Git:Git重置

一、分支游标master的探秘 
图像
1.查看.git/refs/heads/master执行的commit为f22d9e; 
2.通过查看git log可以知道当前的master分支执行最新的commit为f22d9e; 
图像
3.新建文件new-commit.txt,并进行新的提交,使master分支指向刚创建的commit为c132b2c; 
图像
4.查新master分支执行的commit和最新的commit一致,说明master分支即时一个“游标”,在有新的commit的时,从就旧的commit执行最新的commit; 
图像
5.既然master被称为“游标”,那么在有新的提交的时候可以向上指向新的commit,我们也可以通过git reset命令向下指向旧的commit,通过git reset命令将master执行HEAD^; 
6.重置后master分支指向了上一个commit为f22d9e,add stash; 
7.查看工作区,new-commit.txt文件更改被取消; 
8.重置不仅仅可以重置到前一次,我们也可以直接使用提交ID重置到任何一次提交,我们重置到最早的一次提交,发现welcome.txt的修改都丢失了; 
图像
9.查看当前的版本库的log,发现所有的log信息只剩下了最早的一次提交; 
由上可知,master为一个“游标”,可以随着新的commit,向上移动向新的提交,也可以使用重置的命令向下回到原来的commit; 
二、用reflog挽救错误的重置 
图像
1.查看打开了分支的日志功能,它会在.git/logs/refs/heads/master中保存master分支的变更的log; 
2.查看.git/logs/refs/heads/master的日志文件内容,可以master分支指向的变迁,并且从上到下,是从旧到新; 
图像
3.通过git reflog命令查看master分支变迁的内容,但是顺序上到下,是从新到旧; 
图像
4.重置master为两次改变之前的值; 
5.重置后查看工作区,发现new-commit.txt文件又回来了; 
6.查看提交历史,发现提交历史也恢复了; 
图像
查看master分支的更改历史,发现有新的记录moving to master@{2}; 
三、深入了解Reset命令 
重置命令与版本的关系图: 
图像
git reset命令格式:git reset [--soft|--mixed|--hard] [<commit>] 
    参数--hard:会执行上图的全部动作1、2、3,1-替换引用的指向,引用指向新的提交ID;2-替换暂存区,替换后暂存区的内容和引用指向的目录树一致;3-替换工作区,替换后工作的内容变得和暂存区一致,也和HEAD所指向的目录树内容相同; 
    参数--soft:执行上图中的操作1; 
    参数--mixed或不使用参数(默认为--mixed):执行上图的操作1和操作2; 
图像
1.添加teset.txt文件,并添加到暂存区;修改工作区reset.txt文件,如上文件状态所示; 
图像
2.通过git reset (--mixed) HEAD^命令,将master分支引用指向新前一个commit,暂存区恢复到前一个commit状态,故工作区出现了new-commit.txt和reset.txt两个未加入缓存区的文件; 
图像

3.将版本恢复到初始状态,暂存区和工作区都有reset.txt修改; 

图像

4.通过git reset --soft HEAD^将master引用指向前一个commit,故暂存区出现了new-commit.txt和reset.txt修改,工作区保存reset.txt修改; 
图像
5.使用git reset --hard HEAD命令,将master引用,暂存区和工作区都恢复到当前HEAD执行的commit状态,则暂存区和工作区的修改都不见了; 

你可能感兴趣的:(git,reset,master,soft,reflog)