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

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


当前回答

有些人认为VCS系统必须是复杂的。他们鼓励在这个领域发明术语和概念。他们可能会认为这个领域的众多博士会很有趣。其中可能就是那些设计Git的人。

Mercurial是用不同的心态设计的。开发人员不应该太关心风险投资,他们应该把时间花在他们的主要功能上:软件工程。Mercurial允许用户愉快地使用和滥用系统,而不允许他们犯任何不可恢复的错误。

任何专业工具都必须带有设计清晰、直观的CLI。Mercurial用户可以通过发出简单的命令来完成大部分工作,而不需要任何奇怪的选项。在Git双破折号中,疯狂的选项是常态。如果您是一个CLI人员(老实说,任何有自尊心的软件工程师都应该是),那么Mercurial就有很大的优势。

举个例子,假设你犯了一个错误。你忘了编辑一些文件。要撤消在Mercurial中的操作,只需键入:

$ hg回滚

然后,您将收到一条消息,系统将撤销您的上一个事务。

在Git中,你必须输入:

$ git重置-软头^

假设你知道什么是重置。但除此之外,你还必须知道“软”和“硬”重置是什么(有什么直观的猜测吗?)哦,当然,不要忘记最后的'^'字符!(以里奇的名义……)

Mercurial与第三方工具(如kdiff3和meld)的集成也更好。生成你的补丁合并你的分支没有太多的麻烦。Mercurial还包括一个简单的http服务器,您可以通过输入激活它

hg服务

并让其他人浏览您的存储库。

归根结底,Git做了Mercurial做的事情,但方式要复杂得多,使用的CLI也差得多。如果您想将项目的VCS转换为科学研究领域,请使用Git。如果您希望在不太关心的情况下完成VCS工作,并专注于您的实际任务,请使用Mercurial。

其他回答

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

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

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

Git是Wesley Snipes, Mercurial是Denzel Washington

当涉及到处理分支(特别是短期分支)时,有相当显著的差异。

本文(BranchingExplained)对Mercurial和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。

如果你是一名Windows开发人员,正在寻找基本的断开连接的版本控制,那么使用Hg。我发现Git难以理解,而Hg很简单,与Windows shell集成得很好。我下载了Hg,并遵循了这个教程(hginit.com) -十分钟后,我有了一个本地回购,并重新开始我的项目。

它们几乎一模一样。 从我的角度来看(我的意思是,让我选择一个DVCS而不是另一个的原因),最重要的区别是两个程序如何管理分支。

要使用Mercurial启动一个新分支,只需将存储库克隆到另一个目录并开始开发。然后,你拉并合并。 使用git,您必须显式地为您想要使用的新主题分支提供一个名称,然后使用相同的目录开始编码。

简而言之,Mercurial中的每个分支都需要自己的目录;在git中,你通常在单个目录下工作。 在Mercurial中切换分支意味着更改目录;在git中,这意味着要求git通过git checkout更改目录的内容。

老实说:我不知道是否可以用Mercurial做同样的事情,但因为我通常在web项目上工作,总是使用相同的目录和git对我来说似乎更舒服,因为我不需要重新配置Apache并重新启动它,而且每次分支时我都不会弄乱我的文件系统。

Edit: As Deestan noted, Hg has named branches, which can be stored in a single repository and allow the developer to switch branches within the same working copy. git branches are not exactly the same as Mercurial named branches, anyway: they are permanent and not throw away branches, like in git. That means that if you use a named branch for experimental tasks even if you decide to never merge it it will be stored in the repository. That's the reason why Hg encourages to use clones for experimental, short-running tasks and named branches for long-running tasks, like for release branches.

为什么许多Hg用户更喜欢克隆而不是命名分支的原因更多的是社会或文化而不是技术。例如,在Hg的最新版本中,甚至可以关闭已命名的分支并从变更集中递归地删除元数据。

另一方面,git邀请使用“命名分支”,这些分支不是永久的,也不是存储在每个变更集中的元数据。

从我个人的角度来看,git的模型与命名分支的概念有很深的联系,并在同一个目录下在一个分支和另一个分支之间切换;hg可以对命名的分支做同样的事情,但它鼓励使用克隆,这是我个人不太喜欢的。