GIT使用入门
Part 1
第一章基本原理
git是一个版本控制系统。官方的解释是:版本控制(Revision control)是一种软
件工程技巧,籍以在开发的过程中,确保由不同人所编辑的同一档案都得到更新。按我的白话文解释就是:一志同道合的人身处祖国各地,希望来合作开发一个
项目,假设这个项目是使用c语言写的(当然用任何语言都可以的)。那么大家怎么合作呢?用信件?效率太低。用邮件,不好实现多人沟通。用google
group吧,可开发阶段中的源代码没法科学管理。用自建的网站吧,需要人力物
力财力来支撑阿。
这个时候版本控制系统就派上用场了。它可以让一个团队里的不同的人在不同地点、不同时间开发和改进同一个项目,并且在大部分的时间里,版本控制系统会聪明的帮你把不同的人在不同地点不同时间修
改的代码融合到项目中去。(当然在一些特殊的情况,还是需要人去决定到底哪些代码需要加入到项目中,这个在后面讨论不迟,先让大家对版本控制有一个好印象,呵呵)
知道了版本控制系统的优点之后,下面就要具体实践和体验了。建议你选用的版本控制系统包括:
rcs,cvs,svn,git,Mercurial,Bazzar等等。
当然git,Mercurial和Bazzar都是属于分布式版本控制系统。
下面是一些网友对于这些版本控制系统评论的只言片语:
1)svk配合svn可以实现分布式的版本控制。
2) 我是从SVN转到Git下的。我想Git的优势是速度飞快,谁用谁知道!
3) git的确是最快的,bzr慢的要死
4) SVN 在windows 下有TortoiseSVN
5) git 有Windows 版本,在google code 上的项目。le/p/msysgit/
6) 大家可以试试国内提供的git服务。www.githost
那么,简单地说,Git 究竟是怎样的一个系统呢?请注意,接下来的内容非常重要,若是理解了Git 的思想和基本的工作原理,用起来就会知其所以然,游刃
有余。在开始学习Git 的时候,请不要尝试把各种概念和其他的版本控制系统诸如Subversion 和Perforce 等相比拟,否则容易混淆每个操作的实际意义。Git 在保存和处理各种信息的时候,虽然操作起来的命令形式非常相近,但它与其他版本控制系统的做法颇为不同。理解这些差异将有助于你准确地使用Git 提供的各种工具。
直接快照,而非比较差异
Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。这类系统(CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容,请看图1-4。
图1-4. 其他系统在每个版本中记录着各个文件的具体差异
Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快
照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,
若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一连接。Git 的工作方式就像图1-5 所示。
图1-5. Git 保存每次更新时的文件快照
这是Git 同其他系统的重要区别。它完全颠覆了传统版本控制的套路,并对各个环节的实现方式作了新的设计。Git 更像是个小型的文件系统,但它同时还提供了许多以此为基础的超强工具,而不只是一个简单的VCS。稍后在第三章讨论Git 分支管理的时候,我们会再看看这样的设计究竟会带来哪些好处。
git常用指令近乎所有操作都可本地执行
在Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网。但如果用CVCS 的话,差不多所有操作都需要连接网络。因为Git 在本地磁盘上就保存着所有有关当前项目的历史更新,所以处理起来速度飞快。
举个例子,如果要浏览项目的历史更新摘要,Git 不用跑到外面的服务器上去取
数据回来,而直接从本地数据库读取后展示给你看。所以任何时候你都可以马上翻阅,无需等待。如果想要看当前版本的文件和一个月前的版本之间有何差异,
Git 会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较。
用CVCS 的话,没有网络或者断开VPN 你就无法做任何事情。但用Git 的话,就算你在飞机或者火车上,都可以非常愉快地频繁提交更新,等到了有网络的时候再上传到远程的镜像仓库。同样,在回家
的路上,不用连接VPN 你也可以继续工作。换作其他版本控制系统,这么做几乎不可能,抑或非常麻烦。比如Perforce,如果不连到服务器,几乎什么都做不了(译注:实际上手工修改文件权限改为可写之后是可以编辑文件的,只是其他开发者无法通过Perforce
知道你正在对此文件进行修改。);如果是Subversion 或CVS,虽然可以编
辑文件,但无法提交更新,因为数据库在网络上。看上去好像这些都不是什么大问题,但在实际体验过之后,你就会惊喜地发现,这其实是会带来很大不同的。
时刻保持数据完整性
在保存到Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。换句话说,不可能在你修改了文件或目录之后,Git 一无所知。这项特性作为Git 的设计哲学,建在整体架构的最底层。所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git 都能立即察觉。
Git 使用SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个SHA-1 哈希值,作为指纹字符串。该字串由40 个十六进制字符(0-9 及a-f)组成,看起来就像是:
24b9da6552252987aa493b52f8696cd6d3b00373
Git 的工作完全依赖于这类指纹字串,所以你会经常看到这样的哈希值。实际上,所有保存在Git 数据库中的东西都是用此哈希值来作索引的,而不是靠文件名。
多数操作仅添加数据
常用的Git 操作大多仅仅是把数据添加到数据库。因为任何一种不可逆的操作,比如删除数据,要回退或重现都会非常困难。在别的VCS 中,若还未提交更新,就有可能丢失或者混淆一些修改的内容,但在Git 里,一旦提交快照之后就完全不用担心丢失数据,特别是在养成了定期推送至其他镜像仓库的习惯的话。
这种高可靠性令我们的开发工作安心不少,尽管去做各种试验性的尝试好了,再怎样也不会弄丢数据。至于Git 内部究竟是如何保存和恢复数据的,我们会在第九章的―幕后细节‖部分再作详述。
三种状态
好,现在请注意,接下来要讲的概念非常重要。对于任何一个文件,在Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。
已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。
由此我们看到Git 管理项目时,文件流转的三个工作区域:Git 的本地数据目录,工作目录以及暂存区域。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论