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

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


#1楼

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

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

AFAIK没有mercurial方法的优势。


#2楼

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

Mercurial的设计具有不同的心态。 开发人员不应该关心VCS,而应该把时间花在他们的主要功能上:软件工程。 Mercurial允许用户使用并愉快地滥用系统,而不会让他们犯下任何不可恢复的错误。

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

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

$ hg rollback

然后,您会收到一条消息,表明系统撤消了您上次的交易。

在Git中你必须键入:

$ git reset --soft HEAD^

好吧,假设你知道什么是重置。 但另外你必须知道“--soft”和“--hard”重置是什么(任何直观的猜测?)。 哦,当然不要忘记最后的'^'字符! (现在Ritchie的名字是......)

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

hg serve

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

最重要的是,Git以更复杂的方式和远低于CLI的方式完成了Mercurial的工作。 如果要将项目的VCS转换为科研领域,请使用Git。 如果您想在不关心它的情况下完成VCS工作,请使用Mercurial,并专注于您的实际任务。


#3楼

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

本文(BranchingExplained)对Mercurial与Git进行了比较。


#4楼

在InfoQ关于DVCS的指南中 ,git,Mercurial和Bazaar上有一个非常详尽的比较表和图表。


#5楼

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


#6楼

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。


#7楼

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

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


#8楼

如果您对Mercurial和Git的性能比较感兴趣,请查看本文 。 结论是:

Git和Mercurial都转好,但在速度和存储库大小之间进行了有趣的权衡。 Mercurial在添加和修改方面都很快,同时可以控制存储库的增长。 Git也很快,但是它的存储库会随着修改后的文件而快速增长,直到你重新打包 - 而那些重新打包可能会很慢。 但是打包的存储库比Mercurial小得多。


#9楼

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

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


#10楼

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

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

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

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

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

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

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

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


#11楼

我目前正在从SVN迁移到DVCS(在博客上发表关于我的发现,我的第一次真正的博客努力......),我做了一些研究(= google搜索)。 据我所知,你可以用这两个包完成大部分工作。 似乎git有一些更多或更好的实现高级功能,我觉得与使用TortoiseHg的mercurial相比,与windows的集成更好一些。 我知道Git Cheetah也是如此(我尝试了两种),但是这种多变的解决方案感觉更强大。

看看他们是如何开源的(对吗?)我认为其中任何一个都不会缺乏重要的功能。 如果某些事情很重要,人们就会要求它,人们会对它进行编码。

我认为对于常见的做法,Git和Mercurial绰绰有余。 他们都有大型项目使用它们(Git - > linux内核,Mercurial - > Mozilla基础项目,当然还有其他项目),所以我认为其中任何一个都没有。

话虽如此,我对其他人对此的看法感兴趣,因为它会为我的博客努力提供一个很好的资源;-)


#12楼

这些文章可能有所帮助

  • Git vs. Mercurial:请放松 (Git是MacGyver,Mercurial是James Bond)
  • Mercurial与Git的区别

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

  • Git是Wesley Snipes,Mercurial是Denzel Washington

#13楼

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

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


#14楼

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

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


#15楼

我意识到这不是答案的一部分,但在这方面,我也认为NetBeans和Eclipse等平台的稳定插件的可用性在哪个工具更适合任务,或者更确切地说,哪个工具最适合“你”。 也就是说,除非你真的想以CLI方式做到这一点。

Eclipse(以及基于它的所有内容)和NetBeans有时都会遇到远程文件系统(如SSH)和文件外部更新的问题; 这也是你想要“无缝地”工作的另一个原因。

我现在也试图为自己回答这个问题..而且我已经将候选人归结为Git或Mercurial ..感谢大家提供有关这个主题的有用信息,而不是虔诚的。


#16楼

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


#17楼

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

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

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


#18楼

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


#19楼

mercurial网站对两个系统之间的异同进行了很好的描述 ,解释了词汇和基本概念的差异。 作为一个长期的git用户,它确实帮助我理解了Mercurial的心态。


#20楼

如果要从SVN迁移,请使用Mercurial,因为SVN用户更容易理解其语法。 除此之外,你也不会出错。 但是在选择其中一个之前,请检查GIT教程和HGinit 。


#21楼

另一个有趣的比较mercurial和git: Mercurial和Git 。 主要关注内部及其对分支过程的影响。


#22楼

如果我正确地理解它们(并且我远不是每个人的专家),他们从根本上都有不同的理念。 我第一次使用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---oo---o---o---o\o---oo---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甚至有命令来决定你想要复制到舞台的同一文件中的哪些特定行,这样你也可以单独拆分这些提交。 你为什么想这么做? 因为作为单独的提交,其他人只能提取他们想要的提交,或者如果有问题,他们只能恢复有问题的提交。


