为什么Git比Subversion更好?


393

我已经使用Subversion几年了,使用SourceSafe之后,我只是喜欢Subversion。与TortoiseSVN结合使用,我真的无法想象它会变得更好。

但是,越来越多的开发人员声称Subversion存在问题,我们应该转向新的分布式版本控制系统,例如Git

Git在Subversion上有何改进?

Answers:


548

Git并不比Subversion好。但是也不差。这是不同的。

关键区别在于它是分散的。想象一下,您是旅途中的开发人员,您在笔记本电脑上进行开发,并且希望拥有源代码控制权,因此可以返回3小时。

使用Subversion,您会遇到一个问题:SVN信息库可能位于您无法访问的位置(在公司中,并且您目前没有互联网),因此无法提交。如果要复制代码,则必须逐字复制/粘贴。

使用Git,您就不会遇到这个问题。您的本地副本是一个存储库,您可以对其进行提交并获得源代码管理的所有好处。重新获得与主存储库的连接时,可以对其进行提交。

首先看起来不错,但请记住此方法会增加复杂性。

Git似乎是“新的,闪亮的,酷的”东西。这绝不是一件坏事(毕竟,Linus为Linux Kernel开发编写了它是有原因的),但是我感到很多人跳入“分布式源代码控制”培训只是因为它是新的,并且是由Linus Torvalds编写的,实际上没有知道为什么/如果更好。

Subversion有问题,但是Git,Mercurial,CVS,TFS或其他问题也有问题。

编辑:所以这个答案已经有一年历史了,仍然产生了很多反对意见,所以我想我会添加一些更多的解释。自编写此书以来的最后一年,Git获得了很多动力和支持,尤其是自GitHub之类的网站真正腾飞以来。如今,我同时使用Git和Subversion,并希望分享一些个人见解。

首先,当分散工作时,Git最初可能真的会造成混乱。什么是遥控器?以及如何正确设置初始存储库?一开始会出现两个问题,特别是与SVN的简单“ svnadmin create”相比,Git的“ git init”可以采用--bare和--shared参数,这似乎是设置集中式管理的“正确”方法资料库。这是有原因的,但是会增加复杂性。“ checkout”命令的文档对于转换的人非常混乱-“正确”的方式似乎是“ git clone”,而“ git checkout”似乎是切换分支。

当您分散时,Git确实会发光。我在家中有一台服务器,在旅途中有一台笔记本电脑,而SVN在这里根本无法正常工作。使用SVN,如果未连接到存储库,则无法获得本地源代码控制(是的,我知道SVK或复制存储库的方式)。无论如何,使用Git都是默认模式。不过,这是一个额外的命令(git commit在本地提交,而git push origin master将master分支推送到名为“ origin”的远程)。

如上所述:Git增加了复杂性。创建存储库的两种模式,检出vs.克隆,提交vs.推送...您必须知道哪些命令在本地工作以及哪些命令与“服务器”一起工作(我假设大多数人仍然喜欢中央的“主存储库” )。

而且,该工具仍然不足,至少在Windows上是如此。是的,有一个Visual Studio插件,但是我仍然将git bash与msysgit一起使用。

SVN的优点是学习起来非常简单:存在您的存储库,对它的所有更改,如果您知道如何创建,提交和签出,并且准备就绪,可以稍后进行分支,更新等操作上。

Git的优点是,如果某些开发人员不总是连接到主存储库,则它更适合。而且,它比SVN快得多。从我听到的信息来看,分支和合并支持要好得多(这是可以预期的,因为这是编写它的核心原因)。

这也解释了为什么它在Internet上获得如此多的关注,因为Git非常适合开放源代码项目:只需将它分叉,将您的更改提交到您自己的Fork中,然后要求原始项目维护者撤消您的更改。使用Git,这是可行的。真的,在Github上尝试一下,这很神奇。

我还看到的是Git-SVN桥:中央存储库是Subversion存储库,但是开发人员在本地使用Git进行工作,然后桥将其更改推送到SVN。

但是即使有这么长的时间,我仍然坚持我的核心信息:Git并不好坏,只是有所不同。如果您需要“离线源代码管理”,并且愿意花一些额外的时间来学习它,那就太好了。但是,如果您有严格集中化的Source Control,并且/或者由于您的同事不感兴趣而一开始就在努力引入Source Control,那么SVN的简单性和出色的工具(至少在Windows上如此)非常出色。


70
法拉利并不比现代更好。但是也不差。这是不同的。(什么?不要这样盯着我...我说错了吗?)
FDCastel

219
不,你没有。法拉利汽车不切实际,价格昂贵,口渴,如果您住在纽约或巴黎这样的城市,那么从A到B的状况不会更好。我希望在许多地方都使用Hyundai,这也是因为划痕不太严重。但是对他自己来说,法拉利也有(很少)优势……
迈克尔·斯托姆

