从游戏存档说起

让我们来考虑这样一个场景:你正在玩一款很好玩的游戏,玩到紧要关头,正在这个时候,你妈喊你吃饭了,你该怎么办?此时,你可以按下暂停键,先去吃饭,吃完饭再回来继续进行游戏。但是假如你吃饭的时候,突然停电了,那你之前的成果就全部白费了。不过,一般游戏都会提供存档功能,一般有两种方式:

两种存档方式各有优缺点:

回到我们的主题上,我们要聊的git是一个版本控制软件,其功能和游戏的手动存档很类似,主要有两个区别:

我们先说存档,分布式后面再聊。

使用Git模拟存档

我们来用git模拟一下我们玩游戏的场景。随便进入一个目录,使用如下命令来开始我们的游戏:git init mario 执行完成后,会发现目录下新增了一个名叫mario的目录。我们进入这个目录,会发现这个目录下面什么都没有。

git的安装与配置请自行搜索

我们新建一个文件player.txt模拟游戏进度。假设我们现在开始马里奥的第一关,此时游戏画面如下:

******** ************ ####....#. #..###.....##.... ###.......###### ........... ##*####### 0 - 0 ####*******###### ...#***.****.*###.... ....**********##..... ....**** *****.... #### #### ###### ######

此时我们执行一下git status命令,会出现如下信息:

On branch master No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) player.txt nothing added to commit but untracked files present (use "git add" to track)

可以看到,目前的player.txt是没有被追踪的,也就是没有进行存档。同时我们通过git log指令,可以看到,目前没有任何的存档记录。

fatal: your current branch 'master' does not have any commits yet

我们想对其进行存档操作,那我们可以执行下面的命令:

git add player.txt git commit -m 'm00'

执行完成后,我们执行git log指令,可以看到类似如下信息:

commit b0d5581b592f3d5faaca744e88eed604f2289904 (HEAD -> master) Author: 柔性思维 Date: Wed Mar 16 14:05:19 2022 0800 m00 (END)

这就是我们的一条存档记录。此时,我们继续进行游戏,游戏画面变为:

******** ************ ####....#. #..###.....##.... ###.......###### ........... ##*####### 0 - 1 ####*******###### ...#***.****.*###.... ....**********##..... ....**** *****.... #### #### ###### ######

此时,我们继续执行上面的操作,进行存档:

git add player.txt git commit -m 'm01'

执行完成后,我们执行git log指令,可以看到如下存档信息:

commit d3a1237365e2b2f1ceaf2939b35f6fca5ce99812 (HEAD -> master) Author: 柔性思维 Date: Wed Mar 16 14:09:59 2022 0800 m01 commit b0d5581b592f3d5faaca744e88eed604f2289904 Author: 柔性思维 Date: Wed Mar 16 14:05:19 2022 0800 m00 (END)

此时,如果我希望想查看第一个存档点的内容,那我可以执行如下命令:

git checkout b0d5581b

然后执行cat player.txt 你就能看到内容回到了第一次保存的内容。此时我们可以从这个存档开始继续游戏,打开player.txt,假设玩到了0-2:

******** ************ ####....#. #..###.....##.... ###.......###### ........... ##*####### 0 - 2 ####*******###### ...#***.****.*###.... ....**********##..... ....**** *****.... #### #### ###### ######

此时我们需要新开一个流程:

git switch -c 'load-00'

然后我们再存档:

git add player.txt git commit -m 'm00-1'

使用git log命令,我们可以看到类似下面的信息:

commit 79bd5c56e020eeb47919be29b29928e7397c1929 (HEAD -> load-00) Author: 柔性思维 Date: Wed Mar 16 15:46:39 2022 0800 m00-1 commit b0d5581b592f3d5faaca744e88eed604f2289904 Author: 柔性思维 Date: Wed Mar 16 14:05:19 2022 0800 m00

很奇怪,为什么m01这个存档消失了呢?因为存档在m00那边产生了分叉:

m00 / \ m01 m00-1 <----- 我们在这里

从这里往回看,我们只能看到m00-1和m00。我们切换到m01处,再使用git log看一下。

git checkout master git log

我们就能看到m01了。

commit d3a1237365e2b2f1ceaf2939b35f6fca5ce99812 (HEAD -> master) Author: 柔性思维 Date: Wed Mar 16 14:09:59 2022 0800 m01 commit b0d5581b592f3d5faaca744e88eed604f2289904 Author: 柔性思维 Date: Wed Mar 16 14:05:19 2022 0800 m00

现在我就可以以两条路线来进行游戏的存档保存了。

总结

在快速理解Git一文中,我们已经介绍了工作区、暂存区/索引区、版本库这几个概念,如果不太记得了可以回去复习一下。本文实际是Git本地版本管理的一个简单实例,展示了每次操作后,Git版本库中的不同变化。相关流程如下所示:

git客户端操作(从游戏存档聊聊Git版本管理)(1)

下文,我们将详细聊一聊分支。

,