我已经在Windows上使用git有一段时间了(使用msysGit),我喜欢分布式源代码控制的想法。就在最近,我一直在关注Mercurial (hg),它看起来很有趣。然而,我无法理解hg和git之间的区别。

有人把git和hg放在一起比较吗?我很想知道hg和git有什么不同,而不需要加入粉丝的讨论。


当前回答

mercurial和git的另一个有趣的比较:mercurial vs 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在我看来更加优雅。

mercurial和git的另一个有趣的比较:mercurial vs git。 主要关注内部结构及其对分支过程的影响。

以下文章可能会有所帮助:

Git vs Mercurial:请放松(Git是百战天龙,Mercurial是詹姆斯·邦德) Mercurial和Git的区别

编辑:把Git和Mercurial比作名人似乎是一种趋势。这里还有一个:

Git是Wesley Snipes, Mercurial是Denzel Washington

I'm currently in the process of migrating from SVN to a DVCS (while blogging about my findings, my first real blogging effort...), and I've done a bit of research (=googling). As far as I can see you can do most of the things with both packages. It seems like git has a few more or better implemented advanced features, I do feel that the integration with windows is a bit better for mercurial, with TortoiseHg. I know there's Git Cheetah as well (I tried both), but the mercurial solution just feels more robust.

因为它们都是开源的(对吧?)我认为这两款游戏都不会缺少重要的功能。如果某样东西很重要,人们就会提出要求,就会编写代码。

我认为对于常见的实践,Git和Mercurial已经足够了。它们都有使用它们的大型项目(Git -> linux内核,Mercurial -> Mozilla基金会项目,当然都在其他项目中),所以我不认为它们真的缺少什么。

也就是说,我对其他人对此的看法很感兴趣,因为这将为我的博客努力提供一个很好的来源;-)

如果从SVN迁移,请使用Mercurial,因为它的语法对SVN用户来说更容易理解。除此之外,任何一种选择都不会错。但是在选择之前一定要检查GIT教程和HGinit。