sta*_*tti 5 git version-control mercurial dvcs
我已经使用git了一段时间,因为它是我用过的唯一的DVCS,我学会了很多依赖它对我的工作流程的工作方式.
我现在在一家新公司,他们使用Mercurial,所以我需要了解Mercurial的模型以及它与git的区别,以适应我的工作流程并避免犯下代价高昂的错误.
那么我可以用什么资源呢?
stackoverflow的另一个问题:Git等同于最常见的Mercurial命令?
如果我恢复:" 模型 "," 差异 "," 差异背后的哲学 "以及对" 工作流程 "的影响.在我能想到的差异中,有:
存储在实现方面有很大差异,但在概念方面则不同(正如您所要求的"模型",我将提供更多详细信息):
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 log中nodeid列).要显示一个带有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(或commitid或tagid)碰撞,但这是非常不可能的.在Mercurial中,changesetid只能与另一个碰撞changesetid(对于清单(树)和文件(blob)也是如此),这是更不可能的.
| 归档时间: |
|
| 查看次数: |
535 次 |
| 最近记录: |