为什么认为Mercurial比Git容易?


204

在进行比较时,在我看来,它们的功能集之间可能存在1:1的映射。然而,经常被引用的说法是“ Mercurial更容易”。该声明的依据是什么?(如果有)


21
很奇怪,我从未听说Mercurial会更轻松。我发现了更多有关Git的文档(可能是感知的),所以我学到了这一点。
Nic

16
因为它是莱纳斯(Linus)制造的?
约伯

124
转向这里的圣战领土,但是我发现Mercurial比Git更易于使用,因为作为Windows用户,我受到Mercurial的欢迎,并被Git视为一个怪物和失败者。我知道我是拟人化软件,而且我都知道这两种软件都完全可以在Windows下很好地使用,但这就是两者中给人的印象。
2011年


11
我想知道如果Github不存在,或者没有那么多备受瞩目的项目,那么会有多少人会使用Git?
克里斯·S

Answers:


240

恰当的例子:假设您要更改所有先前提交的用户名。由于各种原因,我需要多次执行此操作。

Git版本

git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

水星版本:

authors.convert.list文件:

<oldname>=<newname>

命令行:

hg convert --authors authors.convert.list SOURCE DEST

现在,哪个看起来更易于使用?


注意:我花了2年的时间专门与Git一起工作,所以这不是“我讨厌它,我2秒钟内没有得到它”。

对我来说,就是可用性。Git是非常面向Linux的,具有Linux的处理方式。这意味着命令行,手册页,并自己解决。它的GUI非常差(请注意:大约从一年前开始,我就基于msysGit了),这似乎妨碍了我的工作。我几乎用不了

命令行更糟。作为面向Linux的程序,在Windows上很难使用。他们没有使用本地端口,而是仅将git与MinGW(Think cygwin)包装在一起,这使得使用它变得更加困难。MinGW不是Windows命令提示符,只是行为有所不同。疯狂的是,这是与Git一起工作的唯一方法。即使在Linux中,似乎唯一的方法就是使用直接命令行。诸如RabbitVCS之类的项目有所帮助,但功能却不是很强大。

面向命令行的方法并且是linux程序,这意味着几乎所有的howto指南,帮助文档和论坛/ QA问题都依赖于运行上述可怕的命令。基本的SCM命令(commit,pull,push)并不那么复杂,但是更多,并且复杂性呈指数增长。

我也讨厌很多OSS git用户似乎流连忘返的地方:Github。当您第一次进入github页面时,它会以您可能会做的一切让您大跌眼镜。对我来说,一个项目git页面看起来混乱,可怕并且过于强大。甚至对项目含义的解释也被推到最底层。Github确实伤害了尚未设置完整网站的人们。它的问题跟踪器也很可怕且令人困惑。功能超载。

Git用户似乎也很喜欢。Git用户似乎总是开始进行DVCS更好的“圣战”,然后迫使Mercurial用户捍卫自己。像http://whygitisbetterthanx.com/之类的网站显示出傲慢的态度和几乎“使用我的软件或死亡”的心态。很多时候,我进入各种帮助的地方只是因为不了解X,事先使用X,使用Windows等而被解雇。这太疯狂了。


另一方面,水银似乎朝着更友善的方向发展。对于新用户而言,他们自己的主页似乎比Git的友好得多。在一个简单的Google搜索中,第五个结果是TortoiseHg,这是Mercurial的非常好的GUI。他们的整个方法似乎首先是简单,然后是电源。

使用Mercurial,我没有SSH废话(SSH在Windows上是地狱),我没有愚蠢的复杂命令,没有追随者,没有疯狂。水银只是工作。

TortoiseHg提供了一个实际可用的界面(尽管最近似乎正在增长),该界面提供了实际有用的功能。选项仅限于您需要的选项,可消除混乱情况和很少使用的选项。它还提供了许多不错的默认设置

Mercurial对新手非常友好,很容易拿起。即使是一些更复杂的主题,例如不同的分支模型和历史记录编辑,也很容易遵循。我迅速而轻松地接了水星。

Mercurial只需很少的设置即可首次使用。在任何操作系统上,我都可以安装TortoiseHg并获得我想要的所有功能(主要是上下文菜单命令),而不必寻找其他Guis。还缺少设置SSH(一半的指南说使用Putty,Plink和Pagent,而另一半则说使用ssh-keygen)。对于新用户,TortoiseHg需要花费几分钟的时间来设置,而Git则需要花费30分钟到一个小时的时间来进行大量的谷歌搜索。

