当你玩游戏时,每玩一段时间都会存一下档以免前面的进度丢失,在打厉害 BOOS 前,你也会选择存档,以免打不过而丢失进度,这个存档被称为 “快照”。
Git 允许你 commit
后的仓库自由前进后退版本,当你从 0 到 1 完成一个项目时,其中难免会出现修改多次,还有可能会出现文件误删丢失等问题,只要你正确的存档,那么 Git 就能让你有后悔药吃,不至于以前的代码全部白写。
如果你想进行版本回退或前进,首先你需要知道如何查看历史,键入 git log
命令可列出:
$ git log
我一共 commit
提交了两次版本,如下:
commit d5cbf24b3712f1524555b9b71f2937e7d62bbfc8
Author: 王佳斌
Date: Tue Jan 28 17:12:45 2020 +0800
This is a demo!
commit f39fca8aebabdc353ac82d21feb9758e6953ffcd
Author: 王佳斌
Date: Tue Jan 28 12:31:33 2020 +0800
This is a test.
第一行 commit
后面一串代码是 哈希值(Hash Function) ,它是每个版本的唯一索引。 第二行 Author
是提交的用户名及邮箱。 第三行 Date
是提交的时间及日期。
This is a demo!
是 commit
提交时的版本介绍信息。
当然,你也可以使用 git log --pretty=oneline
以更简洁的排版来打印历史:
$ git log --pretty=oneline
结果如下:
d5cbf24b3712f1524555b9b71f2937e7d62bbfc8 This is a demo!
f39fca8aebabdc353ac82d21feb9758e6953ffcd This is a test.
可以看到,省去了作者及时间,只留下了哈希值与版本介绍。
有时候为了视觉安全起见,可使用 git log --oneline
显示不完整的哈希值来打印历史:
$ git log --oneline
结果如下:
d5cbf24 This is a demo!
f39fca8 This is a test.
可以看到,显示了不完整的哈希值。
准备工作在正题之前,我们还需要做一些准备工作,模拟几个提交版本 。
注意:如果你本地有提交历史,那么你可以不做下面的准备工作。
一、工作区新建一个 project.txt
,该文件中写入 one
字符,添加暂缓区后提交:
$ touch project.txt
$ vim project.txt
$ git add project.txt
$ git commit -m "one"
二、修改 project.txt
,该文件中删除 one
字符并写入 two
字符,添加暂缓区后提交:
$ vim project.txt
$ git add project.txt
$ git commit -m "two"
三、修改 project.txt
,该文件中删除 two
字符并写入 three
字符,添加暂缓区后提交:
$ vim project.txt
$ git add project.txt
$ git commit -m "three"
我们总结一下,我们的项目文件 project.txt
已经有了 3 个版本,每个版本都已经标识。
目前,我们处在 three
第 3 个版本。假设我已经后悔了,现在要回到最初的 one
第 1 个版本。用一句简单明了的话阐述版本穿梭。根据版本索引值,移动 HEAD 指针来达到版本穿梭。
一、打印历史日志:
$ git log --pretty=oneline
我们 3 次提交的历史,都被 Git 管理并列出,:
878aab479d97cd8c2bbb4366dc2c5d65c3c639d7 three
2c3da06a3e3bc8f8ed2768398188d24c3efe848d two
94de44d2e1a9f7d6a9a9f237d553c29983be1f67 one
二、恢复 one
版本前,我们先看一下当前文件中有什么:
$ cat project.txt
结果:
three
假想一下,如果版本回退到了 one
,那么内容是不是变成了 one
呢?
三、根据哈希值索引,移动 HEAD 指针回退:
$ git reset --hard 94de44d2e1a9f7d6a9a9f237d553c29983be1f67
Git 提示,指针(HEAD) 现在在 one,也就是成功了:
HEAD is now at 94de44d one
四、测试,查看当前 project.txt
文件中有什么:
$ cat project.txt
# one
这样,我们就完成了一次版本的回退,你可以自由在各版本中随意穿梭。
写在后面版本穿梭命令还有其他常用参数,如果你想了解更多版本穿梭知识请访问 Git - 版本穿梭 reset 命令常用三个参数及实际应用场景(–hard / --soft / --mixed)
本文只介绍了 如何进行版本穿梭,并未涉及 Git 版本穿梭的核心概念,如果你想了解 Git 版本穿梭的核心概念 HEAD指针
的话,请移步 HEAD 是什么?。