文档章节

评《GIT和SVN之间的五个基本区别》

M
 Mr_Anarchy
发布于 2014/03/31 18:07
字数 1689
阅读 7704
收藏 17
点赞 7
评论 11


原文链接http://www.oschina.net/news/12542/git-and-svn,首先说明,我没看英文原版,因为就我目前来说,自认为没这个需要了。好吧,我承认其实是犯懒。。。

下面我结合自身体会,逐条评论一下:

1.GIT是分布式的,SVN不是:

这一点绝对是最最关键的重点,与原作者不同,我要特别强调的是这一点对身处大陆的码农们的重要性。为什么?因为人家老外下全套android源码要几个小时,而我们要十几二十个小时,甚至好几天,还会不停断线!

分布式的最大好处,在于当你要切换不同的提交,不同的分支时,不再需要联网。试想一下,要是googleandroid源码用svn(这个是纯假设,实际上是完全不可行的,后面会提到),本来在大陆下一次代码就够慢的了,要是每天再切个几次分支和提交,那就别活了。所以在这一点上,我不说git完爆svn,应该说是分布式完爆非分布式。

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

说实话,我没看出来原文列第二点出来是为了说明什么。这确实是个区别,但一般用户是不需要了解的。

看到评论中有人提到了提交冲突的问题。真发生了大规模冲突,不管git还是svn,都是挺让人感到头疼的,两者对冲突的解决办法也是差不多的。个人见解,冲突是靠良好的团队管理和项目分工来尽力避免的,但真发生了,解决起来都差不多,也没见哪个版本控制系统是以解决冲突效率高作为卖点的。当然不存在冲突的版本管理系统也有,VSS嘛,往前推个10年,中兴全公司都在用呢,呵呵~

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

分支确实是一个重点,只不过原文没说到点子上,不过看文章是挺久之前的,可能那时候git还没现在这么普及(当然现在国内也未必有多普及),也情有可原吧。

这里我就说最关键的一点,你可以看完整的android代码,如果没有,可以用git clonelinux的完整代码库,然后用git branch -r命令看看,你会发现有几十个甚至近百个分支,如果你只用svn的话,你一定完全无法想象。但这就是git分支的优势,因为git是基于差异来管理分支的,其分支的代价极小,再结合第一点,所以其切换分支也极为方便和快捷。这一点上我认为git是优于svn的,之所以我不说完爆,是因为这一点要结合项目需求,你的项目不是android,不是linux,没有大量分支并行开发、合并的需求,其实用svn也是可以的。但用git,你可以为一个单独的小功能拉分支,为一轮完整的测试拉分支,为你的每一个客户单独拉分支,等等等等,基本上是想拉就拉,这一点svn应该是比不上的。

至于原文提到的合没合并的问题,svn我不常用,git下用git log命令,加上--graph参数,再配合--oneline--color,我觉得是很方便直观的。

4. GIT没有一个全局的版本号,而SVN有:

原文承认这一点不如svn,我也承认,但要补充说明一下,git每次提交产生的40位(160bit)哈希值,是完全可以等同于svn全局id的作用的,之所以说不如,只是因为不好记而已。

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

完整性这一点git要优于svn这是事实,虽然我个人不论git还是svn,都没碰到过这类问题。

反正对于git,每个克隆都是个完整的库,只要有一个克隆在,服务器被雷劈了都不怕,有点狡兔三窟的味道。当然,我这里说的跟原文说的已经不是一回事了。

 

看到有评论说git鼓励人们拉分支,这完全就是本末倒置了。事实是,git在分支这一点上优势巨大,所以当项目有大量分支的需求时,自然git就脱颖而出了。这也是为什么androidlinux用不了svn的原因。至于说svncommit是一种主动责任,稍微用点脑子想想,可能存在一个版本控制系统,不需要程序员承担所谓的主动责任么?无非在VSS里面,是checkout/checkin,在svn里面是commitgit又把svncommit拆分成了commitpush两步而已。该评论实在是过于主观,误导倾向太重。

最后说说git的不足,结合项目经历,个人认为最大的是两点,第一,图形界面支持差,git本身是纯命令行的,图形化的界面也从来不是git的开发目标之一,所以虽然有第三方开发了图形界面支持,但这始终是git的短板;第二,git本身是不支持基于目录的鉴权认证的,我有碰到过几个boss挺在意这个的,虽然也有插件能解决这个问题,但我没用过。gitlinux之父专门为了linux内核源码而开发设计的,人家不在意这两点,也完全可以理解。

