我正在启动一个新的分布式项目。我应该使用SVN还是Git,为什么?
我正在启动一个新的分布式项目。我应该使用SVN还是Git,为什么?
SVN是一个仓库和多个客户端。Git则是一个包含许多客户端仓库的仓库,每个仓库都有一个用户。Git分散到一个地步,人们可以在本地跟踪自己的编辑而不必将事物推送到外部服务器。
SVN旨在更加中心化,而Git则基于每个用户拥有自己的Git仓库,这些仓库将更改推送回中心仓库。因此,Git提供了更好的本地版本控制。
与此同时,您可以在TortoiseGit、GitExtensions之间进行选择(如果您将“中央”Git仓库托管在Github上,则可以使用他们自己的客户端-GitHub for Windows)。
如果您想要摆脱SVN,则可以考虑一下Bazaar。它是下一代版本控制系统之一,具有这种分布式元素。它不像git那样依赖POSIX,因此有原生的Windows版本,并且拥有一些强大的开源品牌支持。
但是,您可能甚至还不需要这些功能。请查看分布式版本控制系统的特点、优点和缺点。如果您需要比SVN更多的功能,请考虑使用其中一种。如果不需要,那么您可能希望坚持使用SVN(目前)更好的桌面集成。
我从未理解过"git在Windows下不好"这一概念;我专门在Windows下开发,从来没有遇到过任何与git有关的问题。
我绝对推荐git而非subversion;它更加多才多艺,可以以subversion做不到的方式进行“离线开发”。git适用于几乎所有想得到的平台,并且拥有比你可能会使用的功能还要多的功能。
这是我在2009年九月关于Git与SVN的回答一些后来被删除的重复问题的副本的副本。
更好了吗?除了常规链接为什么Git比X更好之外,它们是不同的:
一个是基于便宜分支和标记的中央版本控制系统, 另一个(Git)则是基于修订版本图的分布式版本控制系统。 另请参见VCS的核心概念。
第一部分引发了一些误解的评论,声称这两个程序(SVN和Git)的基本目的相同,但它们实现方式非常不同。
为澄清SVN和Git之间的根本区别,让我重新表述一下:
SVN是修订控制的第三个实现:RCS,然后是CVS,最后是SVN 管理版本化数据的目录。 SVN提供VCS功能(标记和合并),但其标记只是目录副本(像分支一样,除了您不“应该”触摸标记目录中的任何内容),而其合并仍然很复杂,目前基于添加的元数据来记住已合并了什么。
Git是一个文件内容管理(用于合并文件的工具),进化成真正的版本控制系统,基于提交的DAG(有向无环图),其中分支是数据历史的一部分(而不是数据本身),而标记是真正的元数据。
说它们在"根本上"没有不同,因为您可以实现相同的事情,解决相同的问题是...纯粹错误的。
尽管那个旧答案已被删除,但评论仍然坚称:
VonC:您混淆了实现中的基本差异(这些差异非常基础,我们显然都同意这一点)和目的上的差异。
它们是用于相同目的的工具:这就是为什么许多以前使用 SVN 的团队已经成功地放弃它转而使用 Git。
如果它们没有解决相同的问题,这种可替代性就不存在。
对此我回答道:
"可替代性"…有趣的术语(在计算机编程中使用)。
当然,Git 绝不是 SVN 的子类型。
虽然两者都可以实现相同的技术特性(标签、分支、合并),但 Git 不会妨碍你,且允许你专注于文件内容,而不必考虑工具本身。
当然,并不是总能够只通过使用 Git 替换 SVN "而不改变该程序的任何理想属性(正确性、执行的任务等)"(这引用了上述可替代性定义):
再次强调,它们的本质根本不同(这导致了不同的实现方法,但这不是重点)。
其中一种将修订控制视为目录和文件,而另一种只看文件内容(如此之多,以至于空目录在Git中甚至都不会被注册!)。
总体目标可能是相同的,但是您不能以相同的方式使用它们,也不能解决相同类别的问题(在范围或复杂性上)。
SVN的两个很少被提到的优点:
大文件支持。除了代码,我使用SVN来管理我的主目录。 SVN是唯一一个不会在TrueCrypt文件上出现问题(如果有其他能够有效处理500MB +文件的VCS,请纠正我)。这是因为差异比较是流式传输的(这是一个非常重要的点)。 Rsync不可接受,因为它不支持双向传输。
局部存储库(子目录)的检出/签入。Mercurial和bzr不支持此功能,git的支持也有限。这在团队环境中很糟糕,但如果我想从我的主目录中的另一台计算机检查某些内容,则非常宝贵。
以上是我的经验。
阅读完所有这些内容之后,我相信Git是正确的选择(尽管存在一点学习曲线)。我也在Windows平台上使用过Git和SVN。
在阅读以上内容后,我很想听听其他人的意见。
我会建立一个Subversion代码库。这样做的好处是,个别开发人员可以选择使用Subversion客户端或Git客户端(使用git-svn
)。虽然使用git-svn
不能获得完整的Git解决方案的所有优势,但它确实给了个别开发人员对其自己工作流程的很大控制力。
我相信不久的将来,Git在Windows上将会和在Unix和Mac OS X上一样好用(因为你问了这个问题)。
Subversion有优秀的Windows工具,如TortoiseSVN对Explorer的集成以及AnkhSVN对Visual Studio的集成。
现在世界发生了一些变化。Git在Windows上有了良好的实现。虽然我没有在Windows上进行全面测试(因为我不再使用这个系统),但我非常自信,所有主要的版本控制系统(SVN、Git、Mercurial、Bazaar)现在都有适当的Windows实现。这对SVN的优势已经消失了。其他方面(集中式与分布式以及工具支持检查)仍然有效。