这篇文章主要是对Git的基础概念及原理进行整理。最初只知道Git是用来备份和协助多人开发,同类的工具还有SVN,他们都叫做“版本控制”工具。所以关于Git的一切还要“版本控制”说起。
版本控制
什么是“版本控制”,为什么要使用它?先来一个官方定义,版本控制是一种记录一个或若干个文件内容变化,以便将来查阅特定版本修订情况的系统。去掉定语从句,版本控制是一个系统。这个系统是用来做什么的呢?一是记录文件内容变化(暂且理解为备份),二是查阅特定版本修订情况。
现在请跟着我想象一个场景,你是一个玄幻小说家,最近写一本书叫《Git修仙之旅》,你的日常工作就是在电脑上写小说。某天终于写完了精彩的一章保存在桌面上,然后去洗澡了。这时你的强迫症女朋友回来把桌面清理了一遍,你的作品就到了废纸篓里。女朋友为了证明自己是一个合格的强迫症,随即清空了废纸篓。半个钟头后你裹着浴袍出来了,女朋友自豪地对你说:老公看这下你的桌面清爽多了吧,还不亲亲人家。此时一万匹草泥马狂奔而过,你哭了。为什么当初没有留个备份呢?不要怪她,你需要的是版本控制,不仅可以满足你备份小说的需求,还可以帮你记录每次增改的内容,方便查阅。
是的,不仅仅是程序员,作家、设计师都可以使用版本控制。
本地版本控制
为了安全起见,你知道了要经常在本地备份文稿。像下面这样:
集中化的版本控制系统
接下来,老板提出一个要求,要求两个人同时来完成这部作品。既要满足自己的备份和记录需求,还要到达合作目的。也就是两台计算机的合作模式,这得配一个服务器啊。像这样:
可能你也发现服务器的重要性了,如果停电断网你们就没有办法继续合作了。
分布式版本控制系统
于是分布式版本控制系统(Distributed Version Control System,简称 DVCS)出现了。也就是本地不仅保留当前的作品,同事还保留每次修改的记录。像这样:
从此你可以放心的在电脑上完成作品了。而Git就是这分布式版本控制系统。
Git工作原理
首先来看一下SVN的工作原理:
SVN的保存信息记录的是随着时间变化,存储每个文件与初始版本的差异,如图:
而Git更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个快照流。
简言之,就是直接记录快照,而非差异比较。
Git 不需外连到服务器去获取历史,然后再显示出来——它只需直接从本地数据库中读取。 你能立即看到项目历史。 如果你想查看当前版本与一个月前的版本之间引入的修改,Git 会查找到一个月前的文件做一次本地的差异计算,而不是由远程服务器处理或从远程服务器拉回旧版本文件再来本地处理。由于Git不仅在本地保存了你正在操作的文件,还保留了所有快照。所以你在使用Git时,近乎所有操作都是本地执行,且速度快近乎瞬间完成转换。这意味着,没有网络时也可以使用Git工作。
3种状态
Git中涉及的文件有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。 已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域。
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作`‘索引’',不过一般说法还是叫暂存区域。
基本的 Git 工作流程如下:
1.在工作目录中修改文件。
2.暂存文件,将文件的快照放入暂存区域。
3.提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
如果 Git 目录中保存着的特定版本文件,就属于已提交状态。 如果作了修改并已放入暂存区域,就属于已暂存状态。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
以上就是Git的工作原理。