svn git

来源:互联网 发布:阿里云服务器ping不通 编辑:程序博客网 时间:2024/05/18 02:01

 Subversion是一个自由,开源的版本控制系统。在Subversion管理下,文件和目录可以超越时空。与CVS, Subversion 等不同的是Git采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。究竟哪个更好些呢?

Subversion 属于集中式的版本控制系统

●每个版本库有唯一一个“官方地址”,每个用户都从这个唯一地址获取代码、数据;

●获取代码库的更新,也只能连接到这个唯一的代码库,同步以取得最新数据;

●提交必须有网络连接(非本地版本库);

●提交需要授权,如果没有授权,提交失败;

●提交并非每次都能够成功。如果有其他人先于你提交,会提示“改动基于过时的版本,先更新再提交”… 诸如此类;

冲突解决是一个提交速度的竞赛:手快者,先提交,平安无事;手慢者,后提交,可能遇到麻烦的冲突解决。

Git属于分布式的版本控制系统

●众生平等,每个检出(checkout)的版本库,或者更准确的说每个克隆(clone)的版本库都是平等的;

●你可以从任何一个版本库的克隆来创建属于你自己的版本库,同时你的版本库也可以作为源提供给他人,只要你愿意;

●获取版本库的更新,可以来自任何源;

●你可以从张三那里获得上游的改动,包括张三自己的提交;你也可以从李四那里获得上游的改动,也可能包括李四的提交;

●提交完全在本地完成。无须别人给你授权,你的版本库你作主;

●当然你在你的版本库中的改动是否别人愿意合并到他们的版本库则是另外的一回事了;

●提交总是会成功,因为提交是在本地进行的么;

●甚至基于旧版本的改动也可以成功提交,提交会基于旧的版本创建一个新的分支 ;

●冲突解决不再像是SVN一样的提交竞赛,而是在需要的时候才进行合并和冲突解决 ;

●Subversion的提交竞赛,在多人协作开发时,提交经常被打断;

●Git的每个用户就好像工作在独立的 Feature Branch(功能分支)中 ;

●Git的提交不会被打断,直到你的工作完全满意了,PUSH给他人或者他人PULL你的版本库;

●合并会发生在PULL和PUSH过程中,不能自动解决的冲突会提示您手工完成;

●Git也可以模拟集中式的工作模式;Subversion只有一种集中式的工作模式;

●所有人都和服务器同步,提交直接到服务器上;

●Git也可以模拟集中式的工作模式 ;

●Git版本库统一放在服务器中;

●可以为 Git 版本库进行授权:谁能创建版本库,谁能向版本库PUSH,谁能够读取(克隆)版本库;

●团队的成员先将服务器的版本库克隆到本地;并经常的从服务器的版本库拉(PULL)最新的更新;

●团队的成员将自己的改动推(PUSH)到服务器的版本库中,当其他人和版本库同步(PULL)时,会自动获取改变;

●Git 的集中式工作模式非常灵活;

●你完全可以在脱离Git服务器所在网络的情况下,如移动办公/出差时,照常使用代码库;

●你只需要在能够接入Git服务器所在网络时,PULL和PUSH即可完成和服务器同步以及提交;

●Git提供rebase命令,可以让你的改动看起来是基于最新的代码实现的改动;

●Git有更多的工作模式可以选择,远非 Subversion可比。

SVN VS git 
一,集中式 VS 分布式 
SVN是典型的C/S模式的集中式管理。客户端直接对服务端做各种操作。而git则大不相同,他是分布式的,而且我们使用git命令大多数时候,只是在本地进行操作。当本地的内容完成以后,才使用push这样的命令把他推送到服务器上的库中。 

二,增量存储 VS 快照 
SVN在保存文本文件的时候,如果产生一个新版本,那么存储的只是两个版本的差异。而git的则是每个版本的快照。这一点来看,SVN能节省空间,但是git则更方便存取文件。 

三,SVN分支 VS git分支 
SVN的分支,仅仅是一个URL拷贝。在处理分支合并的时候,效率不高。git的分支则更加方便,任何一分支的创建,仅仅是保存一个41字节的指针而已。我们来看看SVN的分支创建: 

Shell代码  收藏代码
  1. $svn copy file:////repos/idp/trunk  file:///epos/idp/branches/mybranch  

从上面的语句可以看出,SVN的分支就是一个hard link的目录。 
再来看看git的分支。 
Shell代码  收藏代码
  1. $git branch mybranch  

在git中,创建分支是很廉价的,并且,对于分支的合并也是很容易。git 希望用户可以多使用分支。这里,如果要切换到分支,在git中使用 
Shell代码  收藏代码
  1. $git checkout mybranch  
就可以了。 

四,全局版本 VS 全球版本 
SVN的版本号应该叫修订版本号。因为他是针对一次提交,并不是某个文件的版本。并且以数字来作为版本号,递增。git的版本号 是一串SHA-1 散列的字符串。这个散列是针对文件内容,并且发生碰撞的几率可以是微乎其微。即使全球的人一起工作,也很难产生一个冲突。 

五,记录一切 VS 回滚 
SVN是一部时光机,错了就错了,不可能得到完美的回滚或撤销(使用一些很变态的手法,也许可以达到这个目的)。git 支持回滚。如果要删除提交: 
Shell代码  收藏代码
  1. $git revert HEAD  

注意这里本地(工作区)的修改并没有改变。 

六、无处不在的.svn  VS .git 
为了管理版本,SVN在每个Working copy的目录中都隐藏了一个.svn目录。而对于git来说,所有的库信息都在 .git目录里了,仅此一个,自然也就很大很大。 

七,集中管理 VS 处处备份 
SVN的权限管理,可以针对不同用户授予不同权限。而git只有读与写权限。要么可读,要么可写,任何用户有读权限,就可以下载整个库。实际上,也可以通过各种配置,使得git也可以支持权限控制到各个目录(SSH,web)。不过这些配置会相对麻烦一些。而每一个git的工作拷贝都可以看成是一份备份,这个对于开源项目来说也是不错的选择。 

八,直接提交 VS 合并提交 
由于SVN的模式,开发者可以独立的提交。而git开发者的提交,只是在本地的库。对于push操作,则是必需要谨慎的。这里,push并不会自动合并,所以每一次提交后,再次提交的必需通过fetch(不合并),pull(合并)下最新的数据后,合并再push。这样就有很多工作方式了。

原创粉丝点击