git reset soft、mixed和hard的区别和用途详讲

先看看工作区、暂存区和本地版本库的关系
你的项目就在工作区,对于项目新建的文件你必须先add保存到暂存区,再commit提交到本地库;
对于修改的文件可以先add再commit,或者直接commit。
git reset soft、mixed和hard的区别和用途详讲_第1张图片

回退和前进commit版本,只是移动HEAD指针的位置,只要进行过commit,将永久保存,不会被删除,回退版本后可以通过git log(最详细)、git log --pretty=oneline(简化)、git log --oneline(上一个的简写)、git reflog(简化,但信息更多)获取到全部的commit的版本信息,再通过git reset进行前进。
git reset soft、mixed和hard的区别和用途详讲_第2张图片

soft (软),仅仅移动版本库HEAD指针,其他什么事都不做,即索引文件(暂存区)、工作区不会重置
git reset soft、mixed和hard的区别和用途详讲_第3张图片

mixed(混合)reset默认的,不指定reset类型就是它,移动版本库HEAD指针,重置暂存区,但不重置工作区。就比如说你从当前版本回退到历史版本,你工作区更改的文件和代码都是不会变成历史版本的。
git reset soft、mixed和hard的区别和用途详讲_第4张图片

hard(硬),移动版本库HEAD指针,重置暂存区和工作区。彻底回退到某个版本,本地的代码也会变为某个版本的内容,此命令慎用! 如果真要使用,建议先commit提交一份到本地库里,后悔再git reset回去
git reset soft、mixed和hard的区别和用途详讲_第5张图片

soft和mixed的区别

这个是我在同个文件进行soft和mixed回退commit版本后,执行git status查看版本状态(查看工作区、暂存区状态)的对比截图,可能使你更容易理解。
(下面用commit2原来的版本,commit1表示回退后的版本)
git reset soft、mixed和hard的区别和用途详讲_第6张图片

soft:仅仅将HEAD指针指向了commit1,暂存区和工作区还用的是commit2的。git status提示:需要提交的更改。暂存区还是commit2的,所以对于commit1来说等于是已经add到暂存区,但没commit到本地库,所以提示叫你提交。

mixed:除了将HEAD指向了commit1,还重置了暂存区。就是说除了工作区是commit2的,其他的都是commit1的。git status提示:没有添加要提交的更改,可以add再commit,或者直接commit。在文章的开头我也说明过了,因为工作区用是commit2的,所以对于commit1来说就是它自己的工作区的文件被修改了,所以可以先将工作区的代码add到暂存区再commit到本地库,也可以直接将工作区的代码commit到本地库。

对于进行commit版本的切换的话使用soft和mixed都差不多,但利用他们的差异可以实现撤回add、撤回commit、把文件删除和撤回add、找回删除的文件等一些效果。

例如:git reset --mixed HEAD可以实现撤回没commit的add。
写成HEAD~数字、HEAD^是回退commit版本,写成版本索引是跳到某个commit版本,只写HEAD是恢复到当前指针位置。由于mixed重置了暂存区,这使得暂存区的内容变成commit的内容,后面新add的内容就没了,从而达到撤回add的目的。

但如果用的是git reset --soft HEAD是没有作用的,因为它并没有重置任何区域。

而如果用的是git reset --hrad HEAD,由于它重置了暂存区和工作区,这使得暂存区和工作区的内容变成commit的内容,相当于不仅撤回了add而且还把它删除了。同理,假如我误删了一个文件,我可以去到一个还有该文件的commit里找回,执行git reset --hard [指针位置],从而达到一种找回已删除文件的效果。 注意:hrad要慎用,如果工作区还有没commit的内容,还是先commit一份再使用吧。

git reset --mixed HEAD^,可达到类似于撤回commit效果。但要知道它本质只是回退到上版本并重置了暂存区,并没有真正撤回commit,已经commit的记录是不可磨灭的。

你可能感兴趣的:(git,soft,mixed,hard,git,reset)