Git后悔药之代码回退

一、撤销操做

git.png

一来就是一张大图,若是不太了解git的人会有点蒙,下面简单解释一下(都是我我的的理解,若是不妥还请指正),git仓库的初始化以及clone这些在这里就不讲了,请自行百度。git

远程仓库:就是在github或者在gitlab上的代码。能够用git pullgit push来进行本地仓库和远程仓库的同步操做。github

版本库:每一次的commit都会生成一个记录,每一个记录都有一个hash值来惟一标识,不少不少的commit就造成了版本库。为何图上有两个版本库?那是由于上面那个版本库是commit前,下面那个版本库是commit后。svn

工做区:当咱们把远程仓库的代码clone下来后,通常会默认在分支master上,此时,该分支的全部代码都在本地,这就是当前的工做区,之后的每一次commit都会在这个分支上记录。gitlab

暂存区:这个应该你们最容易理解错的,也是用习惯了svn的朋友最不理解的地方。每次修改了代码后,都须要用git add来说工做区的修改记录到暂存区,而后咱们再用git commit来说暂存区的内容提交到版本库,固然这里也能够用git commit -a命令一步到位指针

上面这张图就简单描述了咱们每次的修改,用什么命令流转到什么区的一个示意图。code

二、版本回退

前提条件:已经执行git commit命令了,可是没有push到远程仓库,用如下命令能够回退get

git reset --hard HEAD^

上一个版本就是HEAD^,上上一个版本就是HEAD^^,固然往上100个版本写100个^比较容易数不过来,因此写成HEAD~100其实这个回退就是将本地的HEAD指针移动到某个版本上而已,因此这个操做是很是快的。同步

git log    [查看commit记录]
//这个3628164 是一个commit版本号,能够指定回退到那个版本
git reset --hard 3628164

查看提交记录,也能看到每一次提交的版本号,这是一个很长的哈希值,这个时候咱们经过这个版本号能够指定回退到某个版本上,用这个版本号的时候能够只用它前面几位,具体几位看你心情咯,只要能惟一标识这个版本就ok。hash

git reflog [查看本地会影响HEAD指针的命令操做记录,这个不会同步到远程仓库]

强调一下,注意这里是记录的会影响HEAD指针的操做记录。 简单举例说一下这个git reflog的使用场景。git reflog 假如当前我有三次提交,再假设三次提交的版本号分别为commitnum1,commitnum2,commitnum3,而且我当前处于commitnum3这个版本上(也就是HEAD指向了commitnum3),这个时候我用命令git reset --hard commitnum2就回退到了comminum2了,好,问题来了,若是忽然又想回到commitnum3怎么办呢,固然你能够翻看上去看记录,那个版本号还能看到,可是若是这是次日了,已经翻不上去了就麻烦了,这个时候git reflog就出场啦,他能够看到你昨天执行git reset --hard commitnum2命令的时候的所在版本号,这个时候就能够用git reset --hard commitnum3来恢复回去。it

git_reflog.png 这个结果分三部分,前面黄色的文字就是执行那次命令时所在的版本号,中间的HEAD@[0]是就是HEAD指针变动记录,最后面就是那次命令所作的事情。

最后再啰嗦一点,若是这些commit都尚未同步到远程仓库,你reset后那些commit记录是不会被同步上去的。可是,若是已经同步上去了,就算你本地reset了,虽然本地工做区内容变成了你想要的了,可是记录就抹不去了。

参考: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013744142037508cf42e51debf49668810645e02887691000

相关文章
相关标签/搜索