50
发行版不是Subversion和Git之间的唯一区别。除非您使用多个存储库,否则它也不会增加任何复杂性。使用Git而不是Subversion 有很多优点,但是只有几个(大多数是微不足道的)缺点。使用Git是因为它很好,而不是有光泽。
sebnow's

6
我在git上的经历并不完全是“改变生活的启示”。我认为它是一个很好的工具,当它可以工作时,或者当它不起作用时,它会变得粗糙。我对问题1052882之类的调试工作并没有留下深刻的印象,即使这显然是RTFM问题:我确实认为git(以及任何其他分布式vc)比集中式vc更复杂,我会考虑在集中式环境中使用它。但话又说回来,我主要是Windows开发人员,与SVN相比,该工具在Windows上仍不成熟。
迈克尔·斯托姆

5
您仅在比较中分析分布方面。我告诉你为什么。因为您只想共享代码。Git和SVN不仅如此,您是否曾经标记,分支,合并,解决冲突,在分支之间复制补丁?我认为您的分析只是有缺陷的。在那些方面,git是非常强大的工具。更不用说git可以做到的了,而SVN不能做到的,例如压扁,解剖,增强,重新设置基础,挑选樱桃等等。
mschonaker

145

使用Git,您几乎可以脱机执行任何操作,因为每个人都有自己的存储库。

制作分支和分支之间的合并真的很容易。

即使您没有项目的提交权限,您仍然可以在线拥有自己的存储库,并为补丁发布“推送请求”。每个喜欢您的补丁程序的人都可以将其加入他们的项目中,包括官方维护人员。

派生一个项目,对其进行修改,并且仍然继续合并来自HEAD分支的错误修正,这是微不足道的。

Git为Linux内核开发人员工作。这意味着它确实非常快(必须如此),并且可以扩展到成千上万的贡献者。Git还使用较少的空间(Mozilla存储库的空间最多减少30倍)。

Git非常灵活,而且非常TIMTOWTDI(有多种方法可以做到)。您可以使用所需的任何工作流程,而Git将支持它。

最后,还有GitHub,这是一个托管Git存储库的好网站。

Git的缺点:

  • 这很难学习,因为Git具有更多概念和更多命令。
  • 修订版没有像Subversion中那样的版本号
  • 许多Git命令是模糊的,错误消息非常不友好
  • 它缺少良好的GUI(例如出色的TortoiseSVN

31
尽管学习所有Git会困难得多,但基本知识几乎是相同的。除非您进入更高级的内容,否则SVN根本无法做到,因此学习的范围并不是那么陡峭。
sebnow

10
为我+1。我认为许多开发人员都忘记git缺少TortoiseSVN之类的东西,不仅开发人员使用版本控制。我为必须使用SVN | TortoiseSVN向非开发人员解释(和支持)分布式版本控制而感到震惊!
2009年

7
另一个缺点-您必须拥有存储库的完整副本,不能处理部分内容(如果您有大量的部分内容,例如很多公司,这很重要)
gbjbaanb

3
我喜欢git,但是每天花大约六个月才能真正有效地使用它。话虽这么说,我结合使用了msysgit的git shell(命令提示符),msysgit的git gui和gitk以及TortoiseGit。我认为TortoiseGit很棒,但是我不明白为什么更多的人不使用它。我知道msysgit维护者讨厌TortoiseGit是出于各种原因,其中一些是意识形态的,可能与它有关。TortoiseGit是一个保守的秘密!
Jim Raden

2
我同意。我同时使用SVN和GIT(大约6个月以来)。老实说,我比SVN更爱git。它只是花时间学习。对我来说最大的飞跃(当我看到光亮的那一刻:P)是当我终于意识到我不得不停止以SVN的工作方式使用GIT的时候。然后一切都就位了;)
Blizz 2010年

110

其他答案也很好地解释了Git的核心功能(很棒)。但是,还有很多方法可以使Git表现得更好,并帮助保持我的生活更加理智。以下是一些小事情:

  1. Git有一个“干净”的命令。考虑到SVN多长时间将额外的文件转储到磁盘上,SVN非常需要此命令。
  2. Git具有“ bisect”命令。这真好。
  3. SVN在每个文件夹中创建.svn目录(Git仅创建一个 .git目录)。您编写的每个脚本以及所做的每个grep都需要编写,以忽略这些.svn目录。您还需要一个完整的命令(“ svn export”),以获取文件的完整副本。
  4. 在SVN中,每个文件和文件夹都可以来自不同的修订版或分支。首先,拥有这种自由听起来不错。但这实际上意味着,有一百种不同的方法可以完全搞定本地结帐。(例如,如果“ svn switch”在中途失败,或者您输入的命令错误)。最糟糕的部分是:如果您遇到某些文件来自一个地方而某些文件来自另一个地方的情况,则“ svn状态”将告诉您一切正常。您需要在每个文件/目录上执行“ svn信息”,以发现异常情况。如果“ git status”告诉您情况正常,那么您可以相信情况确实正常。
  5. 每当您移动或删除某些内容时,您都必须告诉SVN。Git会解决的。
  6. 在Git中,忽略语义更容易。如果忽略模式(例如* .pyc),则所有子目录将忽略该模式。(但是,如果您真的只想忽略一个目录,则可以)。使用SVN,似乎没有简单的方法可以忽略所有子目录中的模式。
  7. 另一个涉及忽略文件的项目。Git使得“私有”忽略设置成为可能(使用文件.git / info / exclude),这不会影响其他任何人。