选择版本控制工具,要结合各方面的因素,我反正也见过一群中兴出来开公司的老古董,到今天都还在坚持vss的。我只能说git是我用下来感觉最方便,功能最强大的(本人开发环境是纯linux,写代码看代码用vim,工作内容有涉及跨平台,但vs之类的ide环境仅仅用来编译一下而已)。如果你的项目很“linux”的话,那我实在找不到不用git的理由。你只要想一想,天才如Linus者,会搞出个不如svn的东西来跟自己过不去么?

 


© 著作权归作者所有

共有 人打赏支持
M
粉丝 1
博文 1
码字总数 1689
作品 0
浦东
项目经理
加载中

评论(11)

郑彬
郑彬
同理有一些感觉,我一直在公司内部搞配置管理,Git确实火了好几年时间了,但是却找不到公司切换Git的理由,一个权限就搞死。分布式功能,在企业中确实意义不大,即使有分公司办公室,也是通过VPN隧道解决,再说,回家干活,几个公司愿意员工这么干呢?
所以在国内,用git的基本处于开源,或者对公司源码管理无太多在意需求的。
b
blankman
看了十数篇 SVN 和 Git 的对比文章,基本没有把 SVN 摸透的,然后就开始列举 Git 有而 SVN “没有”的特性,唉~~~
陈少鑫
陈少鑫

引用来自“penguin_ku”的评论

感觉楼主不过另一个小愤愤的存在。说话也不客观。
第一,你都没玩过SVN,所以,我也就醉了。
第二,下载linux、下载android源码,拜托,这两个项目是git的典型适用场景,你用git的典型场景来说svn的不胜任,你干脆找个网站来说mongodb完虐sqlserver更霸气点。
第三,那个数据存储的那个。我不知道你到底有没有具体捣鼓过。svn是增量存储,git是副本存储。当然,这里的差异被你一笔带过,也还好,得益于硬盘的廉价,大家也就关注不到这里了。不过,你这样避重就轻真的好么?
第四,你接下来讨论的啥分支,全局版本号等等,都要在存储的原理上去讨论的,你根本就避开了上面哪一点,所以这里你纯粹就在信口开河,想到哪说道哪。
最后,你的那个git的完整性的呢,这个是git与svn的区别,但说优点的话,就两谈了,有好处有坏处。另外,你竟然举例服务器被雷劈了,够YY的。大点的公司服务器都是热备的,甚至还要加上地理容灾的。你举例服务器被雷劈了,你怎么不去关注git在权限管理方面的问题呢。

总之,楼主其实对git根本不深入,对svn完全不懂。所以,纯粹瞎写,还另开一篇,我也是醉了。

对于公司项目来说,SVN更契合需求,对于开源社区的情形,GIT更契合需求。商业软件可不希望大家没事一堆分支,半年不与服务器同步。
太他妈的严重同意了! svn用了9年了,但对于git这东西一直处于了解状态; 很想为自己找个git能代替svn的理由,但一直没找到, 因为我一直都是以管理公司项目为出发点的,所以git根本就无法代替svn; 至于git在开源软件的优势嘛,由于本人自由时间和兴趣问题,这个完全不关心。
penguin_ku
penguin_ku
感觉楼主不过另一个小愤愤的存在。说话也不客观。
第一,你都没玩过SVN,所以,我也就醉了。
第二,下载linux、下载android源码,拜托,这两个项目是git的典型适用场景,你用git的典型场景来说svn的不胜任,你干脆找个网站来说mongodb完虐sqlserver更霸气点。
第三,那个数据存储的那个。我不知道你到底有没有具体捣鼓过。svn是增量存储,git是副本存储。当然,这里的差异被你一笔带过,也还好,得益于硬盘的廉价,大家也就关注不到这里了。不过,你这样避重就轻真的好么?
第四,你接下来讨论的啥分支,全局版本号等等,都要在存储的原理上去讨论的,你根本就避开了上面哪一点,所以这里你纯粹就在信口开河,想到哪说道哪。
最后,你的那个git的完整性的呢,这个是git与svn的区别,但说优点的话,就两谈了,有好处有坏处。另外,你竟然举例服务器被雷劈了,够YY的。大点的公司服务器都是热备的,甚至还要加上地理容灾的。你举例服务器被雷劈了,你怎么不去关注git在权限管理方面的问题呢。

