Mercurial 与 Git 对比

Blog
Author:
Guy GolanGuy Golan
Published On:
9月 26, 2021
Estimated reading time:
1 minute

为什么要比较 Mercurial 和 Git?

版本控制系统 (VCS) 在 DevOps 团队启动、保持工作效率和速度或提高团队表现方面发挥着关键作用。有效的 VCS 不仅需要支持 DevOps 所需的常规操作 – 跟踪变更、记录更新、合并数据等 – 而且还会一直为开发人员所用,因此它必须具有满足团队需求的功能,如:可理解的命令语法、变更可见性等。

过去 10 年中,较为广泛采用的模式是分布式 VCS。在这种模式下,单一来源的真相库副本被共享或克隆到不同的系统中,如:开发人员的笔记本电脑,在本地变更后,再按预定义的模式(如基于中继的模式)将数据合并到真相源。其中两种著名的分布式 VCS 解决方案就是 Mercurial Git。这两种方案都是在 2005 年基于 GNU 通用公共许可证 (GPL) 发布,二者存在一定相似性,同时又有一些差异,处于良好竞争状态,均得到了广泛应用。今天让我们来比较梳理一下 Mercurial 和 Git 吧。

 Mercurial

Mercurial-logo-768x696-1

Mercurial 是一种分布式 CVS,支持保存仓库到本地,然后再将变更合并到集中化版本。

Mercurial 的命令语法设计非常简单,便于用户快速理解。许多用户都认为这种语法更简单、更直观,有助于提高开发速度。基本命令包括:

  • hg init:创建新的仓库
  • hg commit:保存变更到当前仓库
  • hg log:查看仓库中的所有变更
  • hg pull:将其它仓库中的所有变更带入当前库
  • hg push:将当前仓库中的所有变更发送到其它仓库
  • hg serve:创建协作人员可以查看历史并从中拉取数据的 Web 服务器
  • hg merge:加入不同历史线

随着时间推移,在名为修订日志 (RevlogNG) 的数据结构中,线性跟踪各种变更情况。修订日志结构允许 Mercurial 用户在任意时间点与仓库内容交互。这种变更跟踪的方法对于文件数量和贡献者数量众多的项目尤其有效。这在选择 Mercurial 作为其 VCS 的项目都有体现,如 Mozilla 和 NGINX。

变更一旦记录到 Mercurial 历史中,就保持固定不变,不能删除,除非通过回退,以相似的方式记录为新的变更。在确定变更入库的时间和入库人员时,此类永久记录极具价值。

Git

Git-logo_incredibuild

Git 是一种分布式 CVS,支持保存仓库到本地,然后再将变更合并到集中化版本(是不是听起来很熟悉?)。Linux Torvalds 于 2005 年创建了 Git,以支持世界各地开发者对 Linux kernel 的持续开发。

仓库的基本 Git 命令包括:

  • git init / git clone:用于创建新的仓库或复制现有仓库
  • git add:新增 Git 可跟踪的文件和目录;新文件或目录默认不可跟踪
  • git commit:将仓库中对象的当前状态记录到 commit(提交)中
  • git status:打印有关当前状态的信息,包括与上一次提交偏离的信息
  • git branch:用于管理仓库内的本地和远程分支
  • git checkout:从当前分支切换到其它指定分支,如果指定分支不存在,创建新的分支
  • git merge:新增分支历史到其它分支
  • git push:将所有提交历史上传到远程库中
  • git pull:下载当前分支的远程分支,并合并变更到本地版本中

除了这些基本命令外,Git 还有几项命令,可以实现更专业的操作,如:

  • git config
  • git diff
  • git reset
  • git rm
  • git log
  • git show
  • git tag
  • git remote
  • git stash

提交是 Git 的基本操作单元,通过 SHA-1 散列进行明确跟踪。在后台,Git 利用一系列参考来跟踪相互之间的提交,并将各提交的内容编入索引。

Git 的重点是在计算和哲学上进行轻量级廉价的提交操作。通过设计,这种方法可以触发多次提交,特别是在大型分支合并时,Git 具有“变基”的能力,可以从逻辑上将一系列提交折叠为单个提交。这就像是,“所有提交的工作都是一次性完成的”。这是一种重写历史的形式。显然所有变更并非一次性完成,但各变更相对于其它变更的上下文都是折叠、扁平的。

相关文献: C++ 项目 GitHub Actions 的使用

Mercurial Git

