1)GIT是分布式的。SVN不是:

这 是GIT和其它非分布式的版本号控制系统,比如SVN。CVS等。最核心的差别。优点是跟其它同事不会有太多的冲突。自己写的代码放在自己电脑上,一段时间后再提交、合并,也能够不用联网在本地提交。假设你能理解这个概念,那么你就已经上手一半了。须要做一点声明,GIT并 不是眼下第一个或唯一的分布式版本号控制系统。另一些系统。比如Bitkeeper, Mercurial等,也是执行在分布式模式上的。但GIT在这方面做的更好,并且有很多其它强大的功能特征。

GIT跟SVN一样有自己的 集中式版本号库或server。但。GIT更倾向于被使用于分布式模式,也就是每一个开发者从中心版本号库/server上chect out代码后会在自己的机器上克隆一个自己的版本号库。

可以这样说。假设你被困在一个不能连接网络的地方时,你仍然可以提交文件。查看历史版本号记录,创建项 目分支等。

2)GIT把内容按元数据方式存储。而SVN是按文件:

全部的资源控 制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。假设你把.git文件夹的体积大小跟.svn比較,你会发现它们差距非常大。因 为,.git文件夹是处于你的机器上的一个克隆版的版本号库,它拥有中心版本号库上全部的东西。比如标签,分支,版本号记录等。

3)GIT分支和SVN的分支不同:

分支在SVN中一点不特别,就是版本号库中的另外的一个文件夹。假设你想知道是否合并了一个分支。你须要手工执行像这种命令svn propget svn:mergeinfo,来确认代码是否被合并。

然而。处理GIT的分支却是相当的简单和有趣。

你能够从同一个工作文件夹下高速的在几个分支间切换。你非常easy发现未被合并的分支,你能简单而快捷的合并这些文件。

Git鼓舞分Branch,而SVN。说实话。我用Branch的次数还挺少的,SVN自带的Branch merge我还真没用过,有merge时用的是Beyond Compare工具合并后再Commit的;

4)GIT没有一个全局的版本。而SVN有:

眼下为止这是跟SVN相比GIT缺少的最大的一个特征。

5)GIT的内容完整性要优于SVN:

GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时减少对版本号库的破坏。

6)Git下载下来后。在本地不必联网就能够看到全部的log,非常方便学习,SVN却须要联网;

7)SVN在Commit前,我们都建议是先Update一下,跟本地的代码编译没问题,并确保开发的功能正常后再提交。这样事实上挺麻烦的,有好几次同事没有先Updata,就Commit了,发生了一些错误,耽误了大家时间,Git可能这样的情况会少些。

其它差别:

1。速度:

克 隆一份全新的文件夹。以相同拥有五个(才五个)分支来说,SVN是同一时候复製5个版本号的文件,也就是说反复五次相同的动作。而Git仅仅是获取文件的每一个版本号的 元素。然后仅仅加载基本的分支(master)。

在我的经验,克隆一个拥有将近一万个提交(commit),五个分支,每一个分支有大约1500个文件的 SVN,耗了将近一个小时!

而Git仅仅用了区区的1分鐘!

2。

版本号库(repository):

据我所知,SVN仅仅能有一个指定中央版本号库。当这个中央版本号库有问题时,全部工作成员都一起瘫痪直到版本号库维修完毕或者新的版本号库设立完毕。

而 Git能够有无限个版本号库。或者,更正确的说法,每个Git都是一个版本号库,差别是它们是否拥有活跃文件夹(Git Working Tree)。假设主要版本号库(比如:置於GitHub的版本号库)发生了什麼事,工作成员仍然能够在自己的本地版本号库(local repository)提交,等待主要版本号库恢复就可以。工作成员也能够提交到其它的版本号库!

3。

分支(Branch)

在SVN,分支是一个完整的文件夹。

且这个文件夹拥有完整的实际文件。假设工作成员想要开啟新的分支,那将会影响“全世界”!

每一个人都会拥有和你一样的分支。

假设你的分支是用来进行破坏工作(安检測试),那将会像传染病一样。

