Git学习(二)版本回退

git status

我们已经成功地添加并提交了一个readme.txt文件,现在,是时候继续工作了,于是,我们继续修改readme.txt文件,随意更改一下里面的内容,然后运行git status命令查看结果:

1
2
3
4
5
6
7
8
9
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改。

git diff

虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。所以,需要用git diff这个命令看看:

1
2
3
4
5
6
7
8
9
10
11
12
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 4c31934..42861d1 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1,3 @@
-<U+FEFF>1.git学习。初步
\ No newline at end of file
+<U+FEFF>1.git学习。初步
+
+2.看看git status命令的结果
\ No newline at end of file

git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们添加的一条信息“2.看看git status命令的结果”。

知道了对readme.txt作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,第一步是git add

1
$ git add readme.txt

同样没有任何输出。在执行第二步git commit之前,我们再运行git status看看当前仓库的状态:

1
2
3
4
5
6
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: readme.txt

git status告诉我们,将要被提交的修改包括readme.txt,下一步,就可以放心地提交了:

1
2
3
$ git commit -m "添加了一条信息"
[master 1998486] 添加了一条信息
1 file changed, 3 insertions(+), 1 deletion(-)

提交后,我们再用git status命令看看仓库的当前状态:

1
2
3
$ git status
On branch master
nothing to commit, working tree clean

Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working directory clean)的。

版本回退

现在,我们已经学会了修改文件,然后把修改后的文件提交到Git版本库。再练习一次,修改readme.txt文件中的内容然后尝试提交。

1
2
3
4
$ git add readme.txt
$ git commit -m "添加了第3条信息"
[master 6256515] 添加了第3条信息
1 file changed, 3 insertions(+), 1 deletion(-)

像这样,你不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

现在,我们回顾一下readme.txt文件一共有几个版本被提交到Git仓库里了:
版本1: 第一次使用add和commit提交文件

1
1.git学习。初步

版本2: 添加了一条信息

1
2
3
1.git学习。初步

2.看看git status命令的结果

版本3: 添加了第3条信息

1
2
3
4
5
1.git学习。初步

2.看看git status命令的结果

3.重复上一步的内容

当然了,在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ git log
commit 6256515d442222716889c134209ec551ec4b1cff (HEAD -> master)
Author: Beme <syzq2018@qq.com>
Date: Mon Jul 31 20:54:06 2017 +0800

添加了第3条信息

commit 1998486a571d07dbd64d3a47361bf62a74a8344b
Author: Beme <syzq2018@qq.com>
Date: Mon Jul 31 20:48:51 2017 +0800

添加了一条信息

commit 47512f70b3bfb5aaa5395719fbc454356c96f2b4
Author: Beme <syzq2018@qq.com>
Date: Mon Jul 31 20:33:25 2017 +0800

第一次使用addcommit提交文件

git log命令显示从最近到最远的提交日志,我们可以看到3次提交。

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:

1
2
3
4
$ git log --pretty=oneline
6256515d442222716889c134209ec551ec4b1cff (HEAD -> master) 添加了第3条信息
1998486a571d07dbd64d3a47361bf62a74a8344b 添加了一条信息
47512f70b3bfb5aaa5395719fbc454356c96f2b4 第一次使用add和commit提交文件

好了,现在我们准备把readme.txt回退到上一个版本,也就是“添加了一条信息”的那个版本,怎么做呢?

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交6256515d442222716889c134209ec551ec4b1c...,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

现在,我们要把当前版本“添加了第3条信息”回退到上一个版本“添加了一条信息”,就可以使用git reset命令:

1
2
$ git reset --hard HEAD^
HEAD is now at 1998486 添加了一条信息

此时便回到了该版本:

1
2
3
4
$ cat readme.txt
1.git学习。初步

2.看看git status命令的结果

如果想再次回到最新的版本(“添加了第三条信息”),可以先使用命令git reflog查看命令历史,以便确定要回到未来的哪个版本。

1
2
3
4
5
$ git reflog
1998486 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
6256515 HEAD@{1}: commit: 添加了第3条信息
1998486 (HEAD -> master) HEAD@{2}: commit: 添加了一条信息
47512f7 HEAD@{3}: commit (initial): 第一次使用add和commit提交文件

然后再次使用git reset --hard commit_id命令在版本的历史之间穿梭

1
2
$ git reset --hard 6256515
HEAD is now at 6256515 添加了第3条信息

小结

HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

------ 本文结束 ------
0%