版本控制
版本控制是一种记录一个或若干个文件内容变化、以便将来查阅特定版本修订情况的系统。
本地版本控制系统
很久以前就开发了许多本地版本控制系统、大多都是采用某种简单的数据库来记录文件的历次更新差异。
其中最流行的一种叫做 RCS、现今许多计算机系统上都还看得到他的踪影。RCS 的工作原理是在硬盘上保存补丁集、通过应用所有的补丁、可以重新计算出各个版本的文件内容。
集中化版本控制系统
让不同系统上的开发者协同工作、集中化版本控制系统应运而生。有一个单一的集中管理的服务器、保存所有文件的修订版本、而协同工作的人们都通过客户端连到这台服务器、取出最新的文件或者提交更新。
坏处
- 单点故障
- 无备份
分布式版本控制系统
在分布式版本控制系统中、客户端不只是提取最新版本的文件快照、而是把代码仓库完整地镜像下来、包括完整的历史记录。
这么一来、任何一处协同工作用的服务器发生故障、事后都可以用任何一个镜像出来的本地仓库恢复。
Git 简史
Git 的设计目标
- 速度
- 简单的设计
- 对非线性开发模式的强力支持(允许成千上万个并行开发分支)
- 完全分布式
- 有能力高效管理类似 Linux 内核一样的超大规模项目
直接记录快照、而非差异比较
Git 喝其他版本控制系统(Subversion) 的主要差别在于 Git 对待数据的方法。
从概念上来说、其他大部分系统以文件变更列表的方式存储信息、这类系统将它们存储的信息看作是一组基本文件喝每个文件随时间逐步累积的差异,称之为基于差异的版本控制
Git 不按照以上方式对待或保存数据、Git 更像是把数据看作是对小型文件系统的一系列快照。在 Git 中、每当你提交更新或保存项目状态时、它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。为了效率、如果文件没有修改、Git 则不再重新存储文件、只是保留一个指向之前存储的文件。Git 对待数据更像是一个快照流。
Git 几乎与所有其他版本控制系统的重要区别就是在于这个地方。
近乎所有操作都是本地执行
在 Git 中绝大多数操作都只需要访问本地文件和资源、一般不需要来自网络上其他计算机的信息。
Git 保证完整性
Git 中所有的数据在存储前都计算检验和、然后以检验和来饮用。
Git 用以计算校验和的机制叫做 SHA-1 散列。是由 40 个十六进制自发组成的字符串、基于 Git 中文件内容或目录结构计算出来的。
Git 一般只添加数据
你执行的 Git 操作、几乎只往 Git 数据库中添加数据
三种状态
Git 有三种状态、你的文件可能处于其中的一种
- 已修改
表示修改了文件、但没保存到数据库中 - 已暂存
表示对一个已修改文件到当前版本做了标记、使之在下次提交到快照中 - 已提交
表示数据已经安全地保存在本地数据库中。
这会让我们的 Git 项目拥有三个阶段:工作区、暂存区、Git 目录。
工作区是对项目的某个版本独立提取出来的内容。这些从 Git 仓库的压缩数据库中提取出来的文件、放在磁盘供你使用或修改。
暂存区是一个文件、保存了下次将要提交的文件列表信息、一般在 Git 仓库目录中。按照 Git 的术语叫做“索引”。
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。这是Git 中最重要的部分。从其他计算机克隆仓库时、复制的就是这里的数据。
基本的 Git 工作流程如下
- 在工作区中修改文件
- 将你想要下次提交的更改选择性地暂存、这样只会将更改的部分添加到暂存区。
- 提交更新、找到暂存区的文件、将快照永久性存储到 Git 目录。