作为一名经验丰富的git用户,我如何才能学会了解Mercurial的工作原理?

sta*_*tti 5 git version-control mercurial dvcs

我已经使用git了一段时间,因为它是我用过的唯一的DVCS,我学会了很多依赖它对我的工作流程的工作方式.

我现在在一家新公司,他们使用Mercurial,所以我需要了解Mercurial的模型以及它与git的区别,以适应我的工作流程并避免犯下代价高昂的错误.

那么我可以用什么资源呢?

she*_*lic 8

与Mercurial官方维基的概念差异相当大.

stackoverflow的另一个问题:Git等同于最常见的Mercurial命令?

评论跟进:

如果我恢复:" 模型 "," 差异 "," 差异背后的哲学 "以及对" 工作流程 "的影响.在我能想到的差异中,有:

  • 对于工作流程,除了缺少暂存区域之外,您应该能够坚持旧的实践(何时提交,何时分支,何时合并,......).
  • 关于分支的哲学的主要区别在于,当Mercurial克隆所有分支时,Git仅克隆指定的分支(如果您只想要一个分支,则可能,但它需要配置).
  • 合并理念并没有什么不同.Git可以合并两个或多个头,但Mercurial只能合并两个头(你有没有更多合并?).
  • 关于重命名的哲学差异很大,每个设计师都捍卫了他的观点.随着Mercurial跟踪重命名,合并可以更容易.如果你使用"递归"策略,Git会尝试在合并时猜测重命名.
  • 存储在实现方面有很大差异,但在概念方面则不同(正如您所要求的"模型",我将提供更多详细信息):

    • Git将数据存储为"对象"("提交对象","树对象","blob对象"或"标记对象",存储为由名称唯一标识的文件,该名称是SHA1哈希).这是某种"文件系统哈希表".对于最新版本,可以打包这些对象以在.git/objects目录下包含较少的小文件.我不会走得更远,我的理解停在这里,因为我从来没有找到用来知道如何奠定位.您可以在对象的内容中进行漂亮的打印:

      git show -s --format=raw <commitid> # changeset content
      git ls-tree <treeid> # list tree content
      git show <fileid> # blob content
      
      Run Code Online (Sandbox Code Playgroud)
    • Mercurial 每个文件的历史记录单独存储"revlog(NG)"格式的 "filelog" .您可以在.hg/store/data(revlogNG)下手动检查文件名.请注意,特殊字符和大写字符是"tilda-underscore encoded".

      您可以使用以下命令列出文件的修订:

      hg debugindex .hg/store/data/<file>.i # hg debugindex <file> also works but you see less of internals
      
      Run Code Online (Sandbox Code Playgroud)

      你已经注意到nodeids不是那个hg log.

      现在,检查内容:

      hg debugdata .hg/store/data/<file>.i <nodeid>
      
      Run Code Online (Sandbox Code Playgroud)

      修订历史记录(或多或少什么你看hg log)存储在.hg/store/00changelog.i(与检查它hg debugindex .hg/store/00changelog.i,你会看到相同的ID作为一个在hg lognodeid列).要显示一个带有id的原始历史记录条目XXXX,请键入hg debugdata .hg/store/00changelog.i XXXX终端.(看第一行,以后会用到YYYY)

      树的状态存储在.hg/store/00manifest.i.nodeid清单中对应的是YYYY.

      hg debugdata .hg/store/00manifest.i YYYY
      
      Run Code Online (Sandbox Code Playgroud)

      这将显示附加的"filename + nodeid"列表.让我们选择文件foo/bar并注意nodeid附加到它并认为它是ZZZZ(行foo/barZZZZ).

      最后一步,访问foo/bar文件的内容:

      hg debugdata .hg/store/data/foo/bar.i ZZZZ
      
      Run Code Online (Sandbox Code Playgroud)
    • 从这个基本的数据存储分析中可以清楚地看到哲学的差异:

      • 当Git提交时,它会(可能有很多)新文件(可以在以后打包).当Mercurial提交时,它会附加到现有文件.

      • 在Git中,a blobid可以与treeid(或commitidtagid)碰撞,但这是非常不可能的.在Mercurial中,changesetid只能与另一个碰撞changesetid(对于清单(树)和文件(blob)也是如此),这是更不可能的.

  • 在Git中,标签是特殊对象,在Mercurial中,它只是存储库中文件中的一个列表(有一些规则可以知道同一个标签的哪个修改后的副本获胜).
  • 在Mercurial中,默认情况下没有"修改"或"rebase",它是一个设计选择(哲学?),总是附加,永远不会删除内容,因为它可能导致并发问题.但有可能扩展.