最后,您有了在线回购。Githubs相当于BitBucket,它具有我上面概述的一些问题。但是,还有Google Code。当我进入Google Code项目时,不会出现功能重载,而是得到了一个不错的简洁界面。Google Code更像是在线回购/网站组合,确实可以帮助没有现有站点设置的OSS项目。在相当长的一段时间内使用Google Code作为我的项目网站时,我会感到非常自在,只在绝对必要时才建立网站。它的问题跟踪器也功能强大,非常适合Github几乎没有用的问题跟踪器和Bugzilla的怪兽之间

Mercurial每次都可以正常工作。Git妨碍了我,只会在我使用它时更激怒我。


6
评论员:评论旨在寻求澄清,而不是进行扩展讨论。如果您有解决方案,请留下答案。如果您的解决方案已经发布,请对其进行投票。如果您想与其他人讨论这个问题,请使用chat。有关更多信息,请参见FAQ

1
IntelliJ IDEA和Xcode 4在各自平台上与Git完美集成,对于日常任务,您无需使用命令行。

4
我想补充一点,当您想在Windows上使用GIT时,tortoriseGIT现在要好得多。您仍然必须处理SSL密钥,安装过程并不顺利,但是安装完成后很容易。
2011年

2
Git扩展我个人发现,与Windows上的TortoiseHG相比,它更易于浏览和使用,而且git仅使用1个命令行。
2011年

1
我对这一行感到困惑:“ MinGW不是Windows Command Prompt,只是行为有所不同。这是与Git一起工作的唯一方法,这很疯狂。” 我使用msysgit安装和选项2从Windows命令行运行。它工作正常。有些事情不起作用(例如插入符号,DOS中的换行符),但是还有一些替代方法(例如波浪号)可以正常工作。我不是命令行爱好者(或者至少我不是在开始学习Git之前就不是),但是在命令行中使用Git确实很容易。我想念什么吗?
Kyralessa

80

Git与Mercurial

人们普遍认为Mercurial比Git更简单易学。反过来,人们通常认为Git更加灵活和强大。这部分是由于Git倾向于提供更多的低级命令,另一部分是由于默认的Mercurial 倾向于隐藏高级功能,而让用户编辑Mercurial配置文件以激活他们喜欢的高级功能。这通常会导致人们认为Mercurial无法使用高级功能。

Git概念

Mercurial一直将重点更多地放在界面方面,这使得它本来更容易学习。与Git相比,以一种有用的方式对Mercurial进行操作需要较浅的理解。从长远来看,这种封装使Mercurial看起来不像实际那样功能强大,功能不足。


73
因此,Mercurial仅隐藏高级功能,而GIT隐藏所有功能... ;-)
敬畏

4
Git 确实具有更大的功能。例如,没有等效于git的HEAD〜1。Mercurial的p(x)跨分支,多么没用。汞没有阶段。推送时必须推送所有分支。Mercurial甚至没有像histedit,shelf和rebase这样的所有插件都没有那么灵活。Git的命令行也更好,它给了用户提示,而提示却没有。我被迫在工作中使用这个略显残缺的DVCS,并且遇到了一些问题,即汞缺乏能力来做我想做的事情。
Keyo

22
@Keyo:Mercurial有~,请参阅修订。它没有暂存区域,但是您可以使用MQ来模拟它,它的功能要强大得多。学会使用该工具,而不是坚持从git中学到的知识,它会有所回报。
伊丹·K

22
@Keyo:您在推送时不必使用Mercurial推送所有分支。您可以推送特定的分支(hg push --branch BRANCH)或最高推送特定的修订版(hg push --rev REV)。请参阅hg help push更多选项。
摄政王

1
仅供参考,您可以使用记录扩展名获得过渡区域的相当一部分。OTOH,我认为搁置扩展名(模仿了Baazar的“搁置”命令,并且接近“ git stash”)在使用暂存区域的大多数目的上要好得多。
brandizzi 2012年

47

上下文:我每天都使用Mercurial(用于工作)和Git(用于辅助项目和开源)。我主要同时使用基于文本的工具(而不是IDE),并且在Mac上。

总的来说,我发现Mercurial更易于使用。我发现一些使Mercurial更容易的事情:

  1. 缺少索引。 索引是启用Git的许多功能的强大工具,但它还是一个额外的层,可增加我经常做的许多事情。Mercurial的工作流程更类似于svn。
  2. 修订号,而不是shas。 我发现这是一件小事,使Mercurial中的日常命令操作变得更加轻松。在编写命令时,在进行变基,合并等操作时,将一些修订号推入您的头脑要比用短一些的shas更容易。
  3. 分支机构。 Git通过命名提交来分支的方法功能强大,并且与其他版本控制系统完全不同。它使某些事情变得容易得多。我发现Mercurial的方法与svn的思想更好地匹配,并且更容易从视觉上理解分支的历史。这可能只是一个偏好。

6
+1表示索引;我认为索引及其相互作用是使git较之于mercurial更难学习的一件事。
肖恩·麦克米兰

