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 add readme.txt
$ git commit -m "add third day"
[master 28b09de]
 1 file changed, 1 insertion(+)

你可以不断对文件进行修改,然后不断地将其提交到版本库里,可以这样理解,当你在下班之前将文件改好之后,可以给文件做个“快照“,这个动作在Git中就是commit,万一你一不小心将文件删除之后,可以从最近的commit恢复,而不是把之前的工作结果都丢了然后从头再来。

回顾一下readme.txt文件总共被提交过几次到版本库:
  • 版本1:wrote a readme file
Git is a distributed version control system.
Git is free software.
  • 版本2:add GPL
Git is a distributed version control system.
Git is free software distributed under the GPL.
  • 版本3:add third day
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

前面的一大串数字28b09defdd584824e04f87aa3d8b1bcda083d2edcommit id(版本号)

Git中,HEAD表示当前版本,即最新提交的版本28b09d...83d2ed(注意:每个人的ID肯定不一样),HEAD^表示上一个版本,HEAD^^表示上上一个版本,当然如果版本太多,就写不过来了,所以用HEAD~999表示往上999个版本

现在我们准备将版本回退到上一个版本:add GPL
$ 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 daycommit id28b09d...,于是我们就可以回到未来的某一个版本:

$ 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

你可能感兴趣的:(git版本回退)