git回退之git reset

参考

https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E9%87%8D%E7%BD%AE%E6%8F%AD%E5%AF%86html

https://git-scm.com/book/en/v2/Git-Tools-Reset-Demystifiedgit

https://git-scm.com/docs/git-reset分布式

https://www.liaoxuefeng.com/wiki/896043488029600/897013573512192spa

前言

在使用git的时候,咱们通常提倡是不容许回滚。对于问题的追踪和项目的发展历程而言历史记录都是有用的。而且为了节省一点存储空间而丢失宝贵的代码信息是不值当的。可是咱们开发中,确定会遇到特殊状况须要回退。好比确实操做错了一步历史提交,致使仓库混乱污染或是内容丢失,咱们须要回退到干净的一次提交,从新操做。3d

在git等全部的版本管理软件中,删除操做,只是增长一次记录,内容并不会被删掉,咱们能够大胆的操做,这也符合版本仓库的逻辑。只有特殊状况才须要真正的删除,作这种操做的时候须要特别注意,由于一旦失误,没法挽回。htm

从历史记录中删除 参考 https://www.cnblogs.com/studywithallofyou/p/11772684.html https://www.cnblogs.com/studywithallofyou/p/11772844.htmlblog

工做流程

要想理解git reset,那么就要搞清楚git仓库管理流程:开发

咱们修改完内容后,这些记录单单是保存在咱们本地目录下,也就是工做目录。若是丢了,就是丢了,没法找回。与普通磁盘上的文件同样,除非到回收站找回。工作流

这时,若是运行了add,那么内容就被记录到本地的暂存仓库,也就是index。这时若是删除文件,在暂存区的内容还存在,并无丢失。it

以下图,咱们建立了一个文件4,这时文件4在本地。咱们add到暂存仓库,而后删掉文件4,咱们发现又多了一条记录删除记录,原来的4还存在,咱们能够commit。原来的文件4并无丢失。

运行commit以后,修改的内容就被保存到了仓库,修改了HEAD(HEAD就是指向当前仓库在哪个提交历史,不特殊修改,都指向最新的一次提交)。这时运行git status发现目录是干净的。git里面须要提交仓库,暂存仓库和本地目录内容都彻底一致,才是干净的,任何一个不一致都会有不一样的提示。

好比上面的图,提交的仓库中没有文件4,暂存仓库中增长了4,因此显示绿色的提示内容,add了文件可是尚未commit。可是本次又删除了文件,本地目录中的内容与暂存仓库也不同,因此提示红色的内容,由于算是警告,没有add的内容是会丢失的。

修改

add

commit

git reset的三个选择

理解了上面的流程,就能够理解git reset了。git reset就是分别逆向操做,也就是把HEAD(提交的仓库)回退到一个指定历史,把HEAD、index(暂存仓库)都回退到指定历史,把HEAD、index和本地目录的内容都回退到一个指定历史。

git reset --soft就是把HEAD回退到指定历史。运行后结果以下

也就至关于咱们add了修改的文件,本地目录和暂存仓库都已经一致了,就等待commit。若是咱们commit,能够再次填写commit记录,也就实现了git commit --amend的功能。

git reset --mixed就是把HEAD和index都回退到指定的历史。这个也是运行git reset不加参数时的默认规则。运行结果以下

至关于咱们仅仅修改了文件,还没作任何处理。

git reset --hard这个是把HEAD、index和本地目录的内容都回退到指定的历史记录。作这一步操做的时候必定要当心,最好把全部的内容都提交,而且push到远程或是拷贝一份。由于这个操做会重置本地的内容到一个指定历史。

咱们先运行git log,看到有三个提交历史

运行git reset --hard HEAD~

咱们发现仓库是干净的,而且原来的3文件没了,运行git log参看

提交的历史记录也没有了。

此次是真的回退到了指定历史,全部的记录都不见了,咱们能够开心的(真的吗?)在原来一个干净的分支上继续写代码了。

git reset --hard的后悔药

世上有没有后悔药我不知道,可是git做为一个先进的分布式管理器,却有无限可能。若是你一不当心,脑壳发热,运行了git reset --hard,可是发现不是你想要的,原来的记录也没了。怎么办?大脑瞬间充血,一片空白。不要慌,首先冷静下来,而后运行git reflog,这个命令是告诉你你的每一次对仓库操做的历史记录,以下

看一下最上面的几条,第一条告诉你当前在e86d948这个提交记录,经过reset切换过来的。对照上面的git log,能够发现这个是第二个提交历史,也就是咱们git reset --hard HEAD~的时候回退的分支。第二条记录告诉咱们当前是fc9fbc6分支,经过reset回退到这个分支的,咱们能够参考上面的git log记录,这个就是咱们想要回去的分支。好了,有了记录的哈希值,咱们只需再运行一次git reset --hard,以下

查看一下git log

回来了。

git不会删除任何已经提交到版本库的内容,除非你非要专门特殊这样作,而且为了再给你一次机会,像git reset这样,就算你明确说明不要了,它也不会立马删除,除非超过必定时间或是你主动运行git gc等操做,把无用的,没有关联的内容删掉。否则,那条记录仍是在本地仓库,只不过它没有被载入历史的长河中。

相关文章
相关标签/搜索