目录

从 0 开始学习 GitHub 系列-6-Git 版本回退

更新于 2021-01-27

从 0 开始学习 GitHub 系列-6-Git 版本回退

笔者阅读 stromzhang 的git 系列教程时,觉得没有把版本回退给说清楚,所以加了这篇文章。

作为版本管理工具,很重要的作用就是给我们后悔的选择,有时候难免发现自己后来的工作还不如原来的,Git 版本回退就给了我们后悔的余地。

准备

新建一个 readme.md,随意添加一行内容,然后提交

git add .
git commit -m 'first'

[master (root-commit) c60d4e0] 'first'
 1 file changed, 2 insertions(+)
 create mode 100644 readme.md

然后再添加一行内容,进行提交

git add .
git commit -m 'second'

[master f427098] 'second'
 1 file changed, 1 insertion(+)

查看版本记录

git log

image-20210126102949491

git log命令显示从最近到最远的提交日志,我们可以看到2次提交,最近的一次是second,如果是一个大工程,就可能会有很多输出,--pretty=oneline参数会帮我们简化输出。

image-20210126103134643

返回上一个版本

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交f427098d...(注意我的提交ID和你的肯定不一样)。

现在,我们要把当前版本second回退到上一个版本first,就可以使用git reset命令:

git reset --hard c60d4e0d74e462f1d4b177d697d8d96242c9afb9

image-20210126103531603

果然被还原了。

我们现在用git log查看以下版本库

image-20210126103626123

我们会发现最新的second版本已经看不到了,但是如果我们又想要second版本怎么办?

如果我们当前的窗口还没关闭,我们可以往上翻翻找到second版本的ID,然后用

git reset --hard f427098d7898082451b90c4f62f225e78b9176ec

来返回,其实后面的ID号没必要写全,输入前几位就可以,GIT会自动查找。

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向其他版本而已,然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。

如果我们的窗口已经关闭了,找不到commit id怎么办?

Git提供了一个命令git reflog用来记录你的每一次命令:

image-20210126104135164

于是,我们就可以看到我们需要的ID。

进阶回退

git reflog命令来快进版本。但是这种方法会导致目标版本之后的版本变成漂流对象,如果推送到远程库,或者引用历史(.git/logs/)丢失,那么其他人将难以查找版本历史。

如果已经有A -> B -> C,想回到B:

方法一:reset到B,丢失C:

git reset

A -> B

方法二:再提交一个revert反向修改,变成B:

git revert

A -> B -> C -> B

C还在,但是两个B是重复的