2
广告。7.使用现代git,还可以通过使用〜.gitignore中的core.excludesFile配置变量来使每个用户的“私有”忽略设置(请参见man git-config)。
2009年

3
关于#5:虽然通常是这样,但有时Git确实搞砸了。至少对于Subversion,由于移动或删除引起的问题几乎总是PEBKAC。尽管具有自动移动/删除跟踪功能很好,但我至少还是赞赏能够明确声明对存储库中文件的处理能力,即使我不需要使用它也是如此。
克里斯·查拉巴鲁克

8
@Chris:您可以明确地做到:git mvgit rm
R. Martinho Fernandes

2
我还希望看到每个工作副本有一个.svn目录的选项,但有记录:对于#3:大多数工具(默认情况下)将忽略.svn目录。对于#6:您可以递归设置属性。
2009年

6
3:使用WC-NG时,SVN 1.7将位于“单个.svn”目录。1:要进行SVN清理,请在WC顶部“导出”。5:这不是那么容易,如果重命名文件,git会识别它并保留历史记录,还是将其视为目录中的添加和删除?6/7:svn具有按用户客户端设置的全局忽略。
gbjbaanb

56

为什么Git比X更好 ”概述了Git与其他SCM的优缺点。

简要地:

  • Git跟踪内容而不是文件
  • 分支是轻量级的,合并很容易,我的意思是说真的很容易
  • 它是分布式的,基本上每个存储库都是一个分支。我认为,与Subversion相比,并行和协同开发要容易得多。它还使离线开发成为可能。
  • 正如上面链接的网站所示,它没有任何工作流程,Git有很多工作流程。Subversion样式的工作流很容易被模仿。
  • Git存储库的文件大小比Subversion存储库小得多。与数十个“ .svn”存储库相比,只有一个“ .git”目录(请注意,Subversion 1.7及更高版本现在使用单个目录,如Git。)
  • 临时区域是真棒,它可以让你看到你将提交更改,提交局部修改和做各种其他的东西。
  • 当您进行“混乱的”开发时,或者只是想在仍在其他地方(在另一个分支上)工作时修复错误,隐藏是非常宝贵的。
  • 您可以重写历史记录,这对于准备补丁集和修复错误(发布提交之前)非常有用。
  • ...还有很多更。

有一些缺点:

  • 目前还没有很多好的GUI。它是新的,Subversion已经存在了很长时间,所以这很自然,因为有一些接口正在开发中。一些不错的工具包括TortoiseGitMac的GitHub
  • 目前无法对存储库进行部分检出/克隆(我读到它正在开发中)。但是,有子模块支持。 Git 1.7+支持稀疏签出
  • 即使我(大约一年前)没有发现这种情况,可能很难学习。Git最近改进了其界面,并且非常用户友好。

在最简单的用法中,Subversion和Git几乎相同。之间没有太大区别:

svn checkout svn://foo.com/bar bar
cd bar
# edit
svn commit -m "foo"

git clone git@github.com:foo/bar.git
cd bar
# edit
git commit -a -m "foo"
git push

Git真正令人眼前一亮的是分支并与其他人一起工作。


8
您说GIT跟踪内容而不是文件。我发现SVN也可以做到这一点:我只是对文件进行了更改并保存了。SVN将文件显示为红色(已更改)。然后,我在编辑器中撤消并再次保存。然后,即使文件已更改(更新日期较新),SVN仍将状态更新为绿色(未更改),但是SVN识别出内容未从原始内容更改。
敬畏

svn跟踪文件中的更改吗?
Seen Osewa'3

12
@awe,这称为文件跟踪。尝试重命名文件,或手动将其移动到其他位置[相同内容,新文件(由于新路径/名称)]:SVN是否会知道这是同一文件,并保留以前对该文件所做的无数修订?不,我想不是。
FilipDupanović10年


54

Google Tech Talk:git上的Linus Torvalds

http://www.youtube.com/watch?v=4XpnKHJAok8

Git Wiki的比较页面

http://git.or.cz/gitwiki/GitSvnComparsion


12
Linus的演讲很有趣。他残酷地撕毁了Subversion和CVS等集中式版本控制系统。但是,兰德尔·施瓦茨(Randal Schwartz)的youtube.com/watch?v=8dhZ9BXQgc4演讲更具建设性,信息量大且更具说服力。

