您当前所在的位置:首页 / 新闻中心 / 常见问题
新闻中心
行业资讯
常见问题
知识百科
产品技术

Git和SVN之间必须存在的差异

发表于:2019-02-11

近年来,Git的使用极大地推广了分布式版本控制系统。根据Eclipse社区调查,2014年,Git最终超越了SVN,成为Java开发人员首选的版本控制系统(VCS)。

诸如GitHub和Bitbucket等托管平台通过提供开发区托管空间和工具,使分布式版本控制成为可能。Microsoft已将Git作为其TFS平台中新项目的默认版本控制提供程序,并强烈鼓励开发人员使用Git,除非他们特别需要集中式VCS。那么最受欢迎的VCS在功能分支模型的实现和它们的便利性方面有何比较?

Git和SVN差异

选择适合您需求的版本控制系统

当一个团队开始一个新项目或在一个正在进行的计划中达到拐点时,它提供了一个机会,问:“我当前的版本控制系统是否正常工作?”“Git和SVN之间有什么区别?”我们将探讨三个最流行的版本控制系统 - Git,SVN和Mercurial。从意识形态的角度来看,Mercurial和Git属于同一类别的分布式VCS。有什么主要区别,为什么我们选择Git?

分布式与集中式版本控制系统

首先是带有RCS(1982)及其后继CVS(1987)的集中式版本控制系统。目前最受欢迎的是Subversion,TFVC,Perforce和Clearcase。使用这些系统,所有开发人员都访问单个中央存储 如果进行了更改,它将在他们提交更改之前到达每个开发人员,不幸的是,这也包括损坏的代码。由于只有一个“真正的”存储库,离线工作可能是一个挑战。要完成添加查看历史记录或提交代码等基本操作,您需要访问存储库。

最早的分布式版本控制系统之一是Bitkeeper(1997)。目前流行的工具包括Git,GNU Arch和Mercurial。在分布式模型中,每个开发人员都有自己的存储库副本。使用这种方法,开发人员可以脱机工作 - 他们可以提交,分支,合并分支,查看历史记录,他们需要的任何东西,因为他们拥有整个存储库。仅在与其他团队员同步时才需要访问Internet 。

Mercurial和Git之间的差异

Mercurial和Git之间存在两个主要差异。

巨石。Mercurial是一个整体应用程序,而Git,遵循Linux意识形态,来自许多小二进制文件,通常对开发人员隐藏。拥有能够调整系统的精细工具意味着Git非常灵活。准确性和灵活性对客户来说非常重要。因此,具有实施非标准解决方案的灵活性可以改变游戏规则。

历史。Mercurial和Git之间的另一个区别在于它们如何处理历史。Git允许(有些人可能会鼓励)用户在需要时重写其存储库的历史记录。这允许仔细调整提交日志以使日志保持简单和逻辑结构,而不是包含整个历史记录。强大的力量带来了巨大的责任,所以历史改写应该只在当地的承诺上发生。

最后,两个系统都非常相似。此外,Git提供的许多开箱即用的功能都被作为插件引入Mercurial。功能分支工作流程可以在Git和Mercurial中轻松实现。

使用Git实现功能分支开发过程的优点和缺点

在VCS中分支允许我们创建代码的虚拟副本,以便在不影响原始代码的情况下进行更改。在功能分支模型中,我们希望为每个新功能都有一个单独的分支。这有几个重要的好处。

Pro:合并代码之前的简单代码审查

代码评论很棒。它们有助于保持代码统一,保持相同的样式,并显着减少重构的需要,使代码与标准保持一致。有时,代码审查甚至可以在问题转变为质量保证分析师之前捕获错误,从而节省开发过程中的宝贵时间。

亲:更好地控制源头

使功能请求方法如此受欢迎的原因是它提供的隔离。功能与代码分开孵化,在准备好之前不会影响代码库。虽然SVN提供分支,但由于大型项目的价格标签,临时分支仅用于更大的功能。

亲:在问题之间轻松过渡

通常,开发人员需要在此过程中暂停和转动不同问题或任务之间的工作。假设一个开发人员在一个问题上工作了大约一个星期,当时需要对生产进行关键的新修复。当然,他可以做一个SVN补丁或在新的位置干净地下载源代码,但这些解决方法会耗费时间并可能导致挫败感。使用每个功能的分支工作流,所有这些工作都可以通过简单的临时提交和分支更改来完成。

专业:更好的发布流程

功能分支与非常流行的Git Flow齐排列。它解释了所有可能的场景,如修补程序,代码冻结等。

Con:复杂历史记录

至于缺点,它们来自开发人员必须完成的额外步骤。开发人员必须确保他们从正确的提交中分支出来。根据已完成问题的合并策略,历史记录日志可能会变得更大,更难理解。

Git和SVN之间的差异

切换到Git时最显着的差异之一是它的速度。由于整个存储库本地存储在开发人员的计算机上,因此他或她可以使用非常差的Internet连接工作数天。由于Git的分支实现,创建分支是快速的。在Git中,分支只是对提交的引用,其中将附加以下提交。它甚至不包含创建日期,创建日期的用户或某种消息等基本信息。

由于Git鼓励使用分支机构,因此我们不能忘记对其合并功能大肆宣传版本1.5之前的SVN仅执行双向合并,其中涉及应用于当前代码库的更改集,因为它不存储合并信息。Git使用存储库的历史来识别合并分支之间的公共基础,并且只需要从它们发散的位置进行合并 - 从而完成三向合并。SVN也在不断改进,自1.5以来一直支持三方合并。在即将推出的1.9版SVN中,它还可以更好地重命名/移动文件跟踪,这是Git已经做到的。


与其他软件集成

SVN已经运营超过15年,并且由于其受欢迎程度已经集成到当今的大多数集成服务器,问题跟踪系统,IDE和其他服务器上。考虑到Git和SVN之间的差异,尽管比SVN年轻5岁,但Git绝不落后。将其与其他软件集成很容易。Git本身只提供命令行工具,但许多公司已经创建了各种UI,如Atlassian的SourceTree,Github,Git Extensions等。

采用Git

在权衡Git和SVN之间的差异时,Git提供的功能很少。其中包括略微陡峭的学习曲线,至少在开始阶段。如果项目上的开发人员只使用集中式VCS,那么他们可能会遇到一些减速,导致一些差异,例如同步过程和创建提交时添加的分段步骤。如上所述,有许多GUI应用程序可以使开发人员的生活更轻松,如果需要,他们还提供命令行界面,以防需要更高级的命令。

尚未准备好切换到Git存储库,但仍想使用功能分支方法?

Git提供了一个名为git-svn的工具,它允许跟踪标准的Subversion存储库并在它们之间提供双向的变化流。您可以在需要时使用功能分支并与SVN repo的分支同步。所有这些都不会对团队产生任何影响,因为只有开发人员知道他在本地使用Git存储库。Microsoft已采用与TFS类似的方法。他们提供了一个git-tf工具,可以跟踪TFS存储库。然而,通过这种方式,特征分支模型没有充分发挥其潜力,因为项目的管理无法从中受益。

功能分支提供隔离和便利。由于Git的内部实现,创建分支 - SVN中昂贵的操作之一 - 基本上是“免费的”。这允许即时创建和清理临时分支以创建新功能。