弃用SVN选择Git的理由

2020-01-03  本文已影响0人  科研者

目录

内容

1. 多人项目中使用SVN遇到的问题

在多人共同开发的项目中,使用 SVN 会存在许多版本和协作方面的问题,如下:

  1. 创建分支的过程太麻烦
    在项目开发中,我们可能需要经常创建以下几类分支:

    • bug分支:为解决某个bug而创建的分支;
      比如:当前正在开发功能A,突然需要临时解决线上的一个问题,这个问题需要基于线上的某个版本进行修复;
    • 功能分支:为开发某个功能而创建的分支;
      比如:当前正在开发功能A,还未完成,突然又来了个紧急的功能B,这就需求需要基于功能A之前的版本进行开发;
    • 协作分支:为使两个或多个成员协作共同完成某个任务的开发工作;
      比如:有个功能需要成员A和成员B共同开发,而其它成员负责其它功能,为了不影响其它成员的开发,成员A和成员B需要一个单独的分支来进行开发;

    而创建 SVN 分支需要公司中专门的管理员去申请,这个过程一般又要包括:撰写邮件、抄送相关人员 等等;

    其实有很多分支都是临时且频繁的,如 bug分支、协作分支 和 开发小功能的功能分支,如果创建这些分支还需要申请的话,就过于麻烦了;

  2. 新分支需要重新配置项目环境
    SVN 创建的分支是在一个新的目录里,即:从目录结构方面,可以理解为 SVN 是通过复制一份目录来实现新的分支的;这意味着开发人员需要另起一个工程(因为有很多工具没有提供SVN分支的切换操作,比如:WebStorm等IDE),拉取新分支,然后重新配置工程环境;当然,也有其它办法实现在当前工作目录中切换分支,但太麻烦;

  3. 版本节点必须通过推送到服务器才能生成
    SVN 的版本节点是通过将 更改 提交到服务器后由服务器生成的,所以每次使用 SVN 进行提交时,就会将代码推送到服务器;
    而 我们往往又希望被推送到服务器的代码都是已经开发完成的代码,这就使得我们要等到把某个功能点开发完成 或 bug 修复完成后,再把所有的更改作为一个版本进行提交;然而在实现的功能点开发 或 bug修复中,我们可能经常需要把某一部分改变作为一个版本,以便将来能做更细致的回滚代码,SVN无法满足这种需求。

  4. 提交变更前需要确保拉取了服务器中最新的代码
    在成员A进行提交变更到SVN服务器时,如果其它人往服务器上提交了新的版本 或 正在提交,则 成员A 的提交会被服务器的拒绝,此时成员A必须选把服务器上最新的版本更新下来,然后再进行提交;而这种操作有可能导致 成员A 的本地项目运行不起来,因为服务器上新的提交有是其它成员开发中的代码,或是有问题的代码;

  5. 提交版本必须要有网
    SVN 的版本库是放在服务器上,客端的提交操作只是向服务推送变更,然后由服务器生成版本,如果不能正常连接到服务器的话,是无法进行SVN的一切操作的;这就使得那些远程办公(比如:在家远程解协助解决问题) 或者 出差的公无法随时随地的提交代码;

  6. 版本历史中不能体现合并操作
    SVN 不会记录任何合并操作,当提交本地修改,版本库并不能判断出本次修改是通过 svn merge 合并来的,还是手工修改来的。这就使得不能过版本记录来判断分支是否包含特定的代码,从而导致容量基于错误的分支进行开发;

  7. 很难执行基于分支的版本开发流程
    由于SVN具有上文所说的 分支创建麻烦且不宜维护等特点,导致很多很优秀的基于分支的版本开发流程(如类似下面的版本开发流程)无法得到实施!

    分支流转规范图
    分支流转规范图的详细内容请见Git并行工作流程规范

以上问题均是由 SVN 的以下特性和机制所致:

而Git的设计理念与SVN正好相反,使得Git正好能解决这些问题,原因:

综上,使用Git解决了以上遇到的所有问题;

2. Git与SVN的其它区别

以上描述的问题及区别,只是面对普通开者,在项目运用中体现出的,其实 Git 和 SVN 还有储多区别,具体信息如下:

2.1. 版本库与工作区

SVN的工作区和版本库是截然分开的,而Git的工作区和版本库是如影随形的。

SVN的版本库和工作区是分离的:

Git的版本库和工作区如影随形:

2.2. 全局版本号和全球版本号

SVN的版本号是全局版本号,即:每一次提交都具有整个版本库全局唯一的版本号。

Git的版本号是全球唯一的。Git 对于每一次提交,通过对文件的内容或目录的结构计算出一个SHA-1 哈希值,得到一个40位的十六进制字符串,Git将此字符串作为版本号。

SVN与Git版本号比较

2.3. 部分检出

SVN可以将整个库检出到工作区,也可以将某个目录检出到工作区。对于要使用一个庞大、臃肿的版本库的用户来说,部分检出是非常方便和实际的。

但是Git只能全部检出,不支持按照目录进行的部分检出。

SVN的部分检出:

Git的检出:

2.4. 撤消操作

  1. 提交的撤销
    在SVN中一旦完成向服务器的数据提交,你就没有办法再从客户端追回,只能在后续的提交中修正(回退或者修改)等。因为SVN作为集中式的版本控制,不能允许个人对已提交的数据进行篡改。SVN具有一个非常重要的特性就是它的信息从不丢失,即使当你删除了文件或目录,它也许从最新版本中消失了 ,但这个对象依然存在于历史的早期版本中。
    Git则不同,Git是分布式版本控制系统,代码库是属于个人,允许任意修改。Git通过对提交建立数字摘要来保证提交的唯一性和不可更改性,通过版本库在多人之间的多份拷贝来保障数据的安全性。Git可以丢弃最新的一个或几个提交,使用 git reset –hard命令可以永远丢弃最新的一个或者几个提交。
  1. 提交说明的修改
    提交后如果对提交说明不满意,如何实现对提交说明的修改:

    1. Git可以使用命令git commit –amend修改提交说明。
      • Git可以修改最后一次提交说明,并不是说不能修改历史版本的提交说明,只是修改最后一个版本提交说明拥有最简单的命令;
      • Git修改提交说明,会改变提交的commit-id。即修改提交说明后,将产生一个新的提交;
      • Git可以通过git reset –hard ,git commit –amend,git rebase onto 等命令来实现对历史提交的修改;
      • 使用stg工具可以更为简单的修改历史提交的提交说明,包括提交内容;
    2. SVN也可以修改提交说明,是通过修改提交的svn:log版本属性实现的:
      • 不但可以修改最后一次提交的说明,并且可以修改历史提交的提交说明;
      • SVN修改提交说明是不可逆的操作,可能会造成说明被恶意修改;
      • SVN缺省关闭修改提交说明的功能。管理员在设置了提交说明更改的邮件通知后,才可以打开该功能。
  2. 修改和重构历史提交
    Git可以修改和重构历史提交:使用Git本身的reset以及 rebase 命令可以修改或者重整/重构历史提交,非常灵活。使用强大的 stg 可以使得历史提交的重构更为简洁,如果您对 stg 或者 Hg/MQ 熟悉的话。
    SVN 修改历史提交,只能由管理员完成。
    SVN 是集中式版本控制系统,从客户端一旦完成提交,就没有办法从客户端撤销提交。但是管理员可以在服务器端完成提交的撤销和修改,但是操作过程和代价较大。

2.5. 权限管理

SVN通过对文件目录授权来实现权限管理,子目录默认继承父目录的权限。但是也有缺憾,即权限不能在分支中继承,不能对单个文件授权。例如为 /trunk及其子目录的授权,不能继承到分支或者标签中相应的目录下。

Git 的授权做不到SVN那样精细。Git的授权模型只能实现非零即壹式的授权,要么拥有全部的写权限,要么没有写权限,要么拥有整个版本库的读权限,要么禁用。

从技术上将,Git可能永远也做不到类似SVN的路径授权(读授权):

3. 缺点总结

3.1. SVN

3.1.1. 优点

3.1.2. 缺点

3.2. Git

3.2.1. 优点

3.2.2. 缺点

4. 相关文章

上一篇 下一篇

猜你喜欢

热点阅读