18
hg相当于git分支居然叫bookmarks。据我所知,hg分支中没有等价的git
汉克·盖伊

6
我处在同样的情况下,在家工作时很忙碌,而git在家里。水银分支对我来说很烦人,我喜欢拥有私人分支机构,并在需要时推动它们。水星强迫我使用架子或其他仓库。修订版号很傻,给我哈希。git舞台很棒,我想念这个。我真的很缺少git的功能。我用一些插件做了一些事情,但是分支确实让我很烦。
Keyo

6
@Keyo-以我的经验,git分支是分支的子集hg。在其中hg,可以同时具有已命名和未命名(拓扑)分支,甚至可以git使用与使用书签相同的方式来管理未命名分支。我从来没有真正看到登台区域的意义。我宁愿搁置不需要的更改,然后在提交之前确保我的代码编译并完成我的测试。然后,我可以搁置并继续。另外,查尔斯·贝利(Charles Bailey)的“按摩帅哥”(p90 +)吓我一跳* 8'):accu.org/content/conf2011/accu2011LT_fri_share_v2.pdf
Mark Booth

7
@Keyo:在Mercurial中,私有分支称为“书签”:先更新到根版本,然后再hg bookmark keyo-stuff执行hg commit,然后再进行hg push -B keyo-stuff。如果您不喜欢修订号,请不要使用它们。我认为,Mercurial会在任何接受修订号的地方接受哈希。我不得不说,您的评论抨击了Mercurial,因为它实际上缺乏功能,但是却无知又有点进取。对于Git用户的刻板印象,您做得不好!
汤姆·安德森

29

这是非常主观的,并且取决于一个人,但是,是的,我想告诉那些完全不接触VCS的人或某个来自“老派” VCS的人,Mercurial看起来会更容易。

例如,添加文件,以Hg形式不存在索引,返回某些旧版本以及从那里进行分支(仅更新和提交)的简便性(作为最“明显”的示例)。现在,一个系统的大多数功能可以在另一个系统中进行仿真,反之亦然,但这需要在Git中有一定的知识,而在Mercurial中,默认值(如果允许的话)是“用户友好的”。这些小事情-到处切换,一个命令中的非显而易见行为等等……这些事情加在一起,最后,一个系统似乎比另一个系统更易于使用。

只是为了使答案完整;我使用git,但是当为“新手”推荐VCS时,我几乎总是推荐Mercurial。我记得,当它第一次出现在我手中时,感觉非常直观。根据我的经验,Mercurial的wtf / min低于Git。


+1表示“较少wtf /分钟” -1表示“这非常主观”。这不是很主观...我不知道为什么人们仍然认为UI的差异是主观的。如果我采用mercurial并用md5哈希其命令,那么您不会说某些人可能会发现md5哈希比原始算法更直观,是吗?(我希望不是)。Git也是如此。只有当您使用git的经验远大于汞时,Git才比汞容易。
weberc2

17

我认为这很简单:Mercurial具有更熟悉的语法(特别是对于SVN用户),并且文档齐全。一旦习惯了Git语法,您就会发现它与其他任何东西一样容易使用。


7
不。您有太多的工作流程步骤可称其为“不同语法”。为了使用Git,您必须了解要处理的基础模型以及git索引的所有状态。说SQL和Pascal是同一件事的两种不同语法,这同样是错误的。Git是具有DVCS功能的文件系统内容版本控制系统。Mercurial是DVCS,它不会执行GIT的每个文件系统内容版本转换操作,而只是DVCS用户都需要的子集。
沃伦·P

9

对此,认知可能会随着时间而改变。Mercurial的设计非常好,Git也是如此。Mercurial似乎更容易学习(至少对我来说是这样),并且在Git中遇到了很多困难,而我在Mercurial中没有类似的困难。我尝试学习Python和Ruby,并通过Python更快,更快速地学习。这并不意味着Python永远在任何地方都比Ruby更好,甚至不代表我更好。这就是我所学并坚持的。程序员经常出于个人喜好进行圣战。其他人也这样做。

我是一名购物狂,试图对Git保持开放态度,我自由地承认,它没有像Mercurial那样“成为我的新宠”。我认为Git确实非常好。

GIT /商品复杂性的反例:Mac上的XCode内置了对GIT的良好支持。与Mercurial相比,将XCode与Mercurial结合使用不那么容易。

到目前为止,我在GIT方面的经验使我感到困惑和迷失,在使用它时需要更多地查阅文档。我相信已经写了很多文档,但是没有什么能使我“理解”。其次,我可以轻松地在Python中修改和扩展Mercurial,并且由于我精通Python,并且因为任何人都可以真正快速地学习python,所以这对我来说似乎是一个优势。我也了解C,并且用C编写Python扩展,所以我想有一天,如果需要的话,我可以轻松地用C编写Git扩展。

