git将软件开发中分为三个区域,分别是正在编辑的working工作目录、index暂存区(用于隔离working工作目录和本地仓库)以及本地仓库。本地仓库会将每一次的commit版本进行保存,head是指向当前操作分支的指针。
假设我们已经进行了如下操作:
version1
...
对版本1进行git add与git commit
version2
...
对版本2进行git add与git commit
当前working中内容和index内容与head内容均为verion2。
若我们想对当前版本进行回滚操作,可以使用git reset完成。git reset又有三种模式,分别为--soft,--mixed,--hard。他们分别可以抽象成几个不同的隔板将自上而下更新内容的水桶间隔开。
一、--soft模式
git reset --hard HEAD~1
将上层隔板插入,并对head水桶进行换水操作。
如此一来index与working区域中的代码都不会被改变。
二、--mixed模式
git reset --mixed HEAD~1
将下层隔板插入,并对head水桶进行换水操作,并向下影响index。
这样除了working区的代码没有被改变,index与head中的代码已经全部回滚。
三、--hard模式
git reset --hard HEAD~1
该模式下如其名字一般十分强力,将所有隔板拔出,直接从head向下将index与working区域全部换水。
一次性完成全部的版本回滚。
实质上,head的改变只是指针的移动。
并非内容的替换,故其实各个版本的内容依旧存放在本地仓库之中。