简记git与svn

svn与git是目前比较主流的版本控制系统,在这里简单记录一下它们之间的异同。

一,从架构来说,SVN是集中式,git是分布式。

集中式的优点是代码高度统一,缺点也很明显就是非常依赖于中央服务器。如果服务器宕机或者本地无法联网,那么你将无法提交更新、还原、对比等,也就无法协同工作。同时SVN上的提交也并非是每次都成功,如果有一个人在你提交的时候先提交,那么就会提示你先更新再提交。SVN原理上只关心文件内容的具体差异,每次记录有哪些文件做了更新并且更新了哪些内容。

而分布式的git会在本地克隆一个自己的版本库,在无法联网的时候,依然能够提交文件,查看历史版本记录等。Git中每个版本库都是平等的。与SVN不同,Git只关心文件数据的整体是否发生变化,Git并不保存文件内容前后变化的差异数据,更像是把变化的文件作快照后记录在一个微型的文件系统中(为提高性能,没有变化的文件不会再次保存)。

二,版本库与工作区的差异

SVN的版本库与工作区是分离的。工作区在你本地检出的那个目录,它是一份版本库在某个历史状态下的快照。SVN的工作区中每个目录下都包含一个名为.svn的控制目录(隐藏目录)。

git的版本库与工作区在同一个目录下,工作区的根目录有一个.git的子目录。git的工作区必须要有.git目录,它是用来保存元数据和对象数据库的地方,并且Git的工作区下只有一个.git目录,此外再无任何控制目录,如果删除它,则破环了整个历史,版本库也永远失去了。(可以在工作区之外克隆一个版本库,并且经常把提交push到里面,这样就实现了数据备份。)

三,SVN采用全局版本号,且是连续的。Git是通过对文件的内容或目录的结构计算出一个哈希值,是40为的十六进制字符串,它是全球唯一的。

四,SVN可以部分检出,而git只能全部检出。

五,SVN的更新可以使工作区和版本库保持一致,git上通过git fetch(fetch将远程数据库的object拷贝到本地)和git pull(pull相当于fetch+merge)来完成远程更新任务。

六,提交与分支

SVN里的分支就是一个子目录,和普通的路径没有什么本质的区别。而git的分支仅是一个文件,所以你可以在同一个工作目录下快速的在几个分支间切换。git的分支是完全隔离的。SVN的提交是单线索的,它的提交链只有一条。Git的提交是多线索,提交链可以有多条。

在svn中,你无法去撤销提交,只能在后续的提交中修正。SVN有一个特性是它的信息从不丢失,即使删除了,也可以在早期版本中找到。

Git的代码库属于个人,允许任意修改。Git通过git reset -hard可以永远丢弃最新的一个或几个提交。

总结:

SVN逻辑明确,符合一般人思维习惯;易于管理,集中式服务器更能保证安全性;代码一致性非常高;适合开发人数不多的项目。缺点是,服务器压力太大,数据库容量暴增;如果不能连接到服务器上基本不可以工作。

Git适合分布式开发,强调个体;公共服务器压力和数据量都不会太大;离线工作;任意两个开发者之间很容易解决问题。缺点是,学习周期较长,代码保密性差。