2
这个也很好。它来自git提交者之一,他解释了许多高级功能,例如将大型提交拆分为较小的提交。youtube.com/watch?v=j45cs5_nY2k
schoetbi 2010年

我确实喜欢Linus Torvalds的视频,但是他暗示git是分布式的,而不是集中式的,这是错误的。它可以以分布式方式使用,也可以以集中方式使用。您可以拥有一个所有人都可以提交的中央存储库,就像在SVN中一样。只是您不必那样做。
MatrixFrog 2010年

@MatrixForog:我认为在这种情况下,“去中心化”不是“集中” 的对立面,而是一个超集。就像“移动”和“不移动”一样-仅仅因为某些东西是“移动”并不代表我不能停滞不前。
蒂洪·耶维斯

26

好吧,它是分布式的。基准测试表明它的速度要快得多(考虑到它的分布式特性,差异和日志之类的操作都是本地的,因此在这种情况下当然要快得多),并且工作文件夹更小(这仍然让我震惊)。

当您使用Subversion或任何其他客户端/服务器版本控制系统时,实际上是通过签出修订版本在计算机上创建工作副本。这代表了存储库外观的快照。您通过更新来更新工作副本,并通过提交来更新存储库。

使用分布式版本控制,您没有快照,而只有整个代码库。想要与3个月大的版本进行比较吗?没问题,使用3个月的旧版本仍在您的计算机上。这不仅意味着事情要快得多,而且如果您与中央服务器断开连接,您仍然可以执行许多惯用的操作。换句话说,您不仅拥有给定修订版的快照,而且还拥有整个代码库。

您可能会认为Git会占用您的硬盘驱动器上的大量空间,但是从我所看到的一些基准测试来看,它实际上花费的空间更少。不要问我如何。我的意思是,它是由Linus构建的,我对文件系统了解一两点。


1
Git可以为完整存储库使用的磁盘空间比仅用于签出的Subversion占用更少的磁盘空间的原因是Subversion存储了“原始副本”以使“ svn diff”(与上一版本相比)工作...并且git存储库已压缩(并经过了增量处理) )。
JakubNarębski09年

3
令我惊讶的是,git“工作文件夹”(即repos)比svn工作副本小,因为即使svn repos也比svn工作副本小。
R. Martinho Fernandes

22

我喜欢DVCS的要点是:

  1. 您可以犯坏的事情。没关系,因为在您发布之前,其他人不会看到它们。发布时间与提交时间不同。
  2. 因此,您可以更频繁地进行提交。
  3. 您可以合并完整的功能。此功能将有其自己的分支。该分支的所有提交都将与此功能相关。您可以使用CVCS来实现,但是默认使用DVCS来实现。
  4. 您可以搜索历史记录(在功能更改时查找)
  5. 如果有人搞砸了主存储库,则可以撤消拉动,而无需修复错误。只需清除合并即可。
  6. 当您在任何目录中需要源代码管理时,请执行:git init。您可以提交,撤消更改等。
  7. 快速(即使在Windows上)

进行相对大型项目的主要原因是第3点改善了沟通。其他都是不错的奖励。


我认为第一点是要说“其他人只有在您发布 ”(或“推送”)之后才能看到他们。
jackr 2010年

+1“您可以犯坏的事情。” 这是我考虑从svn切换到git的主要原因。在开发沉重的代码块的过程中,我总是很讨厌,而且我没有VCS的安全网(只是因为我的修改尚不可行,所以我不允许提交)。
2011年

15

有趣的是:我在Subversion Repos中托管项目,但是通过Git Clone命令访问它们。

请阅读在Google Code项目上使用Git开发

尽管Google Code的母语是Subversion,但是您可以在开发过程中轻松使用Git。搜索“ git svn”表明这种做法很普遍,我们也鼓励您尝试一下。

在Svn存储库上使用Git给我带来了好处:

  1. 我可以在多台计算机上进行分布式工作,并在它们之间进行提交和拉取
  2. 我有一个中央 backup/public svn存储库供他人签出
  3. 他们可以自由使用Git

3
这有点过时了,Google代码确实很实用,因此不再需要这种破解
Sam Saffron 2010年

@Sam,除非您碰巧喜欢git和/或不喜欢汞。
MatrixFrog 2010年

11

这里的所有答案都是以程序员为中心的,如预期的那样,但是,如果您的公司在源代码之外使用修订控制,将会发生什么?有很多不是源代码的文档都可以从版本控制中受益,它们应该靠近代码而不是另一个CMS。大多数程序员并不是孤立地工作-我们作为团队的一员为公司工作。

考虑到这一点,请比较Subversion和git在客户端工具和培训中的易用性。我看不到任何情况分布式修订版本控制系统都将更易于使用或向非程序员解释的情况。我希望证明自己是错误的,因为这样我就可以评估git,并且实际上希望它可以被那些需要版本控制且不是程序员的人所接受。

