现在我们已经学会了修改文件,并将修改提交到Git版本库,我们再来练习一下,修改readme.txt文件如下:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
The third day to learn git.
然后我们提交:
$ git add readme.txt
$ git commit -m "add third day"
[master 28b09de]
1 file changed, 1 insertion(+)
你可以不断对文件进行修改,然后不断地将其提交到版本库里,可以这样理解,当你在下班之前将文件改好之后,可以给文件做个“快照“,这个动作在Git中就是
commit
,万一你一不小心将文件删除之后,可以从最近的commit
恢复,而不是把之前的工作结果都丢了然后从头再来。
Git is a distributed version control system.
Git is free software.
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git is a distributed version control system.
Git is free software distributed under the GPL.
The third day to learn git.
但是当文件改动的次数特别多的时候,脑子里肯定记不住每次修改了什么内容,在Git中我们使用git log
命令来查看:
$ git log
commit 28b09defdd584824e04f87aa3d8b1bcda083d2ed
Author: ZhuLiang <1029931487@qq.com>
Date: Sun Jan 21 15:13:01 2018 +0800
add third day
commit e72b324701a01d127edc10c9a4bcf2e811dab05c
Author: ZhuLiang <1029931487@qq.com>
Date: Fri Jan 19 20:51:19 2018 +0800
add GPL
commit 740a71e9e60bad6547c750c4ad96e9e9ce8b9ffb
Author: ZhuLiang <1029931487@qq.com>
Date: Thu Jan 18 22:20:00 2018 +0800
wrote a readme file
我们从命令的输出可以看到,git log
命令显示从最近到最远的提交日志,刚刚一次是add third day
,上一次是add GPL
,最早的一次是wrote a readme file
,如果输出信息太多,看的不是很清楚,我们加上--pretty=oneline
参数,从参数可以猜到,该参数可以一行显示:
$ git log --pretty=oneline
28b09defdd584824e04f87aa3d8b1bcda083d2ed add third day
e72b324701a01d127edc10c9a4bcf2e811dab05c add GPL
740a71e9e60bad6547c750c4ad96e9e9ce8b9ffb wrote a readme file
前面的一大串数字28b09defdd584824e04f87aa3d8b1bcda083d2ed
是commit id
(版本号)
在Git中,
HEAD
表示当前版本,即最新提交的版本28b09d...83d2ed
(注意:每个人的ID肯定不一样),HEAD^
表示上一个版本,HEAD^^
表示上上一个版本,当然如果版本太多,就写不过来了,所以用HEAD~999
表示往上999个版本
$ git reset --hard HEAD^
HEAD is now at e72b324 add GPL
Git告诉我们,现在的版本已经是add GPL
的版本了,看一下是不是呢:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
如预想的一样,我们回到了上一个版本。还可以继续回退到上一个版本,不过我们用git log
看看版本库现在的状态:
$ git log --pretty=oneline
e72b324701a01d127edc10c9a4bcf2e811dab05c add GPL
740a71e9e60bad6547c750c4ad96e9e9ce8b9ffb wrote a readme file
什么情况?最新的版本add third day
不见了,办法还是有的,只要命令窗口没关闭,就往上找呗,然后找到了add third day
的commit id
为28b09d...
,于是我们就可以回到未来的某一个版本:
$ git reset --hard 28b09d
HEAD is now at 28b09de add third day
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
再看看readme.txt的内容:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
The third day to learn git.
回来了,激动不。
但是为什么Git能够如此快速的在各个版本之间穿梭呢,因为Git内部有个
HEAD
指针指向当前版本,当回退的时候,Git只是简单的改变指针的指向,然后顺便更新工作区文件。
但是不幸的是你回退之后将窗口关掉了,然后又后悔了,想要回到新版本,这是找不到commit id
,不过Git总会又办法的,使用git reflog
命令:
$ git reflog
28b09de HEAD@{0}: reset: moving to 28b09d
e72b324 HEAD@{1}: reset: moving to HEAD^
28b09de HEAD@{2}: commit: add third day
e72b324 HEAD@{3}: commit: add GPL
740a71e HEAD@{4}: commit (initial): wrote a readme file
现在你找到了commit id
就可以轻松的回到最新版本了。
HEAD
指向当前版本,回退时使用git reset --hard commit_id
即可在版本之间穿梭;- 回退之前,用
git log
可以查看提交历史;- 要返回未来版本,用
git reflog
查看每个版本的commit id
。