我们日常写代码的时候,完成一部分功能后,都希望在版本控制器中保存一个“快照”,这个快照在 git 中就是 commit
,如果我们发现当前代码有问题,想要回退到某个历史版本,就可以从某一个 commit
中恢复。
查看历史记录
使用命令行 git log
,会得到一个 log 列表,越上面的log,就是越靠近当前时间的提交记录。commit 后面跟的16进制的值是使用 SHA1计算出来的 commit id
(版本号),在回退或者是变更到某一个版本快照的时候,需要使用到这个 commit id 。
第一条 log 信息带有 HEAD -> master
,这表示这条记录是当前版本,并且是在 master
分支,上一个版本是HEAD^
,上上个版本是 HEAD^^
,如果是上一百个版本怎么表示呢?使用 ~
符号加上数字就可以表示,比如:HEAD~100
。那么这个 HEAD 是什么呢,它其实是 Git 内部的一个指针,指向了我们提交的快照( commit),当我们需要回退或者是前进版本的时候,操作的其实是这个指针,让他指向我们想要的那个快照,然后跟新文件内容。
$ git log
commit daa5a4c871cbe070d505936f68c799b950cb6321 (HEAD -> master)
Author:
Date: Tue Jul 3 14:01:43 2018 +0800
新增文件第二次(真)
commit fa5cb84cd068e461c17c0b3ec42a2477260148f9
Author:
Date: Tue Jul 3 14:00:58 2018 +0800
新增文件第二次
commit f2c92b381d9022727ee744e85f6ce6c3d57882cd
Author:
Date: Tue Jul 3 13:21:20 2018 +0800
add README
执行回退
使用命令行 git reset --hard commit_id
,commit_id
可以使用 HEAD^
这样的 head 来替换
$ git reset --hard HEAD^
HEAD is now at fa5cb84 新增文件第二次
$ git log
commit fa5cb84cd068e461c17c0b3ec42a2477260148f9 (HEAD -> master)
Author:
Date: Tue Jul 3 14:00:58 2018 +0800
新增文件第二次
commit f2c92b381d9022727ee744e85f6ce6c3d57882cd
Author:
Date: Tue Jul 3 13:21:20 2018 +0800
add README
我们看到 git 提示我们 HEAD is now at fa5cb84, 这个 fa5cb84 就是当前 commit id 的前7位。
再次打印 log 信息我们发现,原本有三次提交记录的 log 列表,此时只有两次了,在会退前的最后一次提交信息已经看不到了。
如果这个时候,我们又不想回退了,需要恢复到回退前的版本怎么办呢?首先,我们需要找到我们想要恢复的那个快照的 commit id , 然后使用 git reset --hard commit_id
命令来执行指针的移动,就可以恢复到我们想要的版本了。
如何找到我们想要的 commit id 呢?使用 git reflog
就可以了。这个命令会列出来我们所有执行过的操作。可以看到我们要找的 commit id daa5a4c
已经展示在了列表中了。
$ git reflog
fa5cb84 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
daa5a4c HEAD@{1}: commit: 新增文件第二次(真)
fa5cb84 (HEAD -> master) HEAD@{2}: commit: 新增文件第二次
f2c92b3 HEAD@{3}: commit (initial): add README
执行$ git reset --hard daa5a4c
可以看到当前版本确实变成了我们想要的回退之前的最后一次提交的版本。
$ git reset --hard daa5a4c
HEAD is now at daa5a4c 新增文件第二次(真)
总结:
-
HEAD指向的版本就是当前版本,因此,Git允许我们在各个提交的版本之间跳转,使用命令
git reset --hard commit_id
。 -
回退版本前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 -
要重返未来的版本,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
网友评论