而 Git,每一个工作成员能够随意在自己的本地版本号库开啟无限个分支。

举例:当我想尝试破坏自己的程序(安检測试)。而且想保留这些被改动的文件供日后使用, 我能够开一个分支。做我喜欢的事。全然不需操心妨碍其它工作成员。仅仅要我不合并及提交到主要版本号库,没有一个工作成员会被影响。等到我不须要这个分支时, 我仅仅要把它从我的本地版本号库删除就可以。无痛无痒。

Git的分支名是能够使用不同名字的。比如:我的本地分支名為testing,而在主要版本号库的名字事实上是master。

最值得一提。我能够在Git的随意一个提交点(commit point)开啟分支。(当中一个方法是使用gitk –all 可观察整个提交记录,然后在随意点开啟分支。)

4。提交(Commit)

在SVN。当你提交你的完毕品时。它将直接记录到中央版本号库。

当你发现你的完毕品存在严重问题时,你已经无法阻止事情的发生了。

假设网路中断,你根本没办法提交!

而Git的提交全然属於本地版本号库的活动。而你仅仅需“推”(git push)到主要版本号库就可以。

Git的“推”事实上是在运行“同步”(Sync)。

5。又一次设立起点(Rebase)

我没在SVN尝试过。不知道有没有这种功能。

在 Git,假设你想把别人的最新提交设立為如今这个分支的起点,仅仅要运行git rebase branch_name 就可以。

这个和合并(merge)不同点是。merge会根据改动的时间视為最新,而Rebase会要求你去解决两方都有改动过的地方的矛盾 (conflict)。

A - B - E

\- C - D

A - B - E

\ - C - D

6。系统档案

SVN会在每个文件夹置放一个.svn。假设想移除这些.svn是非常累的。

而Git会在文件夹起点拥有一个.git文件夹,以及.gitignore。

对我而言。管理一个Git 的版本号库是非常easy的事。

以下有一篇文章这样讨论,楼主觉得SVN没什么用,我比較认同Ghoststears的观点。

有了GIT,SVN纯粹一垃圾

Ghoststears:

不论什么事情。归根结底都是人的问题,工具仅仅是工具。

SVN 是集中式的,会出现你说的耦合。

但从另外一个方面来说,这也要求开发者代码的规范:不要一个函数干非常多事情,不要一个文件写非常多个类。

另外,将不可执行的代码提交到不论什么版本号控制系统中都是没有意义的。这也就是版本号控制的核心思想之中的一个。

也就是提交的粒度:原子性。所谓的原子性。也就是完毕 一件任务,这个任务能够是一个函数声明。也能够是一个函数的实现。亦或是一个子系统。但这个任务的完毕的标志就是代码能够执行。不能执行的代码,最多也就 是完毕了半个任务。这个是不符合版本号控制思想的。

试想,你 update 到某一个 version 的时候,代码居然是不能执行的,是何心情???

将不能执行的代码提交,全然是开发者素养或者公司管理流程、机制的问题。

另外。非常多人都强调:我晚上下班了要在家里干活,不能提交!!

。来抨击集中式版本号控制工具。且不说对待工作和生活态度。

先看看国内的企业,防员工如防贼的多的去了。

有多少人能带着笔记本,把公司的源码签出来呢???

版本号控制系统中。工具仅仅是当中一环。要结合公司的策略来选用合适的工具。

版本号控制 != 版本号控制工具 !!!= 源码管理。

最后,人各有喜好。上纲上线的,全然没有必要。

參考:

http://blog.csdn.net/a117653909/article/details/8952183

http://wuzhangshu927.blog.163.com/blog/static/1142246872011621113641834/

http://www.cnblogs.com/qinfengxiaoyue/p/3450194.html

