我决定精简笔记了,以下全是硬货
再次修改文件内容为
Git is a distributed version control system.
Git is free software distributed under the GPL.
然后提交
$ git add readme.txt
$ git commit -m "append GPL"
再次修改内容为:
Git is a distributed version control system.
Git is free software.
再次提交
$ git add readme.txt
$ git commit -m "增加了一段描述"
到此,我们总共提交了三个版本,在实际工作中,可能是几千行的文件被改了无数次,人脑根本记不住,但是在Git中,通过git log
可以告诉我们历史记录:
查看历史
$ git log
git log
命令会把从近到远的提交日志显示出来,可以看到,最早的一次是“white a readme file”,最近的一次是“增加了一段描述”
如果文件修改次数较多,也可以加上--pretty=oneline
参数:
$ git log --pretty=oneline
就会得到省略时间和作者的比较简洁的历史提交日志;
友情提示:你看到的一大串类似于6620…的是每次提交的版本号,这和SVN不同,Git的版本号是一个用SHA1计算出来的一个非常大的十六进制数字;
每提交一个版本,Git就会把它们自动串成一条时间线,如果使用可视化工具查看Git历史,就可以更清楚的看到提交历史的时间线:
下面我们学习回退到某一个历史版本:
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交6620......
的这个版本(每个人的版本号肯定不同)你上一个版本是HEAD^
,上上一个版本就是HEAD^^
当然,往上100个版本是不可能写100个^
的,(笑哭。。。。),所以写成HEAD~100
。
如果我们想把版本回退到上一个可以使用命令git reset
$ git reset --hard HEAD^
--hard
参数的意义后面再讲
现在去看看你的readme.txt
文件是不是回到了上一个版本;
我们现在用git log
看看现在版本库的状态:
以上红框中任选一个操作即可
又想回到最新的版本
之前最新的那个版本“增加了一段描述”
已经不在了,时光穿梭到了历史,但是如果你想找回来之前最新的版本该怎么操作?注意:只要以上的命令窗口还没有关闭,你就可以往上找,找到“增加了一段描述”
的commit id
,也就是版本号,这样就可以又回到未来的某个版本;
$ git reset --hard 6620183
版本号没必要写全,前几位就可以,Git会自动去找,当然,尽量多写几位,不要写一两位;
现在,再去看一下你的readme.txt
文件
果然,他胡汉三又回来了。。。。。。。
解释下原理
Git的版本回退速度非常快,因为Git再内部有个指向当前版本的head
指针,当你回退版本的时候,Git仅仅是把HEAd
指针指向你想要的版本:
改变版本:
然后顺便把你工作区的文件更新了,所以你让HEAD
指向那个版本号,你就把当前版本号定位在哪。
如果,你关闭了当前命令窗口,还想回到最近的一个版本,找不到最近的版本commit id
怎么办?
在Git中,总是有后悔药可以吃的,当你用$ git reset --hard HEAD^
回退到上一个版本的时候,再想恢复“增加了一段描述”
这个最新版本,就必须找到“增加了一段描述”
的commit id
,Git提供了一个命令git reflog
用来记录你的每一次命令:
查看你的每一次命令,来查看之前的版本号
$ git reflog
从Git输出可知,你要找的每一个版本的commit id
都有,你就可以去到任意一个版本了
总结
-
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard <commit_id>
-
穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 -
要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。