我使用 Subversion 几年了,相比于 SourceSafe,我更喜欢 Subversion。加上 TortoiseSVN,我实在想象不出还有什么更好的。
然而,越来越多的开发人员声称 Subversion 存在问题,我们应该转向新型分布式版本控制系统,例如 Git。
Git 如何改进 Subversion?
我使用 Subversion 几年了,相比于 SourceSafe,我更喜欢 Subversion。加上 TortoiseSVN,我实在想象不出还有什么更好的。
然而,越来越多的开发人员声称 Subversion 存在问题,我们应该转向新型分布式版本控制系统,例如 Git。
Git 如何改进 Subversion?
Git并不比Subversion更好,也不比它更差。它只是不同。
最大的区别在于Git是分布式的。想象一下你是一个开发者,你在路上工作,在笔记本电脑上开发,并想要进行源代码控制,以便可以返回之前的版本。
使用Subversion时,你会遇到一个问题:SVN存储库可能在你无法访问的位置(在公司里,而你此时没有互联网连接),因此你无法提交。如果你想要复制你的代码,你必须直接复制/粘贴。
使用Git时,你就不会有这个问题。你的本地拷贝就是一个存储库,你可以对它进行提交并获得所有源码控制的好处。当你重新连接到主存储库时,你可以向它进行提交。
这看起来很不错,但请记住这种方法增加了复杂性。
Git似乎是“新的、闪亮、酷”的东西。它绝不是坏东西(毕竟是Linus为Linux内核开发编写的原因),但我认为许多人跳上“分布式源码控制”列车只是因为它是新的,由Linus Torvalds编写,而实际上他们并不知道为什么/是否更好。
Subversion有问题,但Git、Mercurial、CVS、TFS或其他工具也同样如此。
编辑:所以这篇回答已经一年了,依然产生很多赞,因此我想再添加一些解释。自从写下这篇文章以来的最后一年里,Git获得了很多动力和支持,特别是自从像GitHub这样的网站真正开始流行起来之后。我现在同时使用Git和Subversion,并想分享一些个人见解。
首先,在分散式工作时,Git可能会让人感到非常困惑。什么是远程(remote)?如何正确设置初始存储库(repository)?这是一开始经常遇到的两个问题,特别是与SVN简单的 "svnadmin create "相比,Git的 "git init" 可以带有参数--bare和--shared,这似乎是设置集中式存储库的“正确”方式。虽然有原因,但这增加了复杂性。“checkout”命令的文档对于转换的人非常令人困惑——“正确”的方式似乎是“git clone”,而“git checkout”似乎是用于切换分支。当你是分散的时,Git真的很出色。我在家里有一个服务器,在路上有一个笔记本电脑,而SVN在这里根本无法正常工作。对于SVN,如果没有连接到存储库,我就无法进行本地源代码控制(是的,我知道SVK或者复制存储库的方法)。而对于Git,那就是默认模式。它是一个额外的命令(git commit在本地提交,而git push origin master将主分支推送到名为“origin”的远程)。
如上所述:Git增加了复杂性。创建存储库的两种模式,checkout与clone,commit与push...您必须知道哪些命令在本地工作,哪些命令与“服务器”一起工作(我假设大多数人仍然喜欢中央“主存储库”)。
此外,至少在Windows上,Git的工具仍然不足。是的,有一个Visual Studio AddIn,但我仍然使用带有msysgit的git bash。
SVN的优点是学习起来要简单得多:有你的存储库,所有更改都针对它进行,如果你知道如何创建、提交和checkout,你就可以开始并且稍后可以掌握分支、更新等内容。
Git的优点是,如果有些开发人员没有始终连接到主存储库,那么它非常适用。而且它比SVN快得多。从我听到的消息来看,分支和合并支持要好得多(这是可以预料的,因为这些是它被编写的核心原因)。
这也解释了为什么Git在互联网上引起如此大的轰动,因为Git非常适合开源项目:只需Fork它,将更改提交到您自己的Fork中,然后请求原始项目维护者拉取您的更改。使用Git,这很简单。确实,试试在Github上使用它,它就像魔术一样。
我还看到了Git-SVN桥接器:中央仓库是Subversion repo,但开发人员在本地使用Git进行工作,然后通过桥接器将更改推送到SVN。
但即使加入了这个冗长的补充,我仍然坚持我的核心信息:Git并不比SVN更好或更差,它只是不同。如果您需要“离线源代码控制”并愿意花费额外的时间学习它,那么它非常棒。但如果您有一个严格集中化的源代码控制,或者因为同事们没有兴趣而努力介绍源代码控制,那么SVN在简单性和出色的工具(至少在Windows上)方面更胜一筹。
使用Git,你几乎可以离线做任何事情,因为每个人都有自己的代码库。
创建分支和分支之间的合并非常容易。
即使您没有项目的提交权限,您仍然可以拥有自己的在线代码库,并发布“推送请求”以进行补丁。喜欢您的补丁的每个人都可以将其拉入他们的项目中,包括官方维护者。
轻松地fork一个项目,修改它,同时仍然可以从HEAD分支合并bugfixes。
Git适用于Linux内核开发人员。这意味着它非常快(必须如此),并可扩展到数千名贡献者。Git还使用更少的空间(Mozilla代码库的空间高达30倍)。
Git非常灵活,非常TIMTOWTDI(有多种方法可以做到)。您可以使用任何工作流程,Git都将支持它。
最后,还有GitHub,这是一个托管您的Git代码库的好网站。
Git的缺点:
git mv
和 git rm
命令来完成。 - R. Martinho Fernandes也存在一些缺点:
在最简单的使用情况下,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最擅长的是分支和与他人合作工作。
这个技术是分布式的。基准测试表明,它的速度要快得多(由于其分布式的性质,像差异和日志等操作都是本地操作,因此在这种情况下速度自然会非常快),而且工作文件夹也更小(这仍然让我感到惊讶)。
当你使用Subversion或其他客户端/服务器版本控制系统时,你实际上是通过“检出”版本在你的计算机上创建工作副本。这代表了仓库看起来的某个时间点的快照。你可以通过更新来更新你的工作副本,并通过提交来更新仓库。
使用分布式版本控制,你没有快照,而是拥有整个代码库。想要查看3个月前的版本差异?没问题,3个月前的版本仍然在你的电脑上。这不仅意味着事情要快得多,而且如果你与中央服务器断开连接,你仍然可以执行许多你习惯的操作。换句话说,你不仅拥有给定版本的快照,而是整个代码库。
你可能认为Git会占用大量硬盘空间,但根据我看到的一些基准测试,它实际上占用更少的空间。别问我怎么回事。我的意思是,它是由Linus创建的,他对文件系统也有一些了解。
我喜欢关于分布式版本控制系统的以下几点:
对于相对较大的项目来说,最主要的原因是第3点所带来的改进的沟通。其他点则是美好的额外收获。
有趣的是:我在 Subversion 仓库中托管项目,但通过 Git Clone 命令访问它们。
虽然 Google Code 原生支持 Subversion,但您可以轻松地在开发过程中使用 Git。搜索“git svn”表明这种做法已经很普遍了,我们也鼓励您尝试一下。
在 Svn 仓库上使用 Git 有以下好处:
Subversion仍然是一个更为常用的版本控制系统,这意味着它具有更好的工具支持。几乎任何集成开发环境(IDE)都有成熟的SVN插件,并且还有一些良好的资源管理器扩展可用(例如TurtoiseSVN)。除此之外,我必须同意Michael的观点:Git并不比Subversion更好或更差,它只是不同。