上一次转载了介绍GitHub的博文点我,我想对于初学GitHub的同学们还是有不清楚的地方,毕竟有些概念的理解比较费力。我觉得作为一个对于配置库技术已经有一定基础的同学们,要学习GitHub,最快以及最能够深刻理解的就是和自己熟悉的一个配置库技术进行比对,分析优缺点。本文就比对下目前业界最流行的GitHub和老牌配置库技术Subversion。看看是老而弥坚还是初生牛犊不怕虎。

一、Subversion的特点

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

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

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

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

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

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

二、GitHub的特点

众生平等,每个检出(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可比。

三、两种配置库技术的应用场景

经过上面的分析我们基本上可以看出来两种配置库技术优缺点了。那么在合适的场景使用合适的配置库技术来解决配置库管理的问题,才是我们的最终目的。

加入你的配置库管理了大量的二进制文件,例如excel、ppt、word等,由于这种文件无法合并,一旦出现冲突后,需要花大量时间来解决冲突。并且这种二进制

文件进行协同开发的可能性不高,那么推荐你还是使用Subversion。他的悲观锁的特性,能够帮助你保证二进制文件不会出现太多的合并问题。

 

如果你应用的场景是一个开源项目组,需要有更多的志愿者加入到项目中,希望营造一个开放,灵活的配置库环境。那么推荐你使用GitHub。它极低的拉分支

成本,分支自动合并。为每一个用户的分支提供平等的权限,保证用户在push变更到服务器之前,都不会因为其他人的修改出现冲突的问题。会让每一个开发人员

觉得协同起来非常爽。尤其是开发人员零散不是一个团队的时候,这一点就尤为重要。

至今为止有一点我始终还是有疑问,由于GitHub极低的分支成本,就有可能操作分支的个数超多,在进行合并时虽然能够保证自动合并不经常出现冲突。但是分支合并后是否会带来分支特性至今的逻辑冲突,对于这种冲突的识别是否只能够通过代码Review来控制风险。如何是这样的话,企业级别的应用对于GitHub配置库的应用就需要好好考虑一下了。

作者:yescoolfan
出处:http://www.cnblogs.com/yescoolfan
水平有限,欢迎指正,转载时请附上原文链接

GitHub Or Subversion的更多相关文章

  1. Jenkins 环境搭建

    本文为jenkins入手教程,全文分为 jenkins安装.系统管理(配置全局安全.全局工具配置.管理插件).创建项目(同时创建证书),管理视图,jenkins 客户端,执行构建.查看任务历史 一.j ...

  2. jenkins1

    持续集成工具: Jenkins  和 Hudson是同源的. 甲骨文和开源社区之间的关系破裂,该项目被分成两个独立的项目. Jenkins:由大部分原始开发人员组成,Hudson:由甲骨文公司继续管理 ...

  3. CI持续集成理论知识

    (1)什么是CI What is CI? CI就是持续集成,持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过 ...

  4. 搜刮一些开源项目的APP

    iOS完整App资源收集 <iOS完整app资源收集>  <GitHub 上有哪些完整的 iOS-App 源码值得参考?> <GitHub 上有哪些完整的 iOS-App ...

  5. 使用 Subversion (SVN) 的方式来访问 Github(转)

    [转至]:http://www.open-open.com/lib/view/open1340760267717.html

  6. 【GitHub Desktop】MacOS和Win下配置及简单的使用

    一. GitHub介绍 1.GitHub 是为开发者提供 Git 仓库的托管服务.这是一个让开发者与朋友.同事.同学及陌生人共享代码的完美场所. 总结一下,GitHub 最大的特征是"面向人 ...

  7. linux下git以及github的连接与使用

    简单理解 Git 的思想和基本的工作原理,能够更好的进一步和使用Git.在开始学习Git 的时候,最好不要把Git的各种概念和其他的版本控制系统诸如 Subversion 等相比,否则容易混淆每个操作 ...

  8. 发布 Rafy 源码到 GitHub

      最近项目组开始使用 Git 来作为源码管理.我今天就顺便把 Rafy 的源码也迁移到了 github 上,方便大家使用.这是项目的地址:https://github.com/zgynhqf/raf ...

  9. 【工匠大道】将项目同时托管到Github和Git@OSC

    原文地址 摘要: Github是最大的git代码托管平台,​GIT@OSC是国内最大的git代码托管平台,支持免费私有库,支持SVN操作,用户众多.很多用户需要同时将代码托管到两个平台,这篇文章的主要 ...

随机推荐

  1. loadrunner 脚本优化-参数化之场景中的参数化取值

    脚本优化-场景中的参数化取值 by:授客 QQ:1033553122   Action() { lr_eval_string("{NewParam}"); lr_eval_stri ...

  2. 运行svn tortoiseSvn cleanup 命令失败的解决办法

    这个时候请使用命令行模式运行 svn clean up 然后世界和平了:)

  3. Android Room框架学习笔记

    一.使用 1.build.gradle引入 compile "android.arch.persistence.room:runtime:1.0.0" annotationProc ...

  4. c# 采用datatable 快速导入数据至MSSQL的方法分享

    转自:http://www.maomao365.com/?p=5613 摘要:下文讲述使用c#代码快速将dataTable导入至mssql数据库的方法 实现思路:需要将datatable调整为同目标表 ...

  5. 前后端分离djangorestframework——分页组件

    Pagination 为什么要分页也不用多说了,大家都懂,DRF也自带了分页组件 这次用  前后端分离djangorestframework——序列化与反序列化数据  文章里用到的数据,数据库用的my ...

  6. Java中数组、List、Set互相转换

    数组转List String[] staffs = new String[]{"Tom", "Bob", "Jane"}; List sta ...

  7. C#方法重载(overload)方法重写(override)隐藏(new)

    一.重载:同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同.这样才能通过传递不同的参数来决定到底调用哪一个. 值得注意的是,方法重载只有通过参数不同来判断调用哪个方法, ...

  8. Postgresql的隐藏系统列

    转自 https://www.2cto.com/database/201206/137301.html   Postgresql的隐藏系统列   和oracle数据库一样,postgresql也有自身 ...

  9. c/c++ 图的创建及图的相关函数(链表法)

    c/c++ 图的创建及图的相关函数(链表法) 图的概念 图由点和线组成 知道了图中有多少个点,和哪些点之间有线,就可以把一张图描绘出来 点之间的线,分有方向和无方向 创建图 创建图,实际就是创建出节点 ...

  10. redmine screenshot paste(粘贴截图)

    前言 本文所使用的 redmine 3.1.x 查看redmine版本:以管理员帐号登录 – 点 管理 – 点 信息,示例如下: 在线插件库 插件仓库,可以下载丰富的插件: http://www.re ...