GitMercurialSVN

Posted 零君聊软件

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GitMercurialSVN相关的知识,希望对你有一定的参考价值。

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


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


SVN的分支(branch)和标志(tag)本质是相同的,其实都是仓库(repository)的复制而已。分支一般是复制到${ROOT}/branches目录,而标志则是复制到${ROOT}/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

svn add hg add git add
svn blame hg blame git blame
svn cat hg cat git show
svn checkout hg clone git clone
svn commit hg commit ; hg push git commit -a ; git push
svn delete/remove hg remove git rm
svn diff hg diff git diff, git diff –cached
svn help hg help git help
svn log hg log git log
svn revert hg revert git checkout -f
svn status hg status git status
svn update hg pull –update git pull
svn move/rename hg move/rename git mv


--END--


以上是关于GitMercurialSVN的主要内容,如果未能解决你的问题,请参考以下文章