通过上一篇文章Git的添加、提交与移除我们已经学会了如何创建git仓库,并使用Git管理文件,我们每次更新文件,提交到仓库。那么我们设想一下这样的情形,如果中间某一次提交的代码是有错误的,那么这个时候我们是不是会想如果能将代码恢复到那次错误提交之前就好了。其实git就提供了这样的功能,本节我们将一起探索git的版本回退。
查看提交日志
任何时候,你都有可能需要撤消刚才所做的某些操作。接下来,我们会介绍一些基本的撤消操作相关的命令。请注意,有些撤销操作是不可逆的,所以请务必谨慎小心,一旦失误,就有可能丢失部分工作成果。
我们对工作空间的代码或者文件进行了多次修改,在后面的过程中我们发现其中某一次操作会导致一些错误,我们需要恢复到那次提交之前。那么现在就有一个问题?怎么才能找到那次错误的提交呢?细心的同学可能已经发现。在上一节我们每次提交的时候总有一个提交的版本号。那么我们的回退其实就会用到这个版本号。那么又有疑问了,我们怎么能记得那么多版本号呢?这一点git 也帮我们考虑到了,对,就是git log
命令。
该命令用于查看当前工作空间git的操作记录。
$ git log
commit f40077d9a819899cbee0b41574409bbdcb5af5d8 (HEAD -> master)
Author: snowzhang
Date: Fri Jul 6 16:24:46 2018 +0800
add snow.txt
commit e0fd4468622fe4d53d959957e9ac4c21271ed75d
Author: snowzhang
Date: Fri Jul 6 16:23:35 2018 +0800
add second commit
commit 04562b316209f040aedcae3abf57cd9e8c19c9ed
Author: snowzhang
Date: Fri Jul 6 16:22:50 2018 +0800
init commit
git log
命令显示从最近到最远的提交日志,每次更新都有一个 SHA-1 校验和、作者的名字和电子邮件地址、提交时间,最后缩进一个段落显示提交说明。我们可以看到3次提交,最近的一次是add snow.txt,上一次是add second commit,最早的一次是init commit。需要友情提示的是,你看到的一大串类似f40077...的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。
好了我们已经查到了我们每次提交的记录log了,那么这时候我想回到第二次提交的那个节点,该怎么做呢?使用git reset
命令。
git 版本回退
使用git reset
命令
git reset --soft|--mixed|--hard
这里的
--mixed 会保留源码,只是将git commit和index 信息回退到了某个版本.
--soft 保留源码,只回退到commit信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可.
--hard 源码也会回退到某个版本,commit和index 都会回退到某个版本.(注意,这种方式是改变本地代码仓库源码)
好了理解了命令的意思,我们现在开始操作
$ git reset --hard e0fd4468622fe4d53d959957e9ac4c21271ed75d
HEAD is now at e0fd446 add second commit
好了提示当前HEAD已经在第二次提交上了,完美解决。查看文件已经恢复到了添加snow.txt之前的状态了。
这个时候我们查看git log
commit e0fd4468622fe4d53d959957e9ac4c21271ed75d (HEAD -> master)
Author: snowzhang
Date: Fri Jul 6 16:23:35 2018 +0800
add second commit
commit 04562b316209f040aedcae3abf57cd9e8c19c9ed
Author: snowzhang
Date: Fri Jul 6 16:22:50 2018 +0800
init commit
发现已经没有第三次的那个add snow.txt的提交了。并且当前工作空间也没有snow.txt文件了。
这个时候我又突然想回到add snow.txt版本该怎么办呢?当前工作空间已经没有snow.txt文件了。该怎么办呢?办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个add snow.txt的commit id是f40077d...,于是就可以指定回到未来的某个版本:
$ git reset --hard f40077d9a819899cbee0b41574409bbdcb5af5d8
HEAD is now at f40077d add snow.txt
然后查看工作空间snow.txt文件也恢复了。
那么如果当前的命令行窗口已经关闭了,找不到那次提交的日志了该怎么办呢?
其实办法还是有的,Git提供了一个命令git reflog
用来记录你的每一次命令:
e0fd446 (HEAD -> master) HEAD@{0}: reset: moving to e0fd4468622fe4d53d959957e9ac4c21271ed75d
f40077d HEAD@{1}: reset: moving to f40077d9a819899cbee0b41574409bbdcb5af5d8
e0fd446 (HEAD -> master) HEAD@{2}: reset: moving to e0fd4468622fe4d53d959957e9ac4c21271ed75d
f40077d HEAD@{3}: reset: moving to f40077d9a819899cbee0b41574409bbdcb5af5d8
e0fd446 (HEAD -> master) HEAD@{4}: reset: moving to e0fd4468622fe4d53d959957e9ac4c21271ed75d
f40077d HEAD@{5}: commit: add snow.txt
e0fd446 (HEAD -> master) HEAD@{6}: commit: add second commit
04562b3 HEAD@{7}: commit (initial): init commit
我们通过这个命令又找到了add snow.txt的那次提交的commit id。然后使用:
$ git reset --hard f40077d9a819899cbee0b41574409bbdcb5af5d8
HEAD is now at f40077d add snow.txt
又能回到最近提交的那个版本了。有没有发现git 真是版本管理的神器。
至此。关于git版本回退的演示就到这里。
作者水平有限,写的不好,请多多包涵。
下一节将介绍如何追加提交和合并多次提交。敬请关注。谢谢