即使这样,如果管理层问到为什么我们应该从集中式修订控制系统转移到分布式修订控制系统,我也很难给出一个诚实的答案,因为我们不需要它。

免责声明:我很早就对Subversion感兴趣(大约v0.29),因此我很偏颇,但是自那时以来我工作的公司都从我的热情中受益,因为我一直鼓励并支持使用它。我怀疑大多数软件公司都是这样的。如此众多的程序员加入git潮流,我想知道有多少公司会错过在源代码之外使用版本控制的好处吗?即使您为不同的团队使用单独的系统,您也会错过一些好处,例如(统一的)问题跟踪集成,同时增加了维护,硬件和培训要求。


恕我直言,这是支持SVN的唯一有效理由。简而言之,向非程序员解释更容易,也就是说,那些希望以线性方式使用它并避免复杂的(=实际)VC场景的人:冲突,三向合并,分支。永远都不想让VCS合并PowerPoint演示文稿文件..
inger

2
“大多数程序员不是孤立地工作”似乎表明,会计师/市场人员必须在保存源代码的地方使用相同的回购协议。我看不到这种好处。我的一些前公司想对此类事情进行标准化,但它不可避免地失败了。我认为,简单化的方法对管理人员来说可能很好,但对程序员团队来说却过于简化了-因此统一这些方法会导致严重的妥协。
歌手

对于软件附带的文档,您是对的-应该一起对它们进行版本控制。我发现这些东西远没有人们最初想象的那么多(我们最终从源代码仓库中抛出了一个庞大的树文档)。此外,如果有问题(不是应该如此),您可以做很多事情来简化技术作者的工作流程等。
歌手

2
@inger我认为您不能说“这是唯一的正当理由”,对Subversion的AFAIK工具支持远远优于Git,例如TortoiseSVN以及与Visual Studio和Java IDE(如Eclipse)的集成。对于您来说,这可能不是问题,但对于我们而言,肯定是一个问题。我没有在回答中提及它,因为这是一个单独的问题。
si618

1
@Keyo,是的,非程序员确实需要花些时间来获取Subversion,但我认为使用git或Hg会花费更长的时间。如果可以维护Wiki,那就很好了,但以我的经验,开发人员更可能维护与源代码相关的文档(如果它们与源代码很接近)。我同意inger的观点,因为没有多少文件适合此类要求,但它们确实存在。您说git / Hg是完成工作的最佳工具,这很有趣,这是一个笼统的声明,可能并非在所有情况下都适用,git和Hg是否具有与SVN一样好的集成?
si618 2011年

9

Subversion仍然是一个使用更为广泛的版本控制系统,这意味着它具有更好的工具支持。您会发现几乎所有IDE都具有成熟的SVN插件,并且有不错的资源管理器扩展(例如TurtoiseSVN)。除此之外,我必须同意Michael的观点:Git并不比Subversion更好或更差,而是不同。


但现在,使用Git广泛了几年之后,我需要我自己不同意:Git是远远优于颠覆。至少一旦您克服了Git不友好的语法。
neu242 2011年

8

让SubVersion感到困扰的一件事是,它在项目的每个目录中都放置了自己的文件夹,而git仅在根目录中放置了一个文件夹。不是那样的交易的大,但这样的小东西加起来。

当然,SubVersion具有Tortoise,(通常)非常好。


5
.svn目录可能很快就会消失,可能是v1.7版
-gbjbaanb

8

David Richards WANdisco关于Subversion / GIT的博客

GIT的出现带来了许多DVCS原教旨主义者,即“吉特隆人”,他们认为除GIT之外的任何事物都是垃圾。Gitterons似乎认为软件工程发生在自己的孤岛上,并且常常忘记大多数组织并没有专门雇用高级软件工程师。没关系,但这不是市场上其他人的想法,我很高兴证明这一点:GIT在最近的市场中所占份额不到3%,而Subversion的用户数量在500万左右,其中一半左右整体市场。

我们看到的问题是Gitterons在Subversion射击(便宜)。诸如“颠覆是如此[缓慢/ cr脚/限制性/不好闻/以一种有趣的方式看着我]这样的推文,现在我有了GIT,[我一生中的所有工作/我的妻子怀孕了/我之后有了女朋友30年的尝试/我在二十一点桌上赢得了六次胜利]。您得到图片。


1
请注意,David Richards可能没有偏见:他生产的产品基于Subversion(或基于Subversion的思想),因此,他当然是亲Subversion和反Git的。
雅库布·纳伦斯基(JakubNarębski)2010年

2
具有讽刺意味的是,创建Git的原因是因为孤岛上不会进行软件工程。这句话太白痴了。
本·柯林斯

虽然我使用git,但我也很高兴与任何像Mercurial这样的DVCS一起工作。DVCS概念的普及需要时间,现在我看到大量开放源代码项目已转换为git。
Keyo

