协慌网

登录 贡献 社区

Mercurial 和 Git 有什么区别?

我一直在 Windows 上使用 git 一段时间(使用 msysGit),我喜欢分布式源代码控制的想法。就在最近,我一直在关注 Mercurial(hg),它看起来很有趣。但是,我无法解决 hg 和 git 之间的差异。

有没有人在 git 和 hg 之间进行并列比较?我很想知道 hg 和 git 的不同之处,而不必参加讨论。

答案

这些文章可能有所帮助

编辑 :比较 Git 和 Mercurial 与名人似乎是一种趋势。还有一个:

我在 Mercurial 工作,但从根本上说我相信这两个系统都是等价的。它们都使用相同的抽象:构成历史的一系列快照(变更集)。每个变更集都知道它来自哪里(父变更集)并且可以有许多子变更集。最近的hg-git扩展提供了 Mercurial 和 Git 之间的双向桥梁,并且显示了这一点。

Git 非常注重改变这个历史图(带来所有后果),而 Mercurial 并不鼓励历史重写, 但它很容易做到 ,这样做的后果正是你应该期待的那样(即,如果我修改了你已经拥有的变更集,那么如果你从我这里撤出,你的客户将会看到它是新的。所以 Mercurial 偏向于非破坏性命令。

至于轻量级分支,那么 Mercurial 支持具有多个分支的存储库,因为...... 总是我认为。具有多个分支的 Git 存储库就是这样:单个存储库中的多个分支开发链。然后 Git 为这些链添加名称,并允许您远程查询这些名称。 Mercurial 的Bookmarks扩展名添加了本地名称,使用 Mercurial 1.6,您可以在推 / 拉时移动这些书签。

我使用 Linux,但显然 TortoiseHg 比 Windows 上的 Git 等效更快更好(由于更好地使用了糟糕的 Windows 文件系统)。 http://github.comhttp://bitbucket.org 都提供在线托管服务,Bitbucket 的服务很棒且反应灵敏(我还没有尝试过 github)。

我选择了 Mercurial,因为它感觉干净而优雅 - 我被 Git 带来的 shell / Perl / Ruby 脚本推迟了。如果你想知道我的意思,试着看一下git-instaweb.sh文件 :它是一个生成Ruby脚本的shell脚本,我认为它运行一个 webserver。 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 命令是如何简单而不是特殊的 - 唯一不寻常的是--force标志到hg pull ,这是必需的,因为当你从不相关的存储库中取出时,Mercurial 会中止。像这样的差异使得 Mercurial 对我来说更加优雅。

Git 是一个平台,Mercurial 是 “只是” 一个应用程序。 Git 是一个版本化的文件系统平台,恰好配备了一个 DVCS 应用程序,但正如平台应用程序一样,它更复杂,边缘比专注的应用程序更粗糙。但这也意味着 git 的 VCS 非常灵活,而且你可以使用 git 进行非常深入的非源代码控制。

这就是差异的本质。

Git 最好从头开始理解 - 从存储库格式开始。 Scott Chacon 的 Git Talk是一本很好的入门书。如果你试图在不知道幕后发生什么的情况下使用 git,你最终会在某些方面感到困惑(除非你只坚持非常基本的功能)。当你想要的只是你日常编程例程的 DVCS 时,这可能听起来很愚蠢,但 git 的天才是存储库格式实际上非常简单,你可以很容易地理解 git 的整个操作。

对于一些更加注重技术性的比较,我亲眼看到的最好的文章是 Dustin Sallings:

他实际上已经广泛使用了两种 DVCS 并且很好地理解了它们 - 并且最终更喜欢使用 git。