前言
当你玩游戏时,每玩一段时间都会存一下档以免前面的进度丢失,在打厉害 BOOS 前,你也会选择存档,以免打不过而丢失进度,这个存档被称为 “快照”。
Git 允许你commit
后的仓库自由前进后退版本,当你从 0 到 1 完成一个项目时,其中难免会出现修改多次,还有可能会出现文件误删丢失等问题,只要你正确的存档,那么 Git 就能让你有后悔药吃,不至于以前的代码全部白写。
查看历史
如果你想进行版本回退或前进,首先你需要知道如何查看历史,键入git log
命令可列出:
$ git log
我一共commit
提交了两次版本,如下:
commit d5cbf24b3712f1524555b9b71f2937e7d62bbfc8Author: 王佳斌 <wangjiabinweb@>Date: Tue Jan 28 17:12:45 +0800This is a demo!commit f39fca8aebabdc353ac82d21feb9758e6953ffcdAuthor: 王佳斌 <wangjiabinweb@>Date: Tue Jan 28 12:31:33 +0800This 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 three2c3da06a3e3bc8f8ed2768398188d24c3efe848d two94de44d2e1a9f7d6a9a9f237d553c29983be1f67 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 是什么?。