1、撤销操作
一来就是一张大图,如果不太了解git的人会有点蒙,下面简单解释一下(都是我个人的理解,如果不妥还请指正),git仓库的初始化以及clone这些在这里就不讲了,请自行百度。
远程仓库:就是在github或者在gitlab上的代码。可以用git pull
和git push
来进行本地仓库和远程仓库的同步操作。
版本库:每一次的commit
都会生成一个记录,每个记录都有一个hash值来唯一标识,很多很多的commit就形成了版本库。为什么图上有两个版本库?那是因为上面那个版本库是commit
前,下面那个版本库是commit
后。
工作区:当我们把远程仓库的代码clone
下来后,一般会默认在分支master
上,此时,该分支的所有代码都在本地,这就是当前的工作区,以后的每一次commit
都会在这个分支上记录。
暂存区:这个应该大家最容易理解错的,也是用习惯了svn
的朋友最不理解的地方。每次修改了代码后,都需要用git add
来讲工作区的修改记录到暂存区,然后我们再用git commit
来讲暂存区的内容提交到版本库,当然这里也可以用git commit -a
命令一步到位
上面这张图就简单描述了我们每次的修改,用什么命令流转到什么区的一个示意图。
2、版本回退
前提条件:已经执行git commit
命令了,但是没有push
到远程仓库,用以下命令可以回退
git reset --hard HEAD^
上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
。其实这个回退就是将本地的HEAD指针移动到某个版本上而已,所以这个操作是非常快的。
git log [查看commit记录]
//这个3628164 是一个commit版本号,可以指定回退到那个版本
git reset --hard 3628164
查看提交记录,也能看到每一次提交的版本号,这是一个很长的哈希值,这个时候我们通过这个版本号可以指定回退到某个版本上,用这个版本号的时候可以只用它前面几位,具体几位看你心情咯,只要能唯一标识这个版本就ok。
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
来恢复回去。
这个结果分三部分,前面黄色的文字就是执行那次命令时所在的版本号,中间的HEAD@[0]是就是HEAD指针变更记录,最后面就是那次命令所做的事情。
最后再啰嗦一点,如果这些commit都还没有同步到远程仓库,你reset后那些commit记录是不会被同步上去的。但是,如果已经同步上去了,就算你本地reset了,虽然本地工作区内容变成了你想要的了,但是记录就抹不去了。