由于要换工作,新公司使用的是GIT,而以前只使用过ClearCase 和 svn,因此GIT的学习迫在眉睫。
有关版本控制系统的基本概念,这里就不介绍了。但是为了方便使用过svn的人理解git,还是有必要介绍下集中式版本控制系统和分布式版本控制系统的概念。
集中式版本控制系统有哪些?这里先告诉大家,svn、cvs都属于集中式版本控制系统。使用过SVN的人都应该知道,这类系统有以下显著的特点:(1)都有一个单一的集中管理的服务器,保存所有文件的修订版本,软件工程师都通过客户端连接到这台服务器,取出更新的文件或者提交自己的更改。这类系统的缺点显而易见,那就是过于依赖网络和中心服务器。一旦网络不通,就无法提交更改的代码;一旦服务器发生故障,软件工程师就无法协同工作。最糟糕的情况是,假如中央服务器的磁盘发生故障,并且没有及时备份,可能导致丢失数据的风险。这种风险有可能直接导致项目的完整性遭到破快,协同工作难度加大。
由于集中式控制系统的前述缺点,分布式版本控制系统应运而生。GIT就是其中一种。客户端并不只是提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。
为了快速的理解git的使用,我们从本地的一个工作流程开始分析。
一般我们在使用svn时,都是先从中心服务器那里下载(svn update)一个最新版本库到本地。然后你在本地修改。修改以后,如果网络是正常的,你就可以提交到中心服务器。在提交之前,你可以使用svn diff 查看,本地作了哪些改动。确定改动无误后,再使用svn ci -m "commit" XXX.cpp 提交代码。这个流程也是一个典型的集中控制式服务流程。
使用GIT时,一般都是先从已有的git仓库克隆出一个新的镜像仓库到本地。如果git仓库还不存在,需要从头开始使用git管理项目,可以通过导入所有文件来创建新的git仓库。svn 也是类似的。从这方面来讲,git的使用和svn是类似的。
接下来,你可能希望使用git来提交你的更改,或与其他人协同工作,达到同步或更新。
这里,我们先作个对比。前面提到,svn 实际上只有本地修改状态和版本控制状态。你只有把本地修改提交到服务器上了,你的更改才是真正在项目中生效的。git呢?有哪些状态?我们将会看到,git相比svn,多了一个暂存的状态。
在Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。
已提交表示该文件已经被安全地保存在本地数据库(.git仓库)中了,即将快照index里临时存储的内容被永久的提交到了git仓库版本控制库中;
已修改表示本地修改了某个文件,但还没有提交保存,也就是说,文件的修改还只是在working tree中了;
已暂存表示把已修改的文件放在下次提交时要保存的清单中,也就是说文件保存到了index快照中了,index被当作一个本地的临时存储区域。
由此我们看到Git 管理项目时,文件流转的三个工作区域:Git 的本地数据目录(.git仓库),工作目录以及暂存区
域(快照,也叫索引index)。
每个项目都有一个git 目录,它是Git 用来保存元数据和对象数据库的地方。该目录非常重要,每次克隆
镜像仓库的时候,实际拷贝的就是这个目录里面的数据。
从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作目录。这些文件实际上都是从git
目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对这些文件进行编辑。
所谓的暂存区域只不过是个简单的文件,一般都放在git 目录中。有时候人们会把这个文件叫做索引文
件,不过标准说法还是叫暂存区域。
基本的Git 工作流程如下所示:
1. 在工作目录中修改某些文件。
2. 对这些修改了的文件作快照,并保存到暂存区域。一般使用git add命令将修改的文件保存到快照中。
3. 提交更新,将保存在暂存区域的文件快照转储到git 目录中。使用git commit命令提交自己的开发成果。
所以,我们可以从文件所处的位置来判断状态:如果是git 目录中保存着的特定版本文件,就属于已提交状
态;如果作了修改并已放入暂存区域,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区
域,就是已修改状态。。