首先我表明一个根本的立场,我个人更喜欢用Git,但是,这仅仅是一个个人偏好。当我们需要将一种技术方案带给整个团队的时候,并不是由我们的个人偏好作为主要决定因素,而应该充分去权衡利弊,选择对团队,对公司更有效率的方案。抛开个人立场,理性评估利弊,可能才是我认可的一个资深程序员,或者一个架构师的本分。

我所在的团队,现在选用的技术方案是Git作为全公司的版本控制系统,我们一共有差不多20个程序员,使用五种以上的程序设计语言,研发维护四个左右的项目,属于小型创业公司中,研发规模中等偏上的企业。使用Git作为版本控制系统,在我加入公司之前,已经是既成事实了,在我听说这一点的时候,我非常高兴,因为我说过,我喜欢Git。

上周五,我们公司新来的工程师,在周会上分享Git,有个同事挑战道,为什么Git比SVN更好?这个问题,如果是问我个人的话,我可能会有很多的理由,但是,就像我一贯的思维模式,说服别人的时候,必须给出足够令人信服的原因,不能使用主观因素去说服别人,那样只能引起争论。

对于,“为什么Git比SVN更好”这个问题,我真的很想给出一个肯定的答案,但是,我在探寻答案的过程中,遇到了困难。于是,我来尝试一下站在反面的立场来给出一份答卷,然后,我们再反过来辩论,于是就有了本文的题目。

SVN到底有什么优点

广泛的群众基础。从我开始使用版本控制系统,我用的就已经是SVN了,所以,想要追溯SVN到底从什么时候开始,不得不求助于维基百科,我发现,SVN首个正式版本,可以追溯到2000年,距今已经十五年历史了。在Github成为大热门之前,SVN基本处于一统天下的地位。几乎所有的公司都在使用SVN作为内部的版本控制系统,Google Code更是掀起了开源软件的浪潮,一时间,几乎全世界的程序员,都在使用SVN。

我敢说,我们公司目前招聘的程序员,还没有没用过SVN的。这意味着,如果公司使用SVN的话,他们快速上手的概率,是非常高的。现在中国中小企业和创业企业,程序员招聘的困难程度,我不想多阐述——谁负责,谁头疼——如果使用SVN的话,学习版本控制系统用法这种事情,不会成为你脑海里的一个问题。

优异的跨平台支持 。年龄大这种事情,并非总是缺点,在跨平台支持这个角度,就会成为优势。十五年来,SVN几乎积累了所有平台上优秀的客户端软件。windows平台的TortoiseSVN的成功,简直无需赘述,甚至有程序员认为,TortoiseSVN就是SVN本身,一提到小乌龟,每个码农都会心一笑。而且,SVN本身的命令行客户端,就已经非常简洁好用了。跨平台简直毫无任何可以挑剔的地方。

简单易用。我个人认为,SVN的易用性是无与伦比的。我刚入职腾讯的第一年,身边的程序员,是把SVN当成云端文件夹用的。整个部门,只有一个版本库,一个项目文件夹,所有的项目代码仍在trunk里面,需要开新项目,就在trunk里加一个文件夹。就算SVN被误用到这种程度,它依然没有给整个研发过程带来任何大的麻烦,一切都井井有条。你要学会的,就是在小乌龟里点点鼠标而已。

后来,部门逐步扩大,文档增多,为了保护文档不丢失,部门运维自己架设了一个SVN服务器,让所有非程序员成员,都用SVN管理文档,各种需求,设计稿,统统用SVN管理,这个切换过程几乎没花什么时间,就是简单地给一些非技术同事培训了一下,一切都平滑异常。让五、六十号不懂技术的人,一下子用上SVN,足见其简单了吧。

功能完善稳定。从过去七年(此时是2015年)的开发经历来看,我还没遇到过什么SVN不能处理的研发管理模型。特指在中国,公司制的研发团队管理场景下。SVN本身建议的研发流程模型,已经足足够够了,trunk用于代码主干,branches用于特性开发,tag用于发布快照,一切都流畅自然。

我所在的团队,经过几年的摸索和磨合,已经形成了非常流畅顺滑的研发流程。有新任务来了,开分支,天天早上第一件事,同步主干变更(sync trunk),任务完成后,分支测试,测试完毕后回归主干(reintegration),完毕后集成测试,测试通过后,打tag,然后用内部自研上线系统,tag全量代码发布,最后分支负责人删除掉用过的分支。尤其配合SVN 1.5以后出现的merge tracking功能特性,连冲突都是很偶然的事件了。

