当前位置:  开发笔记 > 开发工具 > 正文

Mercurial和Git有什么区别?

如何解决《Mercurial和Git有什么区别?》经验,为你挑选了16个好方法。

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

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



1> jfs..:

这些文章可能有所帮助

Git vs. Mercurial:请放松(Git是MacGyver,Mercurial是James Bond)

Mercurial与Git的区别

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

Git是Wesley Snipes,Mercurial是Denzel Washington



2> Martin Geisl..:

我在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提供在线托管,在到位桶的服务是伟大的和反应(我没有尝试过的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 
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 
hg merge
hg commit

注意Mercurial命令是如何简单而不是特殊的 - 唯一不寻常的是--force标志hg pull,这是必需的,因为Mercurial会在你从一个不相关的存储库中拉出时中止.像这样的差异使得Mercurial对我来说更加优雅.


用git合并(拉)一个不相关的项目,你可以简单地做:`git pull `.你引用的邮件来自git的早期(2005年)
请注意,TortoiseHg还与Linux上的Gnome文件管理器Nautilus一起工作.
knittl:嗯,好的,我很高兴听到Git变得不那么神秘了.尽管如此,我认为这个例子显示了我们认为很酷的系统有多么不同,而且与Mercurial相比,Git感觉更低级别(但不是更强大).
只有当httpd是ruby webserver的Webrick时,才会生成Ruby脚本.
与Git一样,Mercurial会在您提交时存储文件的快照.我不同意重命名只能使用Git中的启发式跟踪,模型中没有任何内容可以阻止向快照添加额外信息,例如重命名信息.我们在Mercurial做到这一点.

3> Aristotle Pa..:

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

这就是差异的本质.

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

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

Mercurial与Git的区别

Reddit线程,git经验丰富的Dustin回答了他自己的git新手问题

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


我经常读到人们提到git是一个"平台",但这更多的是一个理论或常见的神话,因为除了运行git之外,没有其他主要的例子可以作为一个平台来做其他事情.
因此,简而言之:Mercurial是一个开源的分布式版本控制系统,git是一种生活方式选择.

4> mmiika..:

最大的区别在于Windows.Mercurial本身支持,Git不支持.您可以通过bitbucket.org获得与github.com非常相似的托管(实际上,当您获得免费的私有存储库时更好).我正在使用msysGit一段时间,但转移到Mercurial并对它非常满意.


所以"原生"并不是一个正确的词,但它在Windows下得不到很好的支持,这是肯定的.
git在windows中原生支持,不要传播FUD.
Windows支持Unicode,尽管MS选择在其API而不是UTF-8中使用UTF-16.尽管如此,git很可能支持Unicode跨平台.SVN很好地解决了这个问题.但它目前并不是msysGit开发的高优先级.http://code.google.com/p/msysgit/issues/detail?id=80
Windows上支持git.但尝试跨平台使用Unicode文件名,看看你得到了多少痛苦.

5> Maurice Flan..:

如果您是Windows开发人员,正在寻找基本的断开连接的版本控制,请使用Hg.我发现Git是不可理解的,而Hg很简单并且与Windows shell完美集成.我下载了Hg并按照本教程(hginit.com) - 十分钟后我有一个本地回购并重新开始工作.



6> Cyberdrow..:

我认为关于"Mercurial vs. Git"的最佳描述是:

"Git是Wesley Snipes.Mercurial是丹泽尔华盛顿"


怎么应该有所帮助?这是否意味着git更像是武术类型?
劳驾.但你真的看过这个链接指向的文章吗?我看到答案已经失去了1分.你有没有投票呢?
通过致电SVN Morgan Freeman,他的意思是老吗?
CVS = Bill Cosby?!

7> 小智..:

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

要使用Mercurial启动新分支,只需将存储库克隆到另一个目录并开始开发.然后,你拉和合并.使用git,您必须明确地为要使用的新主题分支命名,然后使用相同的目录开始编码.

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

我很诚实:我不知道是否可以对Mercurial做同样的事情,但由于我经常在网络项目上工作,因为我总是使用git这个目录看起来很舒服,因为我没有必要 - 配置Apache并重新启动它,每次分支时我都不会弄乱我的文件系统.

编辑:正如Deestan所说,Hg已命名分支,可以存储在单个存储库中,并允许开发人员在同一个工作副本中切换分支.无论如何,git分支与Mercurial命名分支并不完全相同:它们是永久性的,不会丢弃分支,就像在git中一样.这意味着如果您使用命名分支进行实验任务,即使您决定永不合并它,它也将存储在存储库中.这就是为什么Hg鼓励将克隆用于实验性的,短期运行的任务以及为长期运行的任务命名分支的原因,例如发布分支.

许多Hg用户优先克隆命名分支的原因是社交或文化比技术更多.例如,对于Hg的最新版本,甚至可以关闭命名分支并递归地从变更集中删除元数据.

另一方面,git邀请使用"命名分支",这些分支不是永久性的,并且不作为元数据存储在每个变更集上.

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


这不是一个区别; Hg也指定了分支机构.我们在正常开发期间一直使用它们而不是克隆分支.
获得在Hg中命名为分支的AFAIK,在每次提交中存储元数据; 我可能错了,但我读到,一旦你创建了一个分支,它的元数据就会嵌入到每个变更集中,并成为历史的一部分.这与git有很大的不同."克隆很适合快速实验,你不想记录分支名称,而且命名分支对长期分支很有用"http://tinyurl.com/2wz39qx我试图用我的帖子说的是git的标准工作流程邀请您使用单个工作副本; Hg标准工作流程包括克隆,这些克隆不符合我的个人需求.
hg中的命名分支与git中的分支完全不同.在hg中,有一个*true*路径.所有分支都是该路径的分支.在git中没有一条真正的道路.只有不同的回购状态和指向该状态的指针.每个分支只是一个不同的指针.哪个指针是最主要的指针.分支机构都是同行.

8> FelipeC..:

gitmercurial之间有一个巨大的区别; 表示每次提交的方式.git将提交表示为快照,而mercurial将它们表示为差异.

这在实践中意味着什么?好吧,git中的许多操作都比较快,例如切换到另一个提交,比较提交等.特别是如果这些提交很远的话.

AFAIK没有mercurial方法的优势.


变更集(差异)的优势在于占用更少的空间.Git通过使用压缩来恢复用于提交的空间,但这需要偶尔进行显式重新压缩步骤("git pack").
我无法理解你在'快照'和'差异'之间的区别.hg和git都提交为(组)文件_deltas_.这些增量基于相应SCM选择的先前修订版.你有没有数字显示git实际上对你提到的操作更快?无论如何,更新到另一个提交会花费大部分时间写入工作目录,而不是阅读回购.
它现在被称为'git gc',但是有不同级别的垃圾收集,并且在最新版本的git中会自动执行某些级别.
实际上,mercurial也使用快照
'快照与'差异 - 完全无关紧要.但是,内部存储的仓库与用户看到的内容无关.git和mercurial都为用户提供了'快照'.没有理由为什么以与git相同的方式实现的存储库格式无法添加到mercurial,正如我相信Bazaar所做的那样.

9> dbr..:

没有.他们都做同样的事情,两者表现平平.你应该选择一个而不是另一个的唯一原因是,如果你帮助了一个已经使用过的项目..

选择一个的另一个可能原因是只支持系统之一的应用程序或服务.例如,我几乎选择学习git因为github ...


看起来你的答案过于务实.:)

