一来就是一张大图,若是不太了解git的人会有点蒙,下面简单解释一下(都是我我的的理解,若是不妥还请指正),git仓库的初始化以及clone这些在这里就不讲了,请自行百度。git
远程仓库:就是在github或者在gitlab上的代码。能够用git pull
和git 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
这个结果分三部分,前面黄色的文字就是执行那次命令时所在的版本号,中间的HEAD@[0]是就是HEAD指针变动记录,最后面就是那次命令所作的事情。
最后再啰嗦一点,若是这些commit都尚未同步到远程仓库,你reset后那些commit记录是不会被同步上去的。可是,若是已经同步上去了,就算你本地reset了,虽然本地工做区内容变成了你想要的了,可是记录就抹不去了。