总之,楼主其实对git根本不深入,对svn完全不懂。所以,纯粹瞎写,还另开一篇,我也是醉了。

对于公司项目来说,SVN更契合需求,对于开源社区的情形,GIT更契合需求。商业软件可不希望大家没事一堆分支,半年不与服务器同步。
jackchanxj
jackchanxj
新人一枚,冒昧说几点。我还是大四,刚实习,一到公司boss就要我熟悉svn。在学校都是用git的,昨天熟悉了下svn,说点我的感受。
1.svn根据文件的管理形式让我很难以适应。当你在切换分支时要把环境一并改。每个分支的路径不一样会给编译、测试等带来很多麻烦,相对的git无论怎么切换都在一个目录,直观,省事。虽然ide的插件很大程度上能解决这个问题,但git只要git checkout一个命令就好了。ps:对于完全不想敲一个命令,只想不断点点点的童鞋,我也没什么好说的。
2.git不但是分支,还有stash等功能,你可以把一些试验性的代码放到stash中。“ctrl+z”大法虽好,但退出ide就回不去了。
3.git的命令相较于svn更简介高效。对于不以来可视化和ide插件的人是福音。
4.git很自由,但后果是如果管理不善,当你合并别人分支时就很麻烦。
5.git的可视化和ide插件支持不是很好。ps:对我没啥影响。
6.用svn的人群太多,想要要求他们转git成本太高。
汤糖
汤糖

引用来自“WDRainCN”的评论

我详细看完了文章,只是有点感觉楼主是不是有点偏执了,如果没有怎么使用svn就说svn的坏处,是不是过于随意了。
恰恰与楼主相反,我对git不熟悉,svn倒是用了8年了,在最近想了解下git的版本冲突问题时就发现非常大的麻烦, 而这点在svn里几乎是不存在的,如果使用过svn+Beyond Compare的svn熟手,绝对不会说出这些话的。 而且svn在分支管理上也是非常方便的,这仅仅是需要你对svn多一点了解。 或者请个配置管理员:)
说得有点多,多多见谅。 只是不希望很多新人被各种文章误导了。 git和svn能现在大行其道,必然都有其好的地方,仅仅是你的工作环境需要用什么,然后多了解就好。没必要分个高下。
WDRainCN
WDRainCN
我详细看完了文章,只是有点感觉楼主是不是有点偏执了,如果没有怎么使用svn就说svn的坏处,是不是过于随意了。
恰恰与楼主相反,我对git不熟悉,svn倒是用了8年了,在最近想了解下git的版本冲突问题时就发现非常大的麻烦, 而这点在svn里几乎是不存在的,如果使用过svn+Beyond Compare的svn熟手,绝对不会说出这些话的。 而且svn在分支管理上也是非常方便的,这仅仅是需要你对svn多一点了解。 或者请个配置管理员:)
说得有点多,多多见谅。 只是不希望很多新人被各种文章误导了。 git和svn能现在大行其道,必然都有其好的地方,仅仅是你的工作环境需要用什么,然后多了解就好。没必要分个高下。
Lunar_Lin
Lunar_Lin
版本对程序员来说只是个工具, 就像一个出租车一样, git和svn都很难遇到灾难性的事情, 外加备份思想,所以优势就在平时的日常使用, 谁废话最少最快速的把我送到想去的地方,谁就是最好的出租车.
个人对git 和svn 最大感受, svn慢, git很快. 我的项目做过svn 转到git, 速度差距非常明显, svn经常一敲完命令, 就干望着屏幕发呆, 好 有反应了, 再敲一下, 再发个呆. 而 git在于概念 对我来说 太枯燥了, 不懂还不行. svn 基本不需要什么概念, 和初学者对其的"幻想" 是一致的. git的分布式好处, 并不在于什么备份整个仓库, 对我来说就是可以随时提交,保护临时成果. 不说硬盘坏了, 要是坏,svn/git本地修改同样完蛋. 这个概率很低. 日常工作高频率的一点是 开发人员手动在改的文件 是很危险的, 经常一不小心 覆盖错文件, 经常ctrl z多点几下,自己没注意到, 所以还是很需要一个"备份" 来保护 工作环境. 有人说 你一改好 就要commit, 可这真是遭人骂的地方, 很多时候 编译都还有问题, 测试完全不能通过, 我就是想先commit 一下 保护下我的成果. 此时git太棒了,而svn很糟. 要么你被同事抱怨"妈的 你提交了个撒啊, 我这编译不过去了, 赶紧搞好. 我急着赶紧写完, 晚上上线", 要么你一不小心,"我草! 我下午写的东西怎么不见了." 至于有人提出可以: svn 单独为自己的开发开个分支, 需要提交的时候再merge过去. 我只能说 太卡了.需要别人的代码时 还要merge来merge去的. 完全比不过git commit git push的流畅.svn这方面不如git. 然后svn保存些策划文档 ,美术资源什么的, 还是很不错的, git..... 哎 教会他们用下svn commit 和svn checkout还是很容易的. 而git对非程序人士来说 太晦涩了.... 他们看你的眼神就像在说: 你们这帮写代码的真是群野猴子, 一天到晚 搞些妈的繁琐的不得了的东西. 我不想程序员给别人留下这个印象, 这方面svn是好的.
cnlinjie
cnlinjie
顶。
cnlinjie
cnlinjie