#23楼

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

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


#24楼

我在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文件 :它是一个生成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对我来说更加优雅。


#25楼

这个链接可以帮助您理解差异http://www.techtatva.com/2010/09/git-mercurial-and-bazaar-a-comparison/

Mercurial和Git有什么区别?相关推荐

  1. git init 与 git init --bare 区别

    git init 与 git init --bare 区别 发现问题 最早是在公司的wiki上发现了这个命令,google后发现值得记录下来 实践中发现的区别 网上找了很多资料,但说的很乱,干脆在自己 ...

  2. git:Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists)....

    Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists). 解决办法一:保 ...

  3. Git的学习与使用(一)——Git 与 SVN 区别

    Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件. Git ...

  4. Git rebase 和 Git merge 的区别,你知道吗?

    编辑搜图 请点击输入图片描述 Git是大多数程序必备的工具之一,Git常用那么几个命令:pull.push.status.merge.rebase.Git rebase 和 Git merge都是合并 ...

  5. git fetch实战以及与git pull 的区别

    共有四种方式 1.git fetch 这一步执行两个操作 创建并更新所有远程分支的本地分支并设定当前当前分支 的fetch_head为远程的master 2.git fetch origin 同上只不 ...

  6. `git fetch` 和 `git remote update origin --prune` 的区别(以及跟`git pull` 的区别)

    git fetch 和 git remote update origin --prune 的区别 git fetch 拉取分支,远程被删除的分支不会同步删除本地origin的分支(origin/xxx ...

  7. git pull 和 git fecth 的区别

    git pull 和 git fecth 的区别 平时在使用git的时候,更新代码习惯性的会去使用git pull命令.后来才注意到,git fetch的使用会是更加合理的,安全的. (以下部分内容参 ...

  8. 彻底理解git 本地分支与远程分支,以及git pull与git fetch的区别, 以及git status输出的“Your branch is behind xxx”

    git 本地分支: 当clone一个远程repo之后,默认会新建一个master或main的本地分支. 比如: $ git branch -a * mainremotes/origin/HEAD -& ...

  9. Git 与 SVN 区别

    Git 与 SVN 区别 Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等. 如果你是一个具有使用 SVN 背景的人,你需要做一定的思想转换,来适应 Git 提供的一些概 ...

最新文章

  1. Web Components是不是Web的未来
  2. 分类器可视化解释StylEx:谷歌、MIT等找到了影响图像分类的关键属性
  3. SQL Server 6.5 如何升级到SQL Server 2000—以前原创(二)
  4. 修改服务器名后,sql server的配置处理
  5. JVM学习笔记之-对象的实例化,内存布局与访问定位,直接内存(Direct Memory)
  6. php变量使用,php变量的使用
  7. mysql count 优化索引_如何通过使用索引在InnoDB上优化COUNT(*)性能
  8. 深圳行:1207-Day 1 - 到达
  9. 获取当前时间---年月日时分秒------iOS
  10. 把“~/niunantest.aspx”转成http://localhost:4532/test/niunantest.aspx的方法
  11. leetcode—14.链表反转类题目python解答
  12. 项目--Asp.net全局变量的设置和读(web.config 和 Gloab)
  13. 暑假学习打卡【4】——北理工乐学第四周作业
  14. 机器学习| 面试题:11、LDA算法原理
  15. 微软远程桌面0x104_win10系统远程桌面出现错误0x204的解决方法
  16. 神经网络模型用于数学建模
  17. angularjs-大漠穷秋
  18. 8种方法突破iGuard网页防篡改软件保护
  19. linux机械硬盘提速,4个机械硬盘优化设置技巧 让你的硬盘速度飞起来
  20. 台式计算机风扇为什么光散热,装上RGB风扇,老机箱变的炫酷了是怎么回事

热门文章

  1. 自己动手实现OpenGL之glViewPort(一)
  2. Java 代码多线程问题
  3. 【剑指offer-Java版】14调整数组顺序使奇数位于偶数前面
  4. java.lang.AbstractMethodError: com.mysql.jdbc.PreparedStatement.setCharacterStream(ILjava/io/Reader;
  5. Activity销毁重建导致LiveData数据倒灌
  6. android studio安装中出现Failed to install Intel HAXM错误的解决方法
  7. 通过反射来创建对象?getConstructor()和getDeclaredConstructor()区别?
  8. RocketMQ NameServer启动要初始化哪些参数
  9. 16.oauth2 + oidc 实现 client部分
  10. [C++] stack和queue的常用函数