10> KalEl..:

谷歌的比较(虽然有点旧,2008年完成)

http://code.google.com/p/support/wiki/DVCSAnalysis



11> gman..:

如果我正确地理解它们(并且我远不是每个人的专家),他们从根本上都有不同的理念.我第一次使用mercurial 9个月.现在我用git 6.

hg是版本控制软件.它的主要目标是跟踪一个软件的版本.

git是一个基于时间的文件系统.它的目标是为文件系统添加另一个维度.大多数都有文件和文件夹,git增加了时间.它恰好工作得很棒,因为VCS是其设计的副产品.

在hg中,它总是试图维护整个项目的历史.默认情况下,我认为hg希望所有用户在推送和拉动时对所有对象进行所有更改.

在git中,只有一个对象池和这些跟踪文件(分支/头),它们确定哪些对象集代表特定状态下的文件树.当推或拉git时,只发送你正在推或拉的特定分支所需的对象,这是所有对象的一小部分.

就git而言,没有"1个项目".你可以在同一个仓库中拥有50个项目,git也不会关心.每个人都可以在同一个仓库中单独管理并且生活得很好.

Hg的分支概念是主要项目的分支或分支机构等.Git没有这样的概念.git中的一个分支只是树的状态,一切都是git中的一个分支.官方,最新或最新的分支在git中没有任何意义.

我不知道这是否有意义.如果我可以绘制图片,hg可能看起来像每个提交是一个o

             o---o---o
            /        
o---o---o---o---o---o---o---o
         \         /
          o---o---o

一棵树,一根根,树枝从树上掉下来.虽然git可以做到这一点,但人们通常会以不强制执行的方式使用它.git图片,如果有这样的东西,很容易看起来像这样