SVN经过15年左右的研发,功能异常完善,而且非常稳定,你熟知的命令和参数,就几乎一直保持着你熟知的那个状态,没有附加学习成本,最难能可贵的是,SVN一直在持续更新,改善效率。

Git 相对SVN来说,有什么缺点?

高昂的学习成本。不要睁着眼睛跟我说,Git学习很简单啊,“学习很简单”这一个主观感受,也即,你觉得简单,只能代表你一个人的感受,如果整个团队只有你一个人,或者你们团队奉行一种精英文化,不是精英不招聘的话,你们所有人,可能都觉得学习Git很简单。但是如果是一家刚刚创业的小公司,或者经营数年的中小企业,考虑其本身能从市场上获取到的人才的程度,你不得不考虑他们的接受能力。固然,公司可以花力气去培训,可是培训的时间和代价,本身就构成了“学习成本”。

拙劣的跨平台支持。对于Windows,尤其不友好。但是请注意,Windows仍然是世界上使用最广泛的操作系统,我相信,大多数基层程序员也仍然在Windows环境下工作,那么Git那近乎故意的Windows不友好,不知道到底是为了什么。无论GitHub做了什么,各种IDE做了什么,在Windows下使用Git,其体验仍然是非常间接,而且不方便的。

糟糕的抽象,复杂的结构。要想用好Git,用户必须理解几个很特殊的东西,一个是分布式的结构,另一个是Git存储版本的原理。这对于没空去理解他的人们来说,很不友好,你几乎不能凭着直觉去使用Git,那样几乎都会把事情搞得一团糟。另外,公司里非技术的同事,几乎没法使用Git工作,比如我们公司的设计师,试图使用Git来管理设计稿,并进行协作,实际体验是很糟糕的,他们连新建版本库都不会。还不用提Git其实对二进制文件并不怎么友好。

你可以把事情搞得很糟糕。Git整个系统,给用户提供了极大的自由度,很多操作,我们知道是危险的,但是系统并没有阻止你操作。比如,你可以把任意分支push到任意分支,比如你可以随意删除本地提交历史里的commit,比如你可以把多人共享的分支给rebase掉,你可以干出很多匪夷所思的坏事托乱全团队的速度,你可以惹麻烦,Git本身没有提供任何保护机制。

一个不是结论的结论

我完全站在SVN的拥泵角度,来阐述上面那些,我会得出这样的结论,SVN在某些场合,真的比Git更合适,而我觉得,这个结论,也相对是公允的。如果公司研发成本低,研发团队小,研发人员经验参差,完全应该考虑直接使用SVN,这可能为你们团队后续发展,节省大量的时间。

当然,还有一个要考虑的因素是研发内容的特点和研发流程的特点,是否高频次协作?是否跨公司,跨地域协作?是否海量研发人员参与的开源系统?而就我的经验看,很少有公司的研发团队能跟这些东西搭边,于是SVN理所当然成为更理智的选择。

Ubuntu 14.04 下搭建SVN服务器 SVN:// http://www.linuxidc.com/Linux/2015-01/111956.htm

CentOS 6.2 SVN搭建 (YUM安装) http://www.codesec.net/Linux/2013-10/91903.htm

CentOS 6.5部署Apache+SVN http://www.codesec.net/Linux/2013-12/94315.htm

Apache+SVN搭建SVN服务器 http://www.codesec.net/Linux/2013-03/81379.htm

Windows下SVN服务器搭建和使用 + 客户端重新设置密码 http://www.codesec.net/Linux/2013-05/85189p5.htm

Ubuntu Server 12.04 安装 SVN 并迁移 Virtual SVN数据 http://www.codesec.net/Linux/2013-05/84695.htm

Ubuntu Server搭建SVN服务以及迁移方法 http://www.codesec.net/Linux/2013-05/84693.htm

Subversion (SVN) 的详细介绍:请点这里
Subversion (SVN) 的下载地址:请点这里

转载:http://www.codesec.net/view/188563.html

