我已经在Windows上使用git有一段时间了(使用msysGit),我喜欢分布式源代码控制的想法。就在最近,我一直在关注Mercurial (hg),它看起来很有趣。然而,我无法理解hg和git之间的区别。
有人把git和hg放在一起比较吗?我很想知道hg和git有什么不同,而不需要加入粉丝的讨论。
我已经在Windows上使用git有一段时间了(使用msysGit),我喜欢分布式源代码控制的想法。就在最近,我一直在关注Mercurial (hg),它看起来很有趣。然而,我无法理解hg和git之间的区别。
有人把git和hg放在一起比较吗?我很想知道hg和git有什么不同,而不需要加入粉丝的讨论。
当前回答
我在Mercurial上工作,但从根本上说,我认为这两个系统是等价的。它们都使用相同的抽象:组成历史的一系列快照(变更集)。每个变更集都知道它来自哪里(父变更集),并且可以有许多子变更集。最近的hg-git扩展提供了Mercurial和Git之间的双向桥梁,并在某种程度上显示了这一点。
Git非常注重改变这个历史图(以及由此产生的所有后果),而Mercurial不鼓励重写历史,但这很容易做到,而且这样做的后果正是您应该期望的(也就是说,如果我修改了您已经拥有的变更集,如果您从我这里提取,您的客户端将会认为它是新的)。所以Mercurial偏向于非破坏性命令。
至于轻量级分支,Mercurial从……开始就支持具有多个分支的存储库了。,我总是这样想。具有多个分支的Git存储库正是这样:在单个存储库中有多个分散的开发链。Git然后将名称添加到这些链中,并允许您远程查询这些名称。Mercurial的Bookmarks扩展添加了本地名称,在Mercurial 1.6中,您可以在推/拉时移动这些书签。
我使用Linux,但显然TortoiseHg在Windows上比Git更快更好(由于更好地使用了糟糕的Windows文件系统)。http://github.com和http://bitbucket.org都提供在线托管,Bitbucket的服务很棒,响应迅速(我还没有尝试过github)。
我选择了Mercurial,因为它让我感觉干净和优雅——我对Git的shell/Perl/Ruby脚本很反感。如果你想知道我的意思,试着看一下git-instaweb.sh文件:它是一个shell脚本,生成一个Ruby脚本,我认为它运行一个web服务器。shell脚本生成另一个shell脚本来启动第一个Ruby脚本。此外,还有一些Perl代码。
我喜欢将Mercurial和Git与James Bond和MacGyver进行比较的博客文章——Mercurial在某种程度上比Git更低调。在我看来,使用Mercurial的人并没有那么容易被打动。这反映在每个系统如何完成Linus所描述的“最酷的合并!”在Git中,你可以通过以下方式合并一个不相关的存储库:
git fetch <project-to-union-merge>
GIT_INDEX_FILE=.git/tmp-index git-read-tree FETCH_HEAD
GIT_INDEX_FILE=.git/tmp-index git-checkout-cache -a -u
git-update-cache --add -- (GIT_INDEX_FILE=.git/tmp-index git-ls-files)
cp .git/FETCH_HEAD .git/MERGE_HEAD
git commit
这些命令在我看来很神秘。在Mercurial中,我们这样做:
hg pull --force <project-to-union-merge>
hg merge
hg commit
注意Mercurial命令是多么简单,一点也不特殊——唯一不寻常的事情是hg拉取的——force标志,这是必需的,因为当您从不相关的存储库进行拉取时,Mercurial将中止。正是这样的差异使Mercurial在我看来更加优雅。
其他回答
如果你是一名Windows开发人员,正在寻找基本的断开连接的版本控制,那么使用Hg。我发现Git难以理解,而Hg很简单,与Windows shell集成得很好。我下载了Hg,并遵循了这个教程(hginit.com) -十分钟后,我有了一个本地回购,并重新开始我的项目。
Git是一个平台,Mercurial“只是”一个应用程序。Git是一个版本控制的文件系统平台,附带了一个DVCS应用程序,但与平台应用程序一样,它比集中的应用程序更复杂,也更粗糙。但这也意味着git的VCS非常灵活,你可以用git做大量非源代码控制的事情。
这就是区别的本质。
Git is best understood from the ground up – from the repository format up. Scott Chacon’s Git Talk is an excellent primer for this. If you try to use git without knowing what’s happening under the hood, you’ll end up confused at some point (unless you stick to only very basic functionality). This may sound stupid when all you want is a DVCS for your daily programming routine, but the genius of git is that the repository format is actually very simple and you can understand git’s entire operation quite easily.
对于一些更偏向技术的比较,我个人看过的最好的文章是Dustin Sallings的:
Mercurial和Git的区别 Reddit上有经验丰富的达斯汀回答他自己的新手问题的帖子
实际上,他已经广泛地使用了这两种DVCSs,并且对它们都很了解——最后他更喜欢git。
在bitbucket.org的mercurial和github的git之间需要注意的一件事是,mercurial可以有尽可能多的私人存储库,但github你必须升级到付费帐户。所以,这就是为什么我选择使用mercurial的bitbucket。
这个链接可以帮助你理解其中的区别 http://www.techtatva.com/2010/09/git-mercurial-and-bazaar-a-comparison/
去年的某个时候,我评估了git和hg供我自己使用,并决定使用hg。我觉得它看起来是一个更干净的解决方案,并且在更多的平台上工作得更好。不过,这基本上是一个未知数。
最近,我开始使用git,因为git-svn和充当Subversion客户端的能力。这征服了我,现在我完全换成了git。我认为它的学习曲线略高(特别是当你需要探究内部时),但它确实是一个很棒的系统。我要去读约翰发表的那两篇比较文章。