我已经在Windows上使用git有一段时间了(使用msysGit),我喜欢分布式源代码控制的想法。就在最近,我一直在关注Mercurial (hg),它看起来很有趣。然而,我无法理解hg和git之间的区别。
有人把git和hg放在一起比较吗?我很想知道hg和git有什么不同,而不需要加入粉丝的讨论。
我已经在Windows上使用git有一段时间了(使用msysGit),我喜欢分布式源代码控制的想法。就在最近,我一直在关注Mercurial (hg),它看起来很有趣。然而,我无法理解hg和git之间的区别。
有人把git和hg放在一起比较吗?我很想知道hg和git有什么不同,而不需要加入粉丝的讨论。
当前回答
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。
其他回答
以下文章可能会有所帮助:
Git vs Mercurial:请放松(Git是百战天龙,Mercurial是詹姆斯·邦德) Mercurial和Git的区别
编辑:把Git和Mercurial比作名人似乎是一种趋势。这里还有一个:
Git是Wesley Snipes, Mercurial是Denzel Washington
我在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系统。Mercurial是本地支持的,Git不支持。你可以通过bitbucket.org获得与github.com非常相似的托管(实际上更好,因为你得到了一个免费的私有存储库)。我曾经使用过一段时间的msysGit,但后来转到Mercurial,我对它非常满意。
我意识到这不是答案的一部分,但在这一点上,我也认为像NetBeans和Eclipse这样的平台的稳定插件的可用性在某种程度上决定了哪种工具更适合这项任务,或者更确切地说,哪种工具最适合“你”。也就是说,除非你真的想用cli方法。
Eclipse(以及基于它的一切)和NetBeans有时在远程文件系统(如SSH)和文件的外部更新方面都有问题;这也是为什么你希望你选择的任何东西都能“无缝”工作的另一个原因。
我现在也在为自己回答这个问题。我已经把候选人归结为Git或Mercurial ..感谢大家在没有宗教色彩的情况下就这个话题提供有用的意见。
去年的某个时候,我评估了git和hg供我自己使用,并决定使用hg。我觉得它看起来是一个更干净的解决方案,并且在更多的平台上工作得更好。不过,这基本上是一个未知数。
最近,我开始使用git,因为git-svn和充当Subversion客户端的能力。这征服了我,现在我完全换成了git。我认为它的学习曲线略高(特别是当你需要探究内部时),但它确实是一个很棒的系统。我要去读约翰发表的那两篇比较文章。