o---o---o---o---o

o---o---o---o
         \
          o---o

o---o---o---o

事实上,在某些方面,在git中显示分支甚至没有意义.

有一件事让讨论非常困惑,git和mercurial都有一个叫做"分支"的东西,但它们并不是一回事.当不同的回购之间存在冲突时,mercurial中会出现一个分支.git中的分支显然类似于hg中的克隆.但是克隆虽然可能会产生类似的行为,但绝对不一样.考虑一下我使用相当大的铬回购在git vs hg中尝试这些.

$ time git checkout -b some-new-branch
Switched to new branch 'some-new-branch'

real   0m1.759s
user   0m1.596s
sys    0m0.144s

而现在使用克隆的hg

$ time hg clone project/ some-clone/

updating to branch default
29387 files updated, 0 files merged, 0 files removed, 0 files unresolved.
real   0m58.196s
user   0m19.901s
sys    0m8.957

这两个都是热门运行.即,我跑了两次,这是第二次.hg clone实际上与git-new-workdir相同.这两个都是一个全新的工作目录,几乎就像你打字一样cp -r project project-clone.这与在git中创建新分支不同.它的重量要大得多.如果在hg中存在真正相当于git的分支,我不知道它是什么.

我在某种程度上理解hg和git 可能会做类似的事情.如果是这样,那么他们引导您的工作流程仍然存在巨大差异.在git中,典型的工作流程是为每个功能创建一个分支.

git checkout master
git checkout -b add-2nd-joypad-support
git checkout master
git checkout -b fix-game-save-bug
git checkout master
git checkout -b add-a-star-support

那只是创建了3个分支,每个分支都基于一个名为master的分支.(我确信在git中有一些方法可以使每个1行而不是2行)

现在我要做的就是上一个

git checkout fix-game-save-bug

并开始工作.承诺等等.甚至在像chrome这样大的项目中,在分支之间进行切换几乎是即时的.我实际上不知道如何在hg中这样做.这不是我读过的任何教程的一部分.

另一个很大的区别.Git的舞台.

Git有这个阶段的想法.您可以将其视为隐藏文件夹.当您提交时,您只提交舞台上的内容,而不是工作树中的更改.这可能听起来很奇怪.如果要提交工作树中的所有更改,则git commit -a需要将所有已修改的文件添加到舞台中,然后提交它们.

那个舞台有什么意义呢?您可以轻松地分离您的提交.想象一下,您编辑了joypad.cpp和gamesave.cpp,并且您希望单独提交它们

git add joypad.cpp  // copies to stage
git commit -m "added 2nd joypad support"
git add gamesave.cpp  // copies to stage
git commit -m "fixed game save bug"

Git甚至有命令来决定你想要复制到舞台的同一文件中的哪些特定行,这样你也可以单独拆分这些提交.你为什么想这么做?因为作为单独的提交,其他人只能提取他们想要的提交,或者如果有问题,他们只能恢复有问题的提交.



12> Spoike..:

在versioncontrolblog上有一个动态比较图表,您可以在其中比较几个不同的版本控制系统.

这是git,hg和bzr之间的比较表.


链接已经死了.

13> Krzysztof Ko..:

在处理分支(特别是短期分支)方面存在很大的差异.

它是在解释本文(BranchingExplained) ,其与比较GIT中水银.



14> 小智..:

您的项目中是否有基于Windows的协作者?

因为如果有的话,Git-for-Windows GUI看起来很笨拙,困难,不友好.

相比之下,Mercurial-on-Windows是一个明智的选择.



15> toy..:

在bitbucket.org的mercurial和github的git之间要注意的一点是,mercurial可以拥有你想要的尽可能多的私有存储库,但github你必须升级到付费帐户.所以,这就是我选择使用mercurial的bitbucket的原因.



16> Greg Hewgill..:

去年的某个时候,我为自己的用途评估了git和hg,并决定使用hg.我觉得它看起来像一个更清洁的解决方案,并且当时在更多平台上运行得更好.不过,这主要是一个折腾.

最近,由于git-svn和作为Subversion客户端的能力,我开始使用git.这让我赢了,我现在完全转向git了.我认为它有一个稍高的学习曲线(特别是如果你需要围绕内部),但它确实是一个伟大的系统.我打算读一下John现在发布的两篇比较文章.


看看hgsubversion:http://bitbucket.org/durin42/hgsubversion/.它目前需要Mercurial的开发版本,但是他们将发布将于7月1日到期的Mercurial 1.3.
推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有