我一直在Windows上使用git一段时间(使用msysGit),我喜欢分布式源代码控制的想法.就在最近,我一直在关注Mercurial(hg),它看起来很有趣.但是,我无法解决hg和git之间的差异.
有没有人在git和hg之间进行并列比较?我很想知道hg和git的不同之处,而不必参加讨论.
这些文章可能有所帮助
Git vs. Mercurial:请放松(Git是MacGyver,Mercurial是James Bond)
Mercurial与Git的区别
编辑:比较Git和Mercurial与名人似乎是一种趋势.还有一个:
Git是Wesley Snipes,Mercurial是Denzel Washington
我在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 fetchGIT_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 --forcehg 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:
Mercurial与Git的区别
Reddit线程,git经验丰富的Dustin回答了他自己的git新手问题
他实际上已经广泛使用了两种DVCS并且很好地理解了它们 - 并且最终更喜欢使用git.
最大的区别在于Windows.Mercurial本身支持,Git不支持.您可以通过bitbucket.org获得与github.com非常相似的托管(实际上,当您获得免费的私有存储库时更好).我正在使用msysGit一段时间,但转移到Mercurial并对它非常满意.
如果您是Windows开发人员,正在寻找基本的断开连接的版本控制,请使用Hg.我发现Git是不可理解的,而Hg很简单并且与Windows shell完美集成.我下载了Hg并按照本教程(hginit.com) - 十分钟后我有一个本地回购并重新开始工作.
我认为关于"Mercurial vs. Git"的最佳描述是:
"Git是Wesley Snipes.Mercurial是丹泽尔华盛顿"
它们几乎相同.从我的角度来看最重要的区别(我的意思是,让我选择一个DVCS而不是另一个的原因)是两个程序如何管理分支.
要使用Mercurial启动新分支,只需将存储库克隆到另一个目录并开始开发.然后,你拉和合并.使用git,您必须明确地为要使用的新主题分支命名,然后使用相同的目录开始编码.
简而言之,Mercurial中的每个分支都需要自己的目录; 在git中,您通常在单个目录中工作.在Mercurial中切换分支意味着更改目录; 在git中,这意味着要求git使用git checkout更改目录的内容.
我很诚实:我不知道是否可以对Mercurial做同样的事情,但由于我经常在网络项目上工作,因为我总是使用git这个目录看起来很舒服,因为我没有必要 - 配置Apache并重新启动它,每次分支时我都不会弄乱我的文件系统.
编辑:正如Deestan所说,Hg已命名分支,可以存储在单个存储库中,并允许开发人员在同一个工作副本中切换分支.无论如何,git分支与Mercurial命名分支并不完全相同:它们是永久性的,不会丢弃分支,就像在git中一样.这意味着如果您使用命名分支进行实验任务,即使您决定永不合并它,它也将存储在存储库中.这就是为什么Hg鼓励将克隆用于实验性的,短期运行的任务以及为长期运行的任务命名分支的原因,例如发布分支.
许多Hg用户优先克隆命名分支的原因是社交或文化比技术更多.例如,对于Hg的最新版本,甚至可以关闭命名分支并递归地从变更集中删除元数据.
另一方面,git邀请使用"命名分支",这些分支不是永久性的,并且不作为元数据存储在每个变更集上.
从我个人的角度来看,git的模型与命名分支的概念密切相关,并在分支和另一个分支的同一目录之间切换; hg可以对命名分支做同样的事情,但它鼓励使用克隆,我个人不太喜欢.
git和mercurial之间有一个巨大的区别; 表示每次提交的方式.git将提交表示为快照,而mercurial将它们表示为差异.
这在实践中意味着什么?好吧,git中的许多操作都比较快,例如切换到另一个提交,比较提交等.特别是如果这些提交很远的话.
AFAIK没有mercurial方法的优势.
没有.他们都做同样的事情,两者表现平平.你应该选择一个而不是另一个的唯一原因是,如果你帮助了一个已经使用过的项目..
选择一个的另一个可能原因是只支持系统之一的应用程序或服务.例如,我几乎选择学习git因为github ...
谷歌的比较(虽然有点旧,2008年完成)
http://code.google.com/p/support/wiki/DVCSAnalysis
如果我正确地理解它们(并且我远不是每个人的专家),他们从根本上都有不同的理念.我第一次使用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甚至有命令来决定你想要复制到舞台的同一文件中的哪些特定行,这样你也可以单独拆分这些提交.你为什么想这么做?因为作为单独的提交,其他人只能提取他们想要的提交,或者如果有问题,他们只能恢复有问题的提交.
在versioncontrolblog上有一个动态比较图表,您可以在其中比较几个不同的版本控制系统.
这是git,hg和bzr之间的比较表.
在处理分支(特别是短期分支)方面存在很大的差异.
它是在解释本文(BranchingExplained) ,其与比较GIT中水银.
您的项目中是否有基于Windows的协作者?
因为如果有的话,Git-for-Windows GUI看起来很笨拙,困难,不友好.
相比之下,Mercurial-on-Windows是一个明智的选择.
在bitbucket.org的mercurial和github的git之间要注意的一点是,mercurial可以拥有你想要的尽可能多的私有存储库,但github你必须升级到付费帐户.所以,这就是我选择使用mercurial的bitbucket的原因.
去年的某个时候,我为自己的用途评估了git和hg,并决定使用hg.我觉得它看起来像一个更清洁的解决方案,并且当时在更多平台上运行得更好.不过,这主要是一个折腾.
最近,由于git-svn和作为Subversion客户端的能力,我开始使用git.这让我赢了,我现在完全转向git了.我认为它有一个稍高的学习曲线(特别是如果你需要围绕内部),但它确实是一个伟大的系统.我打算读一下John现在发布的两篇比较文章.