易用性不容易量化。它在那里,我不认为它完全是主观的,但是我们没有良好的客观测量技术。易于使用的单位是什么?Milli-iPods?

我不那么有党派倾向,要成为100%赞成水手和100%反对git。我现在对Mercurial,Windows和Linux都比较满意,当我开始做更多的Mac工作时,我希望我会坚持使用XCode + GIT。

更新2013:我现在已经使用水银和Git足够长的时间来发现,我希望它有这样的Git有,如一些功能有关合并的战略问题。如果很难学习,有时甚至是疯狂地复杂,它真的很棒。


7

IMO可能会使Git失去新用户:

  1. Git文化更以命令行为中心。虽然这两种工具的确倾向于将重点放在命令行上(正如我多次说过的那样,命令行指令可能功能强大且更流畅,但它们并不是一种好的营销策略),但Git的情况尤其如此。Mercurial在TortoiseHg中具有事实上的标准GUI工具,甚至是Mercurial主页上Windows用户的默认下载选项,而Git具有几个竞争的GUI前端(TortoiseGit,Git Extensions,gitk等),它们的广告宣传不佳在Git网站上,反正这一切都是令人讨厌的。(红色标签上的黑色文字?来吧,TortoiseGit,您可以做得更好!)Git社区中还普遍存在一种态度,即使用GUI工具的人不是合适的软件开发人员。

  2. Git有一些现成的默认值,这些默认值对高级用户来说非常有意义,但是如果不吓到新用户,可能会令人惊讶。例如,在自动化诸如合并之类的任务时,它更具攻击性(例如,git pull在可能的情况下自动合并并提交)。全自动合并是有必要的,但是大多数没有经验的用户对合并感到恐惧,需要在他们的源代码完全发挥作用之前有机会获得对其工具的信心。

  3. 文档和固有的复杂性:

    $ hg help log | wc -l
    64
    $ git help log | wc -l
    912
    

3
其实,我喜欢帮助,长912线的帮助,是64
Dysaster

10
实际上,我更喜欢如此直观且无缝的UI,因此您一开始不需要帮助。
jammycakes 2011年

2
我同时需要GUI和帮助。:)在我看来直觉是别人的一团糟。
Dysaster

1
可以,但是当需要帮助时,应该很容易遵循。
jammycakes 2011年

3
我想到了一个新的类比;Git就像C ++(对不起Linus!),Mercurial就像Pascal。隐式的只能在Pascal(或Mercurial)中以一种方式完成,而显式地可以;而C ++(和Git)则以十九种不同的方式来完成。有些人喜欢带有更多按钮和操纵杆的电动工具,而Git就是这样。
沃伦·P

3

我能想到的一件事是

git add .
git commit -am "message"

hg ci -Am "message"

git commit -a不会添加新创建的文件,而是添加hg ci -A,这意味着可以使用Mercurial中的一个命令来完成需要使用git的两个命令的操作。再说一次,“较少键入”并不一定意味着“更加用户友好”。


11
我经常发现在我的工作流程中,自动添加新文件实际上是不可取的。我开始更喜欢git commit -a工作方式,因为它可以更轻松地控制给定提交添加的内容。(对我来说,为每个路径指定单独的路径名svn ci以避免在提交中添加无关的内容实际上并
不稀奇

3
足够公平,但我相信hg ci没有该-A标志就等于git commit -a。我使用git比使用hg多得多,所以我不确定100%。
哲豪·毛

我已经检查过,hg ci== git commit -a
哲豪·毛

但是如果您使用hg commit指定特定文件,则可以避免拉入不需要的文件。在很少需要我控制的情况下,我发现此方法很好用。
Alex Miller

1
你为什么要“ git add”。然后“ git commit -am”?是否所有内容都不会添加到索引中?
jacobangel 2011年

3

因为它是。

Git暴露的胆量远远超过了汞。您可以在捡起它后的几分钟内愉快地使用Mercury,但是经过几个月的搏斗,我发现git仍然很难解决(除了尝试学习git以外,我在过去几个月中几乎没有做过)。我既从命令行使用命令行,又在Linux上使用,所以这不仅是对命令行界面的厌恶。

一个简单的例子是与git相比,Mercurial所需的标志和命令行参数相对较少。临时区域和git中add命令的行为也增加了不必要的复杂性。重置,检出和还原这三者及其多重排列增加了极大的复杂性,当您看到还原和更新汞的直接本质时,这是不必要的。

我也同意以上关于Hginit的评论,它无疑使人们容易理解。写得很好,很容易理解。没有为git编写的文档接近。首先,我发现Scott Chacone(他一手编写了大多数有关git的文档/书籍)所写的大部分内容特别令人困惑。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.