Git分布式版本控制详解(1):基础介绍

  Git是一个开源的分布式版本控制系统,用以有效、高速地处理各种项目的版本管理。Git自动2005年推出后,受到了开源力量和开源人士的大力支持,越来越多的开源项目正在加入Git。本文详细介绍了有关于Git分布式版本控制的发展、优缺点以及实现原理等相关知识,便于随时查阅(摘自官方文档:http://git-scm.com/book/zh)。

 

一、Git起步

1、版本控制系统的发展 

   1) 本地版本控制系统。本地版本控制系统大多采用某种简单的数据库来记录文件的历次更新差异,其结构如图1-1所示。最流行的本地版本控制系统叫做RCS(Revision Control System,修订版本系统),他的工作原理基本上是保存并管理文件补丁(patch)。文件补丁是一种特殊格式的文本文件,记录对应文件修订前后的内容变化,因此,RCS可以根据通过不断打补丁,计算出各版本之间的文件内容。

《Git分布式版本控制详解(1):基础介绍》

 图1-1 本地版本控制系统

   2) 集中化版本控制系统。这类系统,如CVSSubversion以及Perforce等,都有一个单机的集中管理服务器,保存所有文件的修订版本。协同工作的程序员通过客户端连接这台服务器,进行更新或提交操作,结构如图1-2所示。多年来,这成为了版本控制的标准做法。这种控制系统的缺点是,所有的项目历史更新记录保存在服务端,一旦服务器硬盘发生故障很有可能丢失所有的项目历史数据。 

《Git分布式版本控制详解(1):基础介绍》

 图1-2 集中化版本控制系统

   3) 分布式版本控制系统DVCS(Distributed Version Control System)。这类系统,如GitMercurialBazaar以及Darcs等,客户端并不只是提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来,每次提取相当于对代码仓库进行了一次备份,结构如图1-3所示。每次提取都拷贝完整的代码仓库,因此提取速度较慢,提取后本地文件也较大,但此后可以在离线条件下对本地代码进行编写、提交和更新等诸多操作,可谓是以空间换时间

《Git分布式版本控制详解(1):基础介绍》

  图1-3 集中化版本控制系统

2、Git基础介绍

   1) Git思想和基本原理是直接记录快照,而非差异化比较。这与Subversion等其他版本控制系统原理有很大差别,也就是说,Git只关心文件数据是否发生变化,一旦检测到变化,就将文件直接做备份,而其他一些系统(如Subversion、CVS、Perforce等)每次关心并记录哪些文件有更新,都更新了什么内容,将更新的内容保存于补丁文件中,其他系统版本记录结构如图1-4所示。

 《Git分布式版本控制详解(1):基础介绍》

 图1-4 其他系统各版本文件记录的具体差异

  Git不保存文件的差异内容,而是将有变化的文件做一个快照(整个备份),然后保存该文件的索引,若文件没有变化,Git会在当前版本链接到上一版本的对应文件中,其版本记录结构如图1-5所示。 

《Git分布式版本控制详解(1):基础介绍》

 图1-5 Git系统各版本文件记录的具体差异

   2) 在Git中,文件有三种状态:① 已提交(committed),表示该文件已被安全地保存在本地数据库中了;② 已修改(modified),表示文件被修改但还未提交保存;③ 已暂存(staged),把已修改的文件放在下次提交时要保存的清单中。Git文件三个工作区域(Git工作目录、暂存区域、本地仓库)之间流转的状态如图1-6所示。

《Git分布式版本控制详解(1):基础介绍》

 图1-6 Git文件流转与工作区域之间的关系

 

二、Git基础

1、文件状态 

   1) 已跟踪文件:指被纳入版本控制管理的文件,上次快照中有他们的记录,工作一段时间后,状态可能为已修改、已放入暂存区或已更新。

   2) 未跟踪文件:指未纳入版本控制管理的文件,该种文件只有一个状态。

   Git文件状态变化周期如图1-7所示。

《Git分布式版本控制详解(1):基础介绍》

图1-7 Git文件状态变化周期

   $ git status命令查看工作目录文件状态:①Untracked files => 未跟踪 ②Changes to be committed => 已暂存等待提交 ③Changes not staged for commit => 已修改但未放入暂存区域。

   $ git add命令作用:①跟踪文件将文件添加至暂存区域合并时把有冲突的文件标记为已解决状态。执行git add后,会将文件放入暂存区域,对于未跟踪的文件,会额外标记并跟踪文件。

   将一个修改文件添加至暂存区域后再执行修改,此时若查看文件状态,会发现该文件会同时出现在暂存区域和已修改列表中,git提交时只会提交暂存区域中的版本,并非工作目录中的版本。

2、忽略文件.gitignore

   有时候工作目录中存在某些文件不希望被Git管理,如日志文件、bin文件等,可以在工作目录中新建忽略配置文件.gitignore并填入需要忽略的文件的正则表达式(每个表达式空一行)。

   忽略文件有两个模式:①开放模式,设置哪些文件或目录被过滤,如*.txt表示过滤所有以txt结尾的文件;②保守模式,设置哪些文件不被过滤,如!hans.txt表示文件hans.txt不被过滤。保守模式的优先级要高于开放模式,因此当一个项目中进希望Git管理某几个文件时,可先忽略所有文件,再设置对应文件不被过滤。一个.gitignore实际例子:

《Git分布式版本控制详解(1):基础介绍》
《Git分布式版本控制详解(1):基础介绍》

# 此为注释 – 将被 Git 忽略
*.a       # 忽略所有 .a 结尾的文件(开放模式)
!lib.a    # 但 lib.a 除外(保守模式)
/TODO     # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/    # 忽略 build/ 目录下的所有文件
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

View Code

 

点赞