在使用 Git 管理代码仓库/文件夹时,存在着三个区域:工作区、暂存区、版本库。
- 工作区就是当前的各种文件所在的区域,就是实实在在地存在你的文件夹里、能从系统的窗口里看到的内容。
- 暂存区是一个由 Git 通过所谓「索引文件」创设出来的虚构区域,其所存放的是一些被你要求「记录在案」但尚未确定去留的文件。
- **版本库则是 Git 根据当前目录的各个历史版本而创建的虚构区域,以压缩文件的形式存储在当前文件夹下(存放在名为
.git
的隐藏文件夹中)。与暂存区不同的是,版本库中所记录的文件版本、改动记录已经被固结,只能删除而不能修改。特别地,在远程平台——如 GitHub 上——所留存的文件,都是以版本库的形式存在的。
读者可能会问:为什么做版本控制需要三个区域来记录呢?为了方便理解,有这样一个例子可供参考:
你是一个美食博主。今天你心情不错,打算精心准备一桌菜,然后再拍照发布。在准备的过程中:
- 你所烹饪出来的、摆在饭桌上的菜,真实存在,这张饭桌便是所谓的工作区;
- 你是一个心思细腻的人,不光期待着结果,还随时用手机记录做饭过程中各个阶段的状况。这些由你在不同时间拍下来的照片,「记录」了你所烹饪的菜品之「改动」;而存储着这些照片的手机空间,就是所谓的暂存区;
- 烹饪渐近尾声,桌上的菜品玲琅满目,你的手机里也储存了许多或好或坏的照片。这时,你可以对你的照片仔细筛选,最终挑选出一组完美的「九图大法阵」;配上一段文字说明,你轻按微博界面上的「发布」按钮,一条新的微博就经由你手机上的一个本地数据库传递到微博平台的服务器上,进而可以在整个互联网上看到。你所最终发布的这条微博,便是代码管理过程中所谓的「版本」;储存着这些微博的本地数据库和远程服务器,就是所谓的版本库。
很显然,在以上三个储存区中,只有工作区储存着真正的美食,而暂存区和版本库记录的不过是照片——在代码管理过程中,相应的事物则叫做「快照」。至于为什么要在工作区与版本库之间多加上暂存区这一环节,打一个比方便是:如果你用手机拍的每一张照片都会自动发布在微博上,你还敢轻易的拍照片吗?还能「仔细筛选」吗?