Git、Mercurial、SVN

有过一定软件开发经验的人对版本控制(version control)一定不会陌生。在众多的版本控制系统中,Git可以说是目前最流行的。本文简要介绍了Git与其它版本控制系统的区别。过几天我会单独撰文着重介绍Git中的几个重要的概念。

SVN是Subversion的简称,是一种集中式的版本控制系统,相对于CVS有了极大的改进。由于SVN采用集中式管理,所以只有服务器上才有代码库(repository),本地只有工作目录(working directory)。如果服务器断开连接,那么就无法继续工作了。

SVN的分支(branch)和标志(tag)本质是相同的,其实都是仓库(repository)的复制而已。分支一般是复制到$/branches目录,而标志则是复制到$/tags目录。通常的做法是在服务器端完成复制,然后下载到客户端的工作目录中:

$svn copy http://svn.example.com/repos/testprj/trunk \

http://svn.example.com/repos/testprj/branches/mybranch \

-m "Creating my private branch"

$svn checkout http://svn.example.com/repos/testprj/branches/mybranch

注意,这里其实SVN并没有真的拷贝所有数据,而是采用的一种廉价拷贝(Cheap Copies)的机制,只是创建了指向现有的目录树的一个目录项。关于SVN更详细地细节,可以参考下面的链接:

http://svnbook.red-bean.com/en/1.7/svn-book.pdf

Git和Mercurial都是分布式的版本控制系统。两者比较相似,客户端都有仓库的完整镜像,包括完整的历史版本信息。但二者还是有许多区别。

首先,Git主要是C实现的,而Mercurial主要是Python实现的。所以Mercurial的平台支持性更好,也更易于扩展。当然,Git的很多工具也可以用其他语言实现,而且Git也提供了Windows的版本。所以这方面的差异逐步在缩小。

其次,Git支持改写历史,而Mercurial则不允许改写历史。Git提供的rebase机制可以改写历史,这给Git招来一些批评,但同时也给Git带来一定的灵活性。关于rebase,会单独撰文重点介绍。

Git将所有的元数据(metadata)存储在.git目录中,而Mercurial的元数据则是存储在.hg目录中。Git的所有对象都是根据hash值来存储的,目录结构都是按确定的规则来存储,具体参考:

https://git-scm.com/book/en/v2/Git-Internals-Git-Objects

而Mercurial则在.hg/store/data目录里面映射了完整的仓库目录结构。

Git和Mercurial还有一个重要的区别在于,Git的每一次提交(commit)都产生一个commit对象,该对象包含一个指向仓库的一个完整的快照(snapshot)的指针,同时包含指向parent commit对象的指针。而Mercurial中则是changeset的概念,是以revlog的格式来存储差异的,其实本质就是针对某个特定文件的顺序排列的diff。而Git则是将差异存储在pack文件中,存储的是一组文件的差异。

另外,普遍认为Mercurial比Git容易上手,特别是当从SVN切换到Mercurial时更容易。Git的学习曲线稍陡。

表格中的命令对比来自下面的链接,贴在这里供参考:

https://www.atlassian.com/blog/software-teams/mercurial-vs-git-why-mercurial

Subversion (SVN)Mercurial (Hg)Git

--END--

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180430G1C96W00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券