git和SVN的差别的更多相关文章

  1. [git/svn]Git和SVN差异

    转自:http://blog.csdn.net/huacuilaifa/article/details/19124635 在参加百度的开源项目时接触到Git,后来又陆续在微博上看到很多宣扬Git为程序 ...

  2. 详细透彻解读Git与SVN的区别(集中式VS分布式)

    Git是目前世界上最先进的分布式版本控制系统,其实 Git 跟 SVN一样有自己的集中式版本库或服务器,但是Git 更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect ou ...

  3. git与svn的不同

    假设你在读这篇文章,说明你跟大多数开发人员一样对GIT感兴趣,假设你还没有机会来试一试GIT,我想如今你就要了解它了. GIT不不过个版本号控制系统,它也是个内容管理系统(CMS),工作管理系统等.假 ...

  4. GIT → 02:Git和Svn比较

    2.1 SVN介绍 2.1.1 SVN简介 SVN 属于集中式版本管理控制系统,服务器中保存了所有文件的不同版本,而协同工作人员通过连接svn服务器,提取出最新的文件,获取提交更新.Subversio ...

  5. GIT和SVN之间的区别及基本操作对比

    1)GIT是分布式的,SVN不是: 这是GIT和其它非分布式的版本控制系统,例如 SVN,CVS等,最核心的区别.如果你能理解这个概念,那么你就已经上手一半了.需要做一点声明,GIT并不是目前第一个或 ...

  6. GIT和SVN之间的五个基本区别

    GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等.如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征.所以,这篇文章的主要目的就是 ...

  7. iOS开发——源代码管理——git(分布式版本控制和集中式版本控制对比,git和SVN对比,git常用指令,搭建GitHub远程仓库,搭建oschina远程仓库 )

    一.git简介 什么是git? git是一款开源的分布式版本控制工具 在世界上所有的分布式版本控制工具中,git是最快.最简单.最流行的   git的起源 作者是Linux之父:Linus Bened ...

  8. GIT与SVN的区别

    1.GIT是分布式的,SVN不是: 这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别.如果你能理解这个概念,那么你就已经上手一半了.需要做一点声明,GIT并不是目前第一个或唯 ...

  9. 蒋鑫:为什么 Git 比 SVN 好

    在版本控制系统的选型上,是选择Git还是SVN? 对于开源项目来说这不算问题.使用Git极大地提高了开发效率.扩大了开源项目的参与度. 增强了版本控制系统的安全性,选择Git早已是大势所趋. 但对于企 ...

随机推荐

  1. MySQL----示例知识点整理

    示例语句: ),hour(c.created_at) from `behavior_client_view` c join `behavior_share` s on c.share_uuid=s.u ...

  2. 【PAT】1009. 说反话 (20)

    1009. 说反话 (20) 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串.字符串由若干单词和若干空格组成,其 ...

  3. day4 迭代器与生成器解析

    一.迭代器 迭代器是访问集合元素的一种方式.其实迭代器就是一种列表,只是访问集合元素的时候比较特殊,具有一些特定功能,记忆功能,能够记住用户上一次的状态.迭代器是访问集合元素的一种方式.并且,迭代器只 ...

  4. 开源IDS系列--snorby 2.6.2 undefined method `run_daily_report' for Event:Class (NoMethodError)

    rails runner "Event.run_daily_report"测试邮件配置undefined method `run_daily_report' for Event:C ...

  5. oracle chr(38) 和 ascii('&') 函数

    oracle chr(38) 和 ascii('&') 函数 select chr(38) from dual; select ascii('&') from dual;

  6. 【WPF】自定义控件之远程图片浏览

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...

  7. Scrapy 笔记(二)

    一个scrapy爬虫知乎项目的笔记 1.通过命令创建项目 scrapy startproject zhihucd zhihuscrapy genspider zhihu www.zhihu.com(临 ...

  8. 【转载】Xutils3-Dbutils

    Github源码地址:https://github.com/wyouflf/xUtils3 下面是源码中sample关于Dbutils的使用代码: import android.view.View; ...

  9. Django+Nginx+uwsgi搭建自己的博客(五)

    在上一篇博文中,向大家介绍了Users App和Index的前端部分的实现,以及前端与Django的通信部分.至此,我们的博客已经具备一个简单的雏形,可以将其部署在本地的服务器上了.目前较为流行的we ...

  10. 2017/11/6 Leetcode 日记

    2017/11/6 Leetcode 日记 344. Reverse String Write a function that takes a string as input and returns ...