通过将svn批评者描绘为原教旨主义者,David避开了基本问题:颠覆性体系结构是死胡同。并不是说git是VCS的全部,它具有一定的优势,但是git,mercurial,darcs和许多其他VCS都具有从根本上来说更优雅的存储库模型。Subversion永远不会使合并工作生效,因为目录==分支模型无法实现真正​​的进度。像David's这样的公司可以保持越来越多的口红,但是svn不可避免地会落后于最先进的技术。
gtd

7

Git还使分支和合并变得非常容易。Subversion 1.5刚刚添加了合并跟踪,但是Git仍然更好。使用Git分支非常快速且便宜。这使得为​​每个新功能创建分支更加可行。与Subversion相比,Oh和Git存储库在存储空间方面非常有效。


6

一切都与执行某件事所需的易用性/步骤有关。

如果我要在PC /笔记本电脑上开发单个项目,则git会更好,因为它更容易设置和使用。您不需要服务器,也不需要在合并时继续输入存储库URL。

如果只有2个人,我想说git也更容易,因为您可以互相推拉。

但是,一旦超出了范围,我就会进行颠覆,因为此时您需要设置一个“专用”服务器或位置。

您可以使用git和SVN一样好地执行此操作,但是由于需要执行其他步骤来与中央服务器同步,因此git的好处远远超过了git。在SVN中,您只需提交即可。在git中,您必须先进行git commit,然后进行git push。仅仅因为您最终做了太多事情,其他步骤就变得烦人了。

SVN还具有更好的GUI工具的优势,但是git生态系统似乎正在迅速赶上,因此从长远来看,我不必担心。


11
在Git中将提交与发布分开是IMHO的优势而不是劣势。
2009年

好的,在以下情况下,您如何评价SVN的“易用性/执行某事所需的步骤”:-进行实验的主题分支-将该分支合并到另一个分支中-将文件中的已编辑内容拆分为自己较小的提交-快速检出主要分支以进行小的修补恕我直言,我不认为设置SVN服务器比设置git服务器更容易。以及为什么要放弃从轻量级分支机构获得的所有不错的好处,只是为了避免“不必单独推动”。
山姆

通常会在git的支持下提出“用于实验的主题分支”的论点,但是老实说,我从未真正看到有人在颠覆或其他非DVCS系统中真正做到这一点。也许这很重要,我们都错过了,但是据我所知,有99%的开发人员(包括我自己)都不关心主题分支,因为他们从未使用过主题分支!-您不能错过从未有过的经历:-)。我认为,如果DVCS人员打算提出“主题分支”作为功能,那么他们首先必须说服所有人,这些事情实际上是有用的。
Orion Edwards

同样,“将编辑的内容拆分为较小的提交”在理论上听起来不错。但是,在过去的3年中,我一次也没有想“哦,我希望我能做到这一点”,我挣扎,甚至想出了一个假设的情况,我可能要的功能......很多混蛋/ DVCS倡导者只是说“我们拥有X,X很棒”,其他所有人都坐在那里,想知道为什么地球上他们永远需要X
Orion Edwards 2010年


5

通常,Git和DVCS对于开发人员彼此独立执行大量编码非常有用,因为每个人都有自己的分支。但是,如果您需要其他人进行更改,则她必须提交其本地存储库,然后她必须将该更改集推送给您,或者您必须将其从她那里撤出。

我自己的推理也使我认为,如果您进行集中发行等工作,DVCS会使质量检查和发行管理更加困难。必须负责从其他所有人的存储库中进行该推/拉操作,解决在最初的提交时间之前已经解决的所有冲突,然后进行构建,然后让所有其他开发人员重新同步其存储库。

当然,所有这些都可以通过人工流程解决。DVCS只是打破了集中版本控制所修复的问题,以便提供一些新的便利。


1
实际上,如果您看起来像是管理Linux内核或git项目本身,那么您会发现Git非常适合“单一维护者”(或维护者+中尉)工作流程,其中一个由conss集中存储。而且可以轻松地临时切换到其他人作为维护者。
2009年

5

我喜欢Git,因为它实际上可以帮助中大型团队的开发人员之间进行交流。作为一个分布式版本控制系统,通过其推/拉系统,它可以帮助开发人员创建源代码生态系统,从而有助于管理大量从事单个项目的开发人员。

例如,说您信任5个开发人员,仅从其存储库中提取代码。每个开发人员都有他们自己的信任网络,从那里可以提取代码。因此,开发基于开发人员的信任结构,其中代码责任在开发社区之间共享。

当然,这里的其他答案中也提到了其他好处。


4

这些都暗示了一些答案,但我想明确指出两点:

1)进行选择性提交的能力(例如, git add --patch)。如果您的工作目录包含不属于同一逻辑更改的多个更改,则Git使得进行仅包含部分更改的提交非常容易。使用Subversion很难。

