让我们来考虑这样一个场景:你正在玩一款很好玩的游戏,玩到紧要关头,正在这个时候,你妈喊你吃饭了,你该怎么办?此时,你可以按下暂停键,先去吃饭,吃完饭再回来继续进行游戏。但是假如你吃饭的时候,突然停电了,那你之前的成果就全部白费了。不过,一般游戏都会提供存档功能,一般有两种方式:
- 自动存档:你只要到了固定的存档地点,游戏自动帮你存档,当你再次开始游戏的时候,自动帮你从存档点恢复
- 手动存档:提供存档菜单,可以保存游戏存档,当需要进行存档时,进行对应的存档操作即可。
两种存档方式各有优缺点:
- 自动存档不需要玩家进行存档操作,比较方便,不过不能在玩家想存档的地方进行存档,例如上面的场景中,如果你妈喊你吃饭时,还没有到游戏存档点,那你就无法立即停下游戏。
- 而手动存档可以满足上面的场景,可以立即进行存档操作,不过需要玩家自行进行存档操作。如果在游戏过程中突然停电了,那玩家会比较抓狂。同时一般手动存档提供有限的存档空间,例如10个。当你使用完了10个存档点后,需要继续存档时,则只能选择覆盖历史存档。
回到我们的主题上,我们要聊的git是一个版本控制软件,其功能和游戏的手动存档很类似,主要有两个区别:
- git支持无限存档
- 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版本库中的不同变化。相关流程如下所示:
下文,我们将详细聊一聊分支。
,