Git系列-4-版本管理

版本管理

版本回退

按照之前的操作,我们已经有3次commit,如何查看呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ git log
commit a83beff902f6e37a0b51218d2fba3d911c4d1487
Author: shuwei <shuvigoss@gmail.com>
Date: Thu Aug 25 16:22:07 2016 +0800

third commit

commit afef6dd1fc89eb977a1c51de9f1c5a7de7ae5dd1
Author: shuwei <shuvigoss@gmail.com>
Date: Thu Aug 25 15:48:32 2016 +0800

second commit

commit 3d78e6b751d368c72d020ab8621c74aa97a1ff4e
Author: shuwei <shuvigoss@gmail.com>
Date: Thu Aug 25 15:33:39 2016 +0800

first commit

每一次的commit都有记录,包括时间、提交的描述、谁提交的。其中第一行的commit后跟的是每一次提交生成的SHA1串,我们可以管它叫commit id(版本号),这个版本号是用来做版本回退的核心。比如我想将版本回退到第一次提交也就是first commit,那么如何做呢?

1
2
$ git reset --hard HEAD^^
HEAD is now at 3d78e6b first commit

上面又用到了reset命令,其中HEAD这个参数就是你要将版本回退到当前HEAD往前的几个版本。比如:

HEAD^   回退到当前版本的前一版本
HEAD^^  回退到当前版本的前前一版本
HEAD~10 回退到当前版本前10个版本

接下来查看当前工作区是否已经回退到我们需要的版本呢?

1
2
$ more README.md
first blood

确实已经是我们第一次提交的内容。

每个commit id 会有它的简写 比如原始commit id 为 3d78e6b751d368c72d020ab8621c74aa97a1ff4e
那么它可以使用前七位来表示3d78e6b

那么我们再使用git log查看当前的commit log会是什么样的呢?

1
2
3
4
5
commit 3d78e6b751d368c72d020ab8621c74aa97a1ff4e
Author: shuwei <shuvigoss@gmail.com>
Date: Thu Aug 25 15:33:39 2016 +0800

first commit

我靠!我后边的内容丢了!完蛋了,回退错了~~
不急,因为我们前边已经有最后一个版本的版本号了,那么再回退回去就好了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ git reset --hard a83beff
HEAD is now at a83beff third commit
$ git log
commit a83beff902f6e37a0b51218d2fba3d911c4d1487
Author: shuwei <shuvigoss@gmail.com>
Date: Thu Aug 25 16:22:07 2016 +0800

third commit

commit afef6dd1fc89eb977a1c51de9f1c5a7de7ae5dd1
Author: shuwei <shuvigoss@gmail.com>
Date: Thu Aug 25 15:48:32 2016 +0800

second commit

commit 3d78e6b751d368c72d020ab8621c74aa97a1ff4e
Author: shuwei <shuvigoss@gmail.com>
Date: Thu Aug 25 15:33:39 2016 +0800

first commit

看,HEAD又回到最后一次提交的版本了。
我们可以把上边2次reset操作通过下面这个图表来表示。

first commit second commit third commit
commit id 3d78e6b afef6dd 3d78e6b
origin HEAD
reset1 HEAD
reset2 HEAD

所以版本的回退Git做的就是将HEAD指针移动到相应的commit id,所以说Git的速度快就体现在这里。

假如你没有记录之前的版本内容,如何获取呢?

1
2
3
4
5
6
$ git reflog
a83beff HEAD@{0}: reset: moving to a83beff
3d78e6b HEAD@{1}: reset: moving to HEAD^^
a83beff HEAD@{2}: commit: third commit
afef6dd HEAD@{3}: commit: second commit
3d78e6b HEAD@{4}: commit (initial): first commit

reflog命令可以记录你每一次的命令。