学习资源:Git教程-廖雪峰的官方网站

版本穿梭

Commit是什么?

commit 是 git 的一个命令,我通常称之为提交,是个动词。现在我又知道了,commit 在 git 中也是个名词,类似于虚拟机中的“快照”。

通过 git commit 命令,git 会为 add 过的文件生成一次 commit 这样的“快照”。所以每次 add 后再 commit 都会生成"快照",就类似于虚拟机软件 VMware中每次手动生成快照一样。

和虚拟机类似,git 也可以在各个“快照”状态中切换穿梭。

git log

要在各个快照中穿梭,首先要知道有哪些快照,尤其是提交过的次数比较多,版本较多需要回到指定版本的时候,git 提供了 git log 工具。

git log 会显示从最近到最早的提交日志,从而可以找到所有快照过的版本(所以有需要记录的版本一定要add并commit)。

Git 学习记录 03_文件编辑器

使用和输出结果如上图所示。

使用 git log 命令后,git 输出了每一次提交的作者信息、时间以及提交说明(message)。那一长串字母与数字其实是一个很大的十六进制数,表示快照的版本号,每一个作者的每一次提交都有不同的版本号。

该命令还有 --pretty=oneline 参数可以简化每次提交信息到一行,如下图:

Git 学习记录 03_文件编辑器_02

git reset

git reset 是 git 中用来版本穿梭的命令。

如果我们需要以现在所处的版本为参考,回到上一个版本,上上个版本……的话,我们需要知道现在处于哪个版本。git 内有一个  HEAD 指针指向当前版本,HEAD^ 表示上个版本,HEAD^^ 表示上上个版本,……,HEAD~100表示往前数第100个版本,依次类推。

如果要穿梭到指定版本,则需要指定快照版本号(不过不用完整输入版本号,只需输入前几位,可以让git 找到唯一的版本就行)。

用法在下面展示,为此我先修改了 readme.txt 文件,其提交日志现在如下:

Git 学习记录 03_版本控制系统_03

如图所示,我提交了3次,有三个版本记录,并且 readme.txt 内容如 cat readme.txt 命令的输出所示:

Git 学习记录 03_文件编辑器_04

现在我使用 git reset --hard HEAD^ 命令,并再次查看 readme.txt 文件内容,如下图:

Git 学习记录 03_文件编辑器_05

可以看到 git reset --hard HEAD^ 命令使得 readme.txt 文件内容回退到了 2 nd ed 的版本。

接下来我再穿梭回 3 rd ed 版本,则需要指定版本号,如下图:

Git 学习记录 03_文件编辑器_06

可以看见,文件版本又回到 3 rd ed 版本了。

git reflog

按照以上内容,穿梭到未来的版本需要指定版本号,要是不记得版本号怎么办呢?

git 提供了 git reflog 命令来查看你对每一个版本执行的命令,你可以在这个命令的输出中找到版本号变更的相关信息。如下图:

Git 学习记录 03_版本控制系统_07

可以看到每一个版本的版本号。


进一步

HEAD 实际上是什么?它是如何工作的,有什么用?

git reset 的 --hard参数是什么意思,有什么作用?