`
ictch
  • 浏览: 135388 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

版本控制工具比较:git vs hg

    博客分类:
  • Java
阅读更多

看到一篇文章,重新又勾起了我对版本控制工具的回忆和兴趣,拿出最好用的两种来比较比较吧:git和hg 。

1.对象模型(Object Model)

hg是采用增量式存储的版本控制系统,它保存相邻版本间的差异,通过在基础版本之上叠加差别的方式记录版本的更新,其组织方式自然采用链表。这点和subversion一致,数据库版本控制工具dbdeploy也采用相同原理。

hg中的基本对象有三种:file、manifest 和changeset

  • changeset可以理解为版本的代名词了,它记录了该版本的信息,changeset间的采用链式索引,由一个根开始;
  • 每一个changeset持有对应版本的manifest,这是一个记录repo内当前工程版本下的各文件版本信息的列表;
  • 每个file对应的Revlog 文件才是真正存储各版本以及其数据节点的列表。

git并非采用增量式存储,而是为每个版本创建一个快照,最重要的组织结果是树。

基本对象有三种,自底向上为:blob、tree和commit(还有个tag, 和hg的bookmark类似,略了 )

  • blob存储的是repo中某文件的内容,单纯的二进制方式,不存储包括文件名在内的其他东西。它是脱离于版本之外的存储结构,通过对文件数据的hash值比较可快速区分两个blob,不同版本、或不同目录下、或不同名称但内容相同的文件共有相同的blob对象;
  • tree存储了所有directory和file的组织结构,对directory存为子树,对file保存其对应blob对象的hash值;
  • commit也是版本的标志,它持有tree的root节点地址,相邻commit之间也是链接在一起的,以方面找到上一个版本。

2. 工作目录与专用目录(working dir and Git/Hg dir)

两种版本控制工具都将代码checkout到工作目录下,工作目录中保存的是项目当前branch的当前版本;同时在本地repo的根目录(也是工作目录)下为各自系统建立一个专用的目录(.hg , .git), 存储版本历史、对象与索引和配置文件等。

不同之处在于建立codebase时,这里首先要提到bare repositories的概念。

# Why bare?

一个bare repo与普通repo的区别是没有项目文件的working copy,即repo根目录下只有专用目录,而没有任何其他代码文件和文件夹;这是为了响应作为codebase应当遵循的“Only store, never update from revisions(只存储版本,不更新到实际代码文件)”原则。

hg管理的repo天生就能做codebase使用,无论是否是bare的,这点是由其分布式版本控制系统的本质决定的,它可以随时把当前的repo通过自带的http server发布代码,特别适合分布式开源项目的代码分享。

git也是分布式代码版本管理工具,不过它对作为codebase的repo做了严格的bare要求。可以看到的是许多人在初学git时不了解这一点,抱怨自己做spike时不知如何提交代码到在本机上的codebase。这里顺手写下两个tips:

* 初始建立一个bare repo

      $ git init --bare

* 如果已有一个repo了,使用下面的方法将其转化为bare的

      $ git config --bool core.bare true   , 之后可删除除了repo根目录.git文件夹之外的所有文件,即只保留专用目录

3. 分支与合并(branch and merge)

git中是有同一个repo上不同branch的概念,而hg没有。就是说,git在切换到别的branch上时,仍然是在原来的repo中,工作目录下的代码也会相应地切换到某个版本上;而hg上新建branch 则意味着有了另一个repo,不能算做轻量级的分支(lightweight branch)。

hg中是以heads的概念来维护不同开发者checkout的代码的,它不像SVN这样的集中式版本控制,不需要回归到某一根主线上来(当然常常我们需要这样用,方便持续集成),所以向某个codebase提交时需要先与该branch上的head来merge,结果合并为一个新的共有的head(这显然需要一次提交),此时两条branch交汇到一处。

git中可以在同一repo下,实现在指定branch上独立提交和在不同branch间merge。提交和更新是灵活和易控制的。

另外,hg中鼓励以changeset为单位进行merge后提交,即先将本地修改做本地提交,之后采用mercurial queue或fetch的方式合并后提交到codebase。其原理是head之间的合并。

git中鼓励在未形成本地commit时更新代码并做merge,之后将本地提交和向codebase提交连起来做。因为本地commit之后做更新和合并,并不是git对象模型所擅长的,被迫merge时容易将被引入“no branch”的临时branch状态。这种状态上也是可以进行开发的,但风险是没有正规的branch来记录版本。这里又有一个tip。

# 'no branch' problem

* 从“no branch”状态转回正常branch上, 比如master

  1)在“no branch”状态上完成与代码库的同步,即保证没有重要的本地修改和本地提交残留;

  2)$ git checkout master     ,直接转到master上,这时对no branch的索引就丢失了,该状态不复存在;

  3)$ git log    ,检查master branch上的log,找到是否有本地修改/提交残留(通常是有的,因为是在做merge时出的问题);

  4)$ git reset --hard HEAD~3,    放弃已有的本地提交(假设是3个,如果是两个可用HEADE^^),--hard是删除指针及内容;

  5)在没有本地修改和提交的基础上,就可放心地同步到master上最新的版本了,你知道怎么做这步。

其他

诸如git的unstaged area,mercurial queue以及两个工具的应用模式,都不在此介绍了。

参考

http://mercurial.selenic.com/wiki/GitConcepts

《Git Community Book》

分享到:
评论

相关推荐

    SVN,HG,GIT命令对照.pdf

    SVN(Subversion)、HG(Mercurial)、GIT是三种广泛使用的版本控制系统,它们各自有不同的设计理念和命令集,尽管它们在执行相同或相似功能时具有一定的相似性,但直接命令对应关系并不严格存在。下面将详细介绍...

    Git⾯试真题(10题)

    ### Git面试真题知识点解析 #### 一、版本管理的理解及常用工具 1. **版本管理的概念**: ...而Git作为当前最流行的版本控制工具之一,其强大的功能和灵活的操作方式使其成为大多数开发者的首选。

    SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端管理工具,代码控制管理工具

    软件开发人员:特别是那些使用 Git 或 Mercurial 进行版本控制的开发人员,SourceTree 为他们提供了一个直观的工具来管理代码。 团队协作开发者:需要在团队中协作的开发人员,通过SourceTree可以轻松管理多个开发...

    版本控制管理工具 SourceTree

    SourceTree 是一款强大的版本控制系统客户端,专为Git和Mercurial(Hg)设计,适用于Windows和Mac操作系统。它以其直观的图形用户界面著称,使得对版本控制的操作变得更为简单易用,无论是对于初学者还是经验丰富的...

    Python库 | hg-git-0.2.5.tar.gz

    这可能意味着该库旨在为Mercurial(hg)和Git之间提供互操作性,允许用户在两者之间转换版本控制系统。 标签包括“git”、“python”、“开发语言”和“Python库”,这些标签提供了更多关于这个库的信息。"git"表明...

    Python库 | git-remote-hg-1.0.1.tar.gz

    在软件开发领域,版本控制工具是不可或缺的一部分,它们帮助开发者追踪代码的修改历史,协同工作,以及管理项目源码。Git 和 Mercurial 是两种广泛使用的分布式版本控制系统。在Python开发中,有时候我们可能需要在...

    hg版本控制

    ### HG版本控制知识点详解 #### 一、HG版本控制系统概览 **1.1 为什么使用版本控制系统?** - **版本控制的意义:** - 版本控制系统是一种记录一个或若干个文件内容变化,以便将来查阅特定版本修订情况的系统。 ...

    git使用入门教程

    总结,Git 是一个强大的版本控制工具,它的分布式特性、高效性能和强大功能使其成为开发者的首选。通过熟练掌握 Git,你可以更好地管理和协作代码,提高工作效率。随着实践的深入,你将不断发现 Git 的更多可能性。

    progit-zh git官方文档-中文版

    - **分布式版本控制系统**:如`Git`、`Mercurial`(Hg)、`Bazaar`或`Darcs`等,每个开发者的工作站上都是一个完整的版本库,包括完整的历史记录。这种模式非常适合需要频繁交换代码的团队,同时具有更好的安全性。 ...

    Mercurial to Git

    由于 Git 在社区支持和生态系统上的优势,许多开发者选择将其作为首选的版本控制工具。 要将 Mercurial 仓库转换为 Git 仓库,我们可以利用 `fast-export` 工具。`fast-export` 是一个用于从各种版本控制系统导出到...

    Git权威指南PDF完整版

    第1章 版本控制的前世和今生/ 2 1.1 黑暗的史前时代/ 2 1.2 CVS—开启版本控制大爆发/ 5 1.3 SVN—集中式版本控制集大成者/ 7 1.4 Git—Linus 的第二个伟大作品/ 9 第2章 爱上 Git 的理由/ 11 2.1 每日工作备份/ 11 ...

    SourceTree for Windows Git,Git客户端可视化操作工具

    SourceTree是一款由Atlassian公司开发的免费、强大的Git和Hg(Mercurial)版本控制系统客户端,专为Windows用户设计。它提供了直观易用的图形界面,使得复杂的Git命令通过简单的鼠标点击就能完成,极大地简化了Git的...

    git使用简介

    Git在资源管理上表现优异,以Django项目为例,Git的克隆版本相比其他版本控制系统(如bzr、hg、svn)占用空间更小,但同时包含了完整的项目历史版本,而不仅仅是最后一个版本。 #### 快照而非变更集 Git的另一个...

    fbshipit:在存储库之间复制提交·git→git,git→hg,hg→hg或hg→git

    它支持多种组合,包括 `git → git`,`git → hg`(Mercurial),`hg → hg` 和 `hg → git`,使得开发者可以在不同版本控制系统间灵活地迁移项目或者同步代码变动。 ### 1. Git与Mercurial的差异 Git和Mercurial...

    HGGameOnline:git for hggame 在线版本 1.0(柚子代码)

    它暗示了项目采用了开源社区常见的版本控制工具Git,以管理代码的迭代和协同开发。 【描述】中的“HG游戏在线”进一步确认这是一款在线游戏,而“git for hggame 在线版本 1.0(柚子代码)”意味着Git被用来管理...

    tortoisehg-2.7.1-版本控制-x64

    总的来说,TortoiseHg 2.7.1是Mercurial在Windows平台上的强大工具,为开发者提供了一个便捷的版本控制环境。通过深入理解和熟练运用TortoiseHg,可以极大地提高软件开发的工作效率和协同能力,同时也保障了项目的源...

    经典Git学习资料ProGit

    - **迁移Mercurial仓库**:使用`hg-fast-export`工具将Hg仓库转换为Git仓库。 ##### 9.3 总结 本章介绍了如何将其他版本控制系统(如SVN、Mercurial)的仓库迁移到Git中。 #### 十、Git内部机制 ##### 10.1 ...

    sourceTree git 图形化工具

    SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端,拥有可视化界面,容易上手操作。同时它也是Mercurial和Subversion版本控制系统工具。支持创建、提交、clone、push、pull 和merge等操作。

    Git权威指南(第二版)蒋鑫--整理目录版

    于是公司开始尝试使用分布式版本控制系统,首先采用的是Hg(Mercurial),后来发现多人协同使用Hg和MQ时出现困难,最终公司大胆采用了Git,并结合Topgit等工具进行代码管理,实现了代码库的最终迁移。 随着Git的...

    Git权威指南

    第1篇介绍了版本控制工具的演变历史、git的各种优点,以及它在3种主流操作系统中的安装与配置。第2篇和第3篇既是本书的基础,又是本书的核心,不仅介绍了git的操作和使用,而且还讲解了git的原理。第2篇详细讲解了...

Global site tag (gtag.js) - Google Analytics