2)在不公开更改的情况下进行提交的能力。在Subversion中,任何提交都会立即公开,因此不可撤销。这极大地限制了开发人员“提早提交,经常提交”的能力。

Git不只是一个VCS;它也是开发补丁的工具。Subversion仅仅是一个VCS。


4
关于1)如果您使用的是TortoiseSVN,AnkhSVN等,那么选择要提交更改的文件非常容易(琐碎)。关于2)如果您不希望其他开发人员获取代码,请创建一个分支,然后在准备好时合并,这并不困难。
si618

不可撤销?好吧,您可以将错误的提交反向合并,存储库将像以前一样。但是您是对的,它已被记录在案。但是,这是好是坏?我想这取决于...
schoetbi 2010年

@schoetbi不,存储库的头与以前一样。现在,存储库本身包含两个提交,但是如果两个提交都不存在,那就太好了。当您查看日志时,这会使您放慢速度,这会造成额外的混乱。当然,这也可能在git中发生,特别是如果某些开发人员习惯于在提交后立即进行推送。但是,避免使用git更容易。
MatrixFrog 2010年

4

我认为Subversion很好..直到您开始合并..或做任何复杂的事情..或做Subversion认为很复杂的事情(例如执行查询以找出哪个分支与特定文件混淆,更改实际来自何处,检测复制和粘贴)等)。

我不同意最终的答案,他说GIT 的主要好处是脱机工作-这固然有用,但是对于我的用例来说,它更像是一个额外的东西。SVK也可以脱机工作,但毫无疑问,我可以选择哪个时间来投入我的学习时间。

只是它功能强大且快速,并且在习惯了这些概念之后就非常有用(在这种意义上是:用户友好)。

有关合并故事的更多详细信息,请参见: 使用git-svn(或类似的)*只是*来帮助进行svn合并?


3

由于它不需要与中央服务器持续通信的事实,几乎每个命令都在不到一秒钟的时间内运行(显然git push / pull / fetch速度较慢,仅因为它们必须初始化SSH连接)。分支要容易得多(一个简单的命令即可分支,一个简单的命令即可合并)


3

我绝对喜欢能够在Git中管理我的源代码的本地分支,而又不会浪费中央存储库的资源。在许多情况下,我都会从Subversion服务器中签出代码并运行本地Git存储库以实现此目的。初始化Git存储库不会污染到处都是一堆烦人的.svn文件夹,这也很棒。

就Windows工具的支持而言,TortoiseGit可以很好地处理基础知识,但是除非我想查看日志,否则我还是更喜欢命令行。我非常喜欢Tortoise {Git | SVN}在读取提交日志时的帮助方式。


3

这是一个错误的问题。专注于git的疣,就至少在某些使用情况下,Subversion为何表面上看起来更好更好,形成论点太容易了。git最初被设计为低级版本控制构造集,并且具有面向Linux开发人员的巴洛克式界面,这一事实使圣战更容易获得吸引力和合法性。Git的拥护者以数百万个工作流程的优势振奋人心,SVN的人宣称这是不必要的。很快,整个辩论被归结为集中式与分布式,这符合企业svn工具社区的利益。这些公司通常发布有关颠覆在企业中的优势的最具说服力的文章,

但这是问题所在:Subversion是体系结构的死胡同

尽管svn的使用时间是svn的两倍以上,但是您甚至可以轻松地使用git并构建集中式的subversion替代品,即使svn都无法像git一样在任何地方实现基本的合并跟踪。这样做的一个基本原因是使分支与目录相同的设计决策。我不知道为什么他们本来会这样,这肯定会使部分结帐非常简单。不幸的是,这也使得无法正确跟踪历史记录。现在显然您应该使用颠覆存储库布局约定来将分支与常规目录分开,并且svn使用一些启发式方法使事情在日常使用情况下正常工作。但是,所有这些都只是在记录一个非常糟糕且有限的低级设计决策。能够执行版本库差异(而不是目录差异)是版本控制系统的基本和关键功能,它极大地简化了内部结构,从而有可能在其之上构建更智能,更有用的功能。您可以看到扩展颠覆所付出的努力,但与诸如合并解析之类的基本操作相比,它与当前的现代VCS相比却相去甚远。

现在,对于那些仍然相信Subversion在可预见的将来足够好的人,这是我的衷心和不可知论的建议:

Subversion永远不会赶上从RCS和CVS的错误中吸取教训的新型VCS。除非他们从头开始重新构建存储库模型,否则这在技术上是不可能的,但是那真的不是svn吗?无论您认为自己没有现代VCS的功能有多少,您的无知都不会使您免受Subversion的陷阱的困扰,其中许多情况是其他系统无法或无法轻松解决的。

