Git 和 SVN 的主要差异:
. git 文件数据的整体是否发生变化,而svn这类版本控制系统文件内容的具体差异。
这类系统(如SVN)每次记录有什么文件做了更新,以及更新了那些行的内容,然而GIT并不保存这些前后变化差异的数据。实际上,Git 更像是把变化的文件做快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件做一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,git 不会再次保存,而是对上次保存的快照做一连接。
个人理解:Git 并不像SVN 一样在每次提交的时候都将更新的详细信息都分析并提交,这是很科学的。因为我们有90%的时候不会闲着去查看每一个文件都做了哪些更新,特别是模块化开发时,哪些不是我们开发的模块,因为Git会在本地保存完整的历史版本库,有是个用户共同开发就有十个这样的库,这样做的话会出现非常多的冗余数据。但在SVN 上这样还是科学的。因为只有SVN服务器上保存着唯一的一份历史版本库,当然越详细越好。但是当遇到那10%的时候,我们想要查看一下某个文件与昨天的版本相比的更新变动信息。Git 会取出一天前的快照和当前的文件做一次差异运算,显示出更新变动信息。
.在Git中的绝大多数操作都只需要访问本地文件和资源,不必联网就可以看到所有的历史版本记录,而SVN却需要联网。因为Git在本地磁盘上就保存着所有当前项目的历史更新,所有处理起来速度飞快。但我们需要浏览项目的历史更新摘要,Git不用跑到外面的服务器上取数据回来,而是直接从本地数据库读取后展示给你看。如果你想要看当前版本的文件和一个月前的版本之间有何差异,Git会取出一个月前的快照和当前文件做一次差异运算。
.SVN 断开网络或者断开VPN就无法commit代码,但是Git可以commit到本地仓库。用svn的话,没有网络或断开VPN 时,你当然可以继续本地开发,但是无法COMMIT 代码,因为svn每次commit 都必须联网。长时间不commit代码会丢失大量开发进程的历史记录。有个比喻是,不能commit 就像word 写文档不能save 一样危险。而且有网络的情况下每一个commit都会花上数秒甚至更长时间。但Git的话,就算在飞机或者火车上,都可以非常愉快的频繁提交更新,因为是在本地仓库commit所以几乎不需要时间,而且commit 一定要频繁,不然无法记录你的改动。如果你一天commit一次,中间的修改你就找不回来,然后等着有网络的时候在将版本记录和代码一起上传到远程仓库。
.Git 的内容完整性要优于SVN。因为Git在commit(存储在本地)或者push(上传到远程仓库)之前,通过对文件的内容和目录的结构计算出一个sha_1哈希值,作为指纹字符串进行内容的校验。并将结果作为数据的唯一标识和索引。在远程仓库接收到commit的文件后,会再计算一遍哈希值然后跟传递过来的哈希值做比较。如果不一致,说明文件在传输时变得不完整。或者磁盘损坏导致文件数据的损坏。另外在Git数据库中的东西都是用哈希值做为索引,而不是用文件名。
.Git克隆一个完整项目的速度非常快,svn 非常慢。我们以克隆一份拥有五个分支的完整项目已经版本库来说,svn同时复制5个版本的文件。也就是说重复五次同样的操作。而Git只是获取文件的每个版本的元素。然后只载入主要的分支。(master)在我的经验,克隆一个拥有将近一万个提交(commit),五个分支,每个分支大约1500个文件的svn,耗了将近一个小时。而Git只用了区区1分钟。
.其中最主要的区别是在于git上的分支比svn上的强大。下面具体介绍分支费概念。
分支是什么:
在svn这类的版本控制系统上,分支(branch)是一个完整的目录,而这个目录拥有完整的实际文件。如果工作成员想要开启新的分支,那么会影响全世界,每个人都会拥有你一样的分支。如果你的分支是用来对系统模块进行安全检查测试的,那会想传染病一样,你改一个分支,还得让其他人重新切分支重新下载。而且这些代码很可能对稳定版本还是具有破坏性的。
在git 上,每个工作成员可以任意在自己的本地版本库开启无限个分支。举例,当我想尝试破坏自己的程序(安检测试),并且想保留这些修改的文件供日后使用,我可以开一个分支,做我喜欢的事。完全不需担心妨碍其他工作成员。只要我不合并及提交到主要版本库,没有一个工作成员会被影响。等到我不需要这个分支时,我只要把它从我的本地库删除即可,无痛无痒。
项目开发什么时候需要创建一个分支:
举个例子:我们需要开发一个新的网站,我们已经在主分支(master分支)上开发出1.0发布版本,这个时候我们需要开发某个新的功能模块,那就需要创建一个分支(Dev分支),而不是在主分支上继续开发,这样做有两个好处:
.我们在开发新的模块时,可能遇到各种bug或者冲突,如果我们在主分支上开发,万一冲突很严重,造成当前稳定版本的分支出问题,就会很麻烦。如果主分支始终保留着最新的稳定版本,在新的分支上开发,冲突严重时,最多也就是把当前分支删掉,从哪个稳定分支重新分一个出来。这样处理起来就方便了。而且分支还可以保留开发中可能出现的各种bug方便修复不影响主分支多的使用。
.当我们需要切换分支,例如切换到主分支的时候,会保存当前分支(Dev)的状态,以便日后继续开发,防止丢失开发进度。几个例子:你突然接到一个电话说1.0发布版本有个严重的问题需要紧急修补,而我们在dev分支上开发新的功能模块,这时我们要返回到主分支,为这次紧急修补建议一个新分支(repair分支),并在其中修复问题。通过测试后,回到主分支,将repair分支合并进来,然后push到远程仓库。最后,我们切换到之前开发新需求的dev 分支。继续工作而不丢失已经开发的进度。
我们可以在git上任意一个提交点(commit point )开启分支,(其中一个方法是使用 gitk -all 可观察整个提交记录,然后任意点开启分支)
GIT 具有以下特点:
.git中每个克隆(clone)的版本库都是平等的,可以从任何一个版本库克隆来创建属于自己的版本库,同时你的版本库也可以做为原提供给他人,只要你愿意。
.git的每一次提交操作,实际上是一次对代码仓库的完整备份。
. 提交完全在本地完成,无须别人给你授权,你的版本库你做主,并且提交总是成功的。
.git的提交不会被打断,直到的工作完全满意了,PUSH给他人或者他人pull你的版本库,合并会发生在pull 和 push 过程中,不能自动解决的冲突会提示你手工完成。
git 的缺点:
.git 没有严格的权限管理限制,一般通过系统设置文件读写权限的方式来做权限控制。
.工作目录只能是整个目录。比如checkout,建分支,都是基于整个目录的。而svn可以基于项目中的某一个目录。
链接:
http://www.360doc.com/content/17/0215/15/17572791_629200608.shtml