编辑: 645135144 | 2012-12-12 |
让我们开始理解分支的概念并熟练运用从而真正体会Git的如此强大而独特. 最开始的Subversion是集中的版本控制系统,它有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新.这种集中式版本控制系统最显而易见的缺点是中央服务器的单点故障.如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作.要 是中央服务器的磁盘发生故障,碰巧没做备份,或者备份不够及时,就还是会有丢失数据的风险.最坏的情况是彻底丢失整个项目的所有历史更改记录,而被客户端 提取出来的某些快照数据除外,但这样的话依然是个问题,你不能保证所有的数据都已经有人事先完整提取出来过.本地版本控制系统也存在类似问题,只要整个项 目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险.相应的Git是分布式版本控制系统,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来.这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜 像出来的本地仓库恢复.因为每一次的提取操作,实际上都是一次对代码仓库的完整备份. 更进一步,git这类分布式系统都可以指定和若干不同的远端代码仓库进行交互.籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作.你可以根据需要设定不同的协作流程,比如层次模型式的工作流,下图是git的工作流 Git思想及基本工作原理 2.1直接记录快照,而非差异比较 Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异.比如Subversion每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容 可以看到,subversion在每个版本中保存着每个文件的差异 Git 并不保存这些前后变化的差异数据.实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中.每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照 的索引.为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接 由图可以看到git保存每次更新时候的文件快照 2.2近乎所有操作都是本地执行 在Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网.但如果用 CVCS 的话,差不多所有操作都需要连接网络.因为 Git 在本地磁盘上就保存着所有当前项目的历史更新,所以处理起来速度飞快. 举个例子,如果要浏览项目的历史更新摘要,Git 不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你看.所以任何时候你都可以马上翻阅,无需等待.如果想要看当前版本的文件和一个月 前的版本之间有何差异,Git 会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较. 用CVCS 的话,没有网络或者断开 VPN 你就无法做任何事情.但用 Git 的话,就算你在飞机或者火车上,都可以非常愉快地频繁提交更新,等到了有网络的时候再上传到远程仓库 2.3时刻保持数据完整性 在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引.换句话说,不可能在你修改了文件或目录之后,Git 一无所知.这项特性作为 Git 的设计哲学,建在整体架构的最底层.所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git 都能立即察觉. Git 使用 SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个 SHA-1 哈希值,作为指纹字符串.该字串由