像svn一样,解决方案的技术劣势如此明显是极为罕见的,当然我永远不会对win-vs-linux或emacs-vs-vi提出这样的看法,但是在这种情况下,它是如此明确,源代码控制是开发人员手中的如此基本工具,我认为必须明确指出。不管出于组织原因而使用svn的要求,我恳求所有svn用户不要让他们的逻辑思维错误地认为,更现代的VCS仅对大型开源项目有用。无论开发工作的性质如何,如果您是一名程序员,那么如果您学会了如何使用设计更好的VCS(无论是Git,Mercurial,Darcs还是其他许多类型的VCS),都将成为一名更有效的程序员。


2

Subversion非常易于使用。在过去的几年中,我从未发现任何问题或无法正常工作。另外,还有许多出色的GUI工具,并且对SVN集成的支持很大。

使用Git,您可以获得更灵活的VCS。您可以像在远程仓库中使用SVN一样使用它,并在其中提交所有更改。但是您也可以在离线状态下使用它,并且仅将更改不时推送到远程存储库。但是Git更复杂,学习曲线更陡峭。我第一次发现自己犯了错误的分支,间接创建分支或收到错误消息,但其中包含有关错误的信息以及我必须在Google进行搜索以获取更好信息的信息不多。一些简单的事情(例如标记的替换($ Id $))不起作用,但是GIT具有非常灵活的筛选和挂钩机制来合并自己的脚本,因此您可以获得所需的所有东西,但还需要更多的时间和文档阅读时间;)

如果您大多数情况下都是使用本地存储库进行脱机工作,则如果本地计算机上丢失了某些内容,则将没有备份。使用SVN时,您主要是在使用远程存储库,这也是您在另一台服务器上进行备份的时间。Git可以以相同的方式工作,但这并不是Linus拥有SVN2之类的主要目标。它是为Linux内核开发人员和分布式版本控制系统的需求而设计的。

Git比SVN好吗?只需一些版本历史记录和备份机制的开发人员,使用SVN可以轻松自如。经常与分支机构合作,同时测试更多版本或大部分离线工作的开发人员可以从Git的功能中受益。有一些非常有用的功能,例如SVN找不到的隐藏功能,可以使生活更轻松。但另一方面,并​​非所有人都需要所有功能。因此,我看不到SVN的死机。

Git需要一些更好的文档,并且错误报告必须更有帮助。而且,现有的有用GUI很少。这次,我仅找到1个Linux的GUI,它支持大多数Git功能(git-cola)。Eclipse集成正在运行,但尚未正式发布,并且没有正式的更新站点(只有一些带有定期构建的外部更新站点,可以通过主干http://www.jgit.org/updates进行)因此,这是当今使用Git的首选方法是命令行。


2

SourceGear的Eric Sink撰写了一系列有关分布式和非分布式版本控制系统之间差异的文章。他比较了大多数流行的版本控制系统的优缺点。非常有趣的阅读。
可以在他的博客www.ericsink.com上找到文章:


2

对于寻求良好Git GUI的人来说,Syntevo SmartGit可能是一个很好的解决方案。我认为,它的专有但非商业用途免费,可在Windows / Mac / Linux上运行,甚至使用某种git-svn桥支持SVN。


1

http://subversion.wandisco.com/component/content/article/1/40.html

我认为可以肯定地说,在开发人员中,SVNVs。Git的争论已经有一段时间了,每个人都有更好的观点。在我们于2010年及以后举办的有关Subversion的网络研讨会中,甚至提出了这些问题。

我们的开源总监兼Subversion公司总裁Hyrum Wright谈到了Subversion与Git以及其他分布式版本控制系统(DVCS)之间的区别。

他还谈到了Subversion即将发生的变化,例如下一代工作副本(WC-NG),他认为这将导致许多Git用户转换回Subversion。

观看他的视频,并通过评论此博客或在我们的论坛中发布让我们知道您的想法。注册很简单,只需要一点时间!


显然有偏见,因为他的工具基于Subversion。只是说。
JakubNarębski2010年


1

我最近一直居住在Git土地上,我喜欢将其用于个人项目,但是鉴于工作人员对需求的看法发生了变化,如果没有紧迫的好处,我还无法将工作项目从Subversion切换到它。此外,我们内部运行的最大项目非常依赖svn:externals,从我到目前为止所看到的来看,它在Git中无法很好地,无缝地工作。


1

首先,并发版本控制似乎很容易解决。一点也不。无论如何...

SVN非常不直观。Git更糟。[讽刺的推测]这可能是因为像并发版本控制这样的难题一样,开发人员对制作一个好的UI并没有太大的兴趣。[/讽刺推测]

SVN支持者认为他们不需要分布式版本控制系统。我也这么认为。但是,既然我们只使用Git,我就是一个信徒。现在,版本控制对我和团队/项目都有效,而不仅仅是为项目工作。当我需要分支时,我分支。有时,这是一个分支,在服务器上具有相应的分支,有时则没有。更不用说我将要继续研究的所有其他优点(部分由于现代版本控制系统UI的神秘而荒唐的缺乏)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.