上回学习了创建本地仓库以及简单的添加文件额提交等等,今天来看一下和版本管理有关的其他功能。常用的管理功能包括查看历史提交的具体信息,回退或者前进到某个具体版本等等,我们逐个来看。首先我们来模拟出三个提交历史,还是对上次创建的文件进行操作,三个版本的修改内容如下,记得每次修改后都进行add并commit:
this boy is huper
and he's so stupid!
added version 1.
this boy is huper
and he's so stupid!
added version 1.
added version 2.
this boy is huper
and he's so stupid!
added version 1.
added version 2.
added version 3.
好了,现在算上上一节里第一次的commit,我们实际上一共进行了四次commit,那么我们如何查看着四次commit的详细内容呢?如下:
$ git log
commit f90f4420ab95c6339a318b7ca8f5d44d0ad30aa8 (HEAD -> master)
Author: ProHuper <871027967@qq.com>
Date: Mon Dec 11 13:42:35 2017 +0800
added 3
commit 5cd0d8b28493ff91da4d3b112bba94498a11aee9
Author: ProHuper <871027967@qq.com>
Date: Mon Dec 11 13:42:06 2017 +0800
added 2
commit 143d24571b3be5506fb2d9a787b3b961e35015e1
Author: ProHuper <871027967@qq.com>
Date: Mon Dec 11 13:41:34 2017 +0800
added 1
commit 9dc246f56431ff4790a94fb2160529979b154230
Author: ProHuper <871027967@qq.com>
Date: Sun Dec 10 21:12:34 2017 +0800
update
可以看到,四次提交的信息都打印了出来,其中标有HEAD的是当前版本,你可以将它看成一个指针。可能还会注意到一串很长的提交码。需要友情提示的是,准确地说它叫commit id
(版本号),和SVN不一样,Git的commit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id
和我的肯定不一样,以你自己的为准。为什么commit id
需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了(引用廖老师的解释)。Git的分布式特性应该算是和SVN的一个最重要的区别了,至于其他区别大家可以去网上找找,讲得很详细的。另外log命令是有很多选项的,比如控制显示格式等等,这个大家可以自己去看看git的文档。
默认每次提交以后都会停留在当前最近的版本,那么我们如何回退到某个版本呢?就先之前看到的HEAD
对应当前版本,git规定用HEAD^
表示前一个版本,HEAD^^
表示往前两个版本,以此类推。并且为了防止标注过多,可以用类似HEAD~20
的方式表示回到前面第20个版本。回退版本的具体命令如下:
$ git reset --hard HEAD^
HEAD is now at 5cd0d8b added 2
$ cat huper.txt
this boy is huper
and he's so stupid!
added version 1.
added version 2.
执行回退命令后并用cat查看,发现成功会退到前一个版本。比较有意思的是这个时候如果再查看修改日志,会发现之前最近的一次提交“不见了”。
$ git log
commit 5cd0d8b28493ff91da4d3b112bba94498a11aee9 (HEAD -> master)
Author: ProHuper <871027967@qq.com>
Date: Mon Dec 11 13:42:06 2017 +0800
added 2
commit 143d24571b3be5506fb2d9a787b3b961e35015e1
Author: ProHuper <871027967@qq.com>
Date: Mon Dec 11 13:41:34 2017 +0800
added 1
commit 9dc246f56431ff4790a94fb2160529979b154230
Author: ProHuper <871027967@qq.com>
Date: Sun Dec 10 21:12:34 2017 +0800
update
那么我们如何回到这个版本呢?这个时候就要用到这个被“隐藏版本的”commit id
了,在之前的log信息里找到这个版本的版本号执行如下命令就可以了:
$ git reset --hard f90f4420ab
HEAD is now at f90f442 added 3
注意commit id
不一定要完整,选取前面几位可以唯一标识的就行了。有人可能会问如果我清空了上次的命令显示怎么办。git的确提供了一个命令git reflog
,它会显示你的命令记录。在这里面可以看到之前的版本HEAD对应的版本号在哪里。
$ git reflog
f90f442 (HEAD -> master) HEAD@{0}: reset: moving to f90f4420ab
5cd0d8b HEAD@{1}: reset: moving to HEAD^
f90f442 (HEAD -> master) HEAD@{2}: commit: added 3
5cd0d8b HEAD@{3}: commit: added 2
143d245 HEAD@{4}: commit: added 1
9dc246f HEAD@{5}: commit (initial): updat
但是我个人感觉这个版本前进方法并不方便,git应该有提供其他方法吧,但是我懒得查了。。。
总结:
git log 查看历史提交信息
git reset 改变当前版本指针
git reflog 查看历史命令记录