从功能和整体力学来看,Mercurial 和 Git 几乎可以互换,但也有几个明显的差异:

  • 实现 由于 Git 的命令结构繁多(也更具体),要采用 Git,可能十分困难;特别是那些刚开始 DevOps 过渡的团队,或者是队伍中没有熟练使用 Git 的开发人员领导的团队,任务更艰巨。Mercurial 专注于一种对开发人员来说更简单、更直观的命令结构,不仅可以使其更易于上手,同时还可以减少开发过程中因命令出错产生的错误。
  • 分支 – Mercurial 针对最新版本的变更创建分支(Mercurial – 集中仓库中的最新分支),支持多个不带子分支(head 指标)的并发变更集,可以合并分支或并行维护,以跟踪并行变更。在 Git 中,分支是专门创建的,即并非因为发生了变更才创建;同时它还属于轻量级操作。许多团队采用 Git 技术都会用到分支,用得多了,就发展出了很多 Git 操作的流行术语。在分支中,Git 利用 SHA-1 checksum 来区分分支历史中的独特点。
  • 历史 – Git 有几种不同的“修改”仓库历史的方法,涉及的命令包括:rollback(回退)、cherry-pick(优选)和 rebase(变基)。可变历史专门选定,旨在利用 Git 仓库的多分支特点实现协同作业;例如,利用变基,将随时间推移的变化折叠为版本库历史中的单个逻辑点。Mercurial 不允许通过设计变更历史记录。
  • 版本跟踪 – Mercurial 按自然数(1、2、3 等)顺序跟踪版本,便于开发人员更直观地理解随时间变化的操作顺序。Git 在提交时计算 SHA-1 散列,该散列是元数据和根对象散列的组合。此方法未在本文中讨论,但对采用 Git 的团队来说,值得一读。所谓 SHA 指的是在修订流中,要查看提交的两个(或多个)开发人员可以查看同一状态,这对于高度分布的团队来说尤为重要。
  • 回退 作为管理仓库生命周期的一部分,Git 包括 revert 命令,该命令会创建不含任何变更(作为指定历史提交的一部分)的新提交。此操作不会修改历史,因为原始、撤销的提交保留在原位,只是提交的效果撤销。通过合并运行 backout 和 revert 命令,Mercurial 可以实现类似功能。
  • 社区 – Git 的用户群体十分活跃,OpenHub 上共有5,418 名用户和1,940 名贡献者,还有大量实现其能力并被全球团队采用的工具;itjobswatch 上有 1,730 个“Git”工作机会。同样的,OpenHub 上 Mercurial 拥有 979 名用户和 728 名贡献者,同时 itjobswatch 上有 44 个工作机会。

Mercurial Git – 比较表

Git Mercurial
实现 由于 Git 的命令和仓库结构极为复杂,团队可能需要花费较长时间才能有所提升 命令更简单、更直观,可以帮助团队快速上手
分支 分支是提交 (SHA) 的指针 分支嵌套到提交内;分支不能重命名、不能删除
历史 可变,通过回退、优选、变基操作 不可变,无法回退
修订跟踪 根据计算的 SHA-1,每次修订都是唯一的 递增编号索引(0、1、2 等)
回退 通过 revert 命令支持回退;通过变基或优选任意操作 通过 backout、revert 命令支持回退
社区 OpenHub 上 Git 有 5,418 名用户和 1,940 名贡献者

itjobswatch 上有 1,730 个 Git 工作机会,不包括 GitOps、GitHub、GitLab 等衍生领域。

OpenHub 上 Mercurial 有 979 名用户和 728 名贡献者

itjobswatch 上有 44 工作机会涉及 Mercurial

结论 – Mercurial Git

在 Mercurial 和 Git 之间进行选择,有三个主要考虑因素:

  1. 是否易于采用 – 从命令语法、复杂程度,到递增编号索引,许多开发人员都认为,入门时 Mercurial 比 Git 更容易学会。相比十年前 CVS 解决方案首次受到欢迎时的情景,目前的状况不太寻常,因为现在开发人员的许多教学课程还包括作为软件开发生命周期 (SDLC) 一部分的版本控制。
  2. 变更跟踪 – Git 的轻量级分支结构鼓励建立多个分支,并扩展到小型工作主体。配合 git rebase,它往往可以实现更频繁的提交,无需担心不必要的数据点污染仓库历史,进而降低作业丢失或陷入仓库历史某一点的概率。许多团队都发现,这种处理仓库历史的方法更友好。
  3. 社区 – Git 拥有庞大且活跃的用户群,不仅能够加快能力迭代,引入新功能,而且还吸引更多人群,帮助新用户从中汲取经验并寻求帮助。

团队在做出选择之前,应权衡考虑各方案的所有能力,并根据组织的具体要求和预期投资,对这些能力进行评估。正确的 CVS 可以赋能开发者发挥其最佳效果;而错误的 CVS 可能增加企业的负担和成本。

Pipeline_1200x360