SVN为什么比Git更好的更多相关文章

  1. SVN迁移到Git的过程(+ 一些技巧)

    SVN迁移到Git的过程(+ 一些技巧) 李顺利 Key Words SVN,Git,Clone,Conversion,Tips,VCS,Pro Git 关于在VCS中SVN和Git之间的迁移(Clo ...

  2. SVN迁移到Git的过程(+ 一些技巧

    关于在VCS中SVN和Git之间的迁移(Clone)这个部分网上已经有大批的文章介绍,而且都非常不错,能够满足我们的常见的需求,这里介绍的是我自己整理的一些技巧和使用中出现的一些问题和疑问.阅读本篇文 ...

  3. svn老鸟转用git必须理解的概念

    不都是SCM代码管理嘛,有很大区别么?很多svn老鸟都是抱着这样的心态去学习git,然后无一幸免地陷入“查阅过很多资料,依然掌握不好”的困境,至少我们团队是这样的. 网上的资料确实已经很多了,却没有把 ...

  4. 将代码库从 SVN 迁移至 Git 并保留所有 commit 记录

    公司内部原本使用 SVN 进行版本控制,但随着 Github 的流行我个人的代码管理习惯逐渐转变.虽然公司项目并非开源,SVN 所具有的标准 trunk / branches / tags 结构完全够 ...

  5. 如何让公司从SVN改到Git?

    把公司的SVN迁移到GitLab CE(GitLab社区版)原因主要有下面几个: 年青的新人进来,喜欢用git的越来越多 GitLab CE提供了优美的 web 界面,图形化分支结构,更直观的代码审查 ...

  6. svn迁移到git

    步骤命令如下: > git svn clone https://svn-url/ProjectName --no-metadata --authors-file=user.txt --trunk ...

  7. svn 版本转为git

    git clone 相当于git init 和 git svn fetch.git svn rease git svn fetch 从svn服务器取指定区间的版本转化成git库 git svn reb ...

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

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

  9. svn迁移到git仓库并保留commit历史记录

    svn迁移到git仓库并保留commit历史记录 最近在做svn迁移到gitlab,由于之前一直是由svn做版本控制.最简单的方式是将svn的内容export出来,然后添加到gitlab即可.但是,如 ...

随机推荐

  1. 详解前端模块化工具-webpack

    webpack是一个module bundler,抛开博大精深的汉字问题,我们暂且管他叫'模块管理工具'.随着js能做的事情越来越多,浏览器.服务器,js似乎无处不在,这时,使日渐增多的js代码变得合 ...

  2. 清除Android工程中没用到的资源

    项目需求一改再改,UI一调再调,结果就是项目中一堆已经用不到但却没有清理的垃圾资源,不说工程大小问题,对新进入项目的人或看其他模块的代码的人来说,这些没清理的资源可能也可能会带来困扰,所以最好还是清理 ...

  3. 速算1/Sqrt(x)背后的数学原理

    概述 平方根倒数速算法,是用于快速计算1/Sqrt(x)的值的一种算法,在这里x需取符合IEEE 754标准格式的32位正浮点数.让我们先来看这段代码: float Q_rsqrt( float nu ...

  4. Atitit HTTP 认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结

    Atitit HTTP认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结 1.1. 最广泛使用的是基本验证 ( ...

  5. Java学习笔记(05)

    目录: static的用法 主函数的定义 增强for的循环 单例设计模式 封装 一.Static的用法 1.对象的内存分析 对象的引用变量是存在于栈区,而在堆区开辟了一块内存空间,调用对象给成员变量赋 ...

  6. 在linux平台实现atosl

    ➠更多技术干货请戳:听云博客 序言 怎么在linux 平台下实现一个类似于mac 平台下的 atos 工具( iOS 符号化解析)? 分析问题 在github上找到了几年前的开源实现,[https:/ ...

  7. 新项目的CQRS设计

    刚换了个工作,闲话不说了.前两天开始一个新项目,大概是一个任务管理系统,由使用者来选取任务,执行任务,反馈完成,我大概做了些设计,本来是打算看能不能在新公司铺垫一下DDD,不过后来这块功能没分到我这, ...

  8. Golang 生成随机数

    package main import ( "fmt" "math/rand" "time" ) func main() { rand.Se ...

  9. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  10. 1、.NET平台概述

        本学习主要参考Andrew Troelsen的C#与.NET4高级程序设计,这小节主要述说以下几个东西:     宏观上讨论一下.net相关的主题:程序集.CIL(Common Interme ...