引用来自“曹建峰”的评论

svn 拉个分支有什么成本?
1、是需要完全拷贝一份吧。 2、分支和主干 合并代价有点大。
关于对-话说Svn与Git的区别-中,对svn的申诉

今天看到一篇文章:“话说Svn与Git的区别”https://www.jianshu.com/p/bfec042349ca,通篇都是讲git如何好,svn就没有什么用的样子,对于经常使用svn的我,我想做一点svn的申诉: 1.svn也可以...

zdhsoft ⋅ 03/07 ⋅ 0

Maven自动部署(SCM-SVN/Git)(maven-scm-plugin/maven-release-plugin插件的使用)

以下内容引用自https://ayayui.gitbooks.io/tutorialspoint-maven/content/book/mavendeployment_automation.html: 注意:Maven自动构建和自动部署的区别在于,构建只是编译代码阶段,而部署...

easonjim ⋅ 2017/05/15 ⋅ 0

【git学习】SVN项目迁移到Git操作指南

2017年6月份的时候,我就着手在公司推广git,首先我自己尝试搭建了GitLab来管理代码,并且通过以下博客记录了GitLab的搭建,以及GitLab备份,GitLab升级等事情。 git学习——>在CenterOS系统...

qq446282412 ⋅ 05/19 ⋅ 0

GIT科普系列1:git如何放弃本地working directory的修改,以及回滚

背景: 版本管理对开发人员来说至关重要,之前一直使用svn(主要是TortoiseSVN)作为团队配合的协作工具。但是自己相关的开源项目使用的是git发布在github上。由于项目自身的局限性,很少有大...

zssureqh ⋅ 2016/06/19 ⋅ 0

super_empire/patch-generator-parent

patch-generator-parent 通用svn、git增量部署补丁生成器,可用于svn/git/getee管理的maven项目的增量部署文件生成,支持多模块父子项目. 该模块可以对git/svn管理的项目进行增量代码生成用于...

super_empire ⋅ 04/20 ⋅ 0

通用 svn、git 增量部署补丁生成器 - patch-generator-parent

通用 svn、git 增量部署补丁生成器,可用于 svn/git/getee 管理的 maven 项目的增量部署文件生成,支持多模块父子项目。 总共包含四种生成方案: git 服务器分支提交分析; git 提交日志分析...

em_Aaron ⋅ 04/13 ⋅ 0

全自动发版部署工具 - patch-generator-desk

patch-generator-desk 项目增量补丁包神器:全自动web增量打包发版,支持git/svn,支持多模块项目。 - Author:aaron - [项目地址:https://gitee.com/hackempire/patch-generator-desk] - [e...

em_Aaron ⋅ 05/02 ⋅ 0

实战:使用SVN+apache搭建一个版本控制服务器

SVN简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。说...

寰宇01 ⋅ 06/14 ⋅ 0

CentOS 创建SVN 服务器,并且自动同步到WEB 目录

CentOS 创建SVN 服务器,并且自动同步到WEB 目录 标签: centossvnsubversion服务器 2013-12-06 10:09 5492人阅读 评论(0) 收藏 举报 分类: linux(5) 一、安装Subversion yum install su...

thinkyoung ⋅ 2015/12/30 ⋅ 0

解决jenkins打包时不能及时更新到最新代码的问题

首先要定位是否真的拉不到最新代码? 定位步骤如下: 1、在SVN上,查看show log,没有记录 2、登录Jenkins,查看构建的输出记录,Console Output, ctrl+f,若找不到最新代码,则可以确定是拉...

金龙鱼管家 ⋅ 04/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 53分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部