为什么Git使用SHA-1作为版本号?

42

Git使用SHA-1来指定一个提交。

Subversion(SVN)和Mercurial(hg)使用增量编号。

为什么Git团队决定使用SHA-1而不是更加描述性的方式呢?

3个回答

39

Mercurial(hg)也使用SHA1哈希。它只是尝试从提交历史中获取修订版本号。然而,这些修订版本号仅在一个存储库中有效。如果您观看另一个存储库,则不能保证这些修订版本号匹配。

至于为什么git和mercurial使用哈希:两者都具有非线性提交历史。因为两者都是分布式的,人们可以在本地存储库中使用相同的代码基础而不必同步到中央机构(如SVN和CVS所需)。现在,如果人们在本地提交其内容并稍后合并它们,那么您将很难想出一致的模式来形成线性递增的整数修订版本。即使您可以,不同的存储库之间仍会得到不同的结果。

最终,这都是由于分布式性质引起的。这是一种简单的方法,可以提出相当独特的标识符以用于提交。并且,作为副产品,您还可以将完整的历史记录编码为单个提交的哈希值。这意味着,即使您在提交中拥有相同的diff,您也很可能会获得不同的SHA1哈希值。


9

SHA1号码既用作提交标识的方法,也用作验证的方法。SHA1号码是提交中所有更改加上作者姓名和父提交的SHA1号码的校验和。(如果我没记错的话,它还包括提交信息,但不确定)。

当你从远程拉取/获取时,git会检查校验和与你接收到的文件相匹配,以确保你没有收到损坏或修改过的代码版本。


8
为了准确起见,校验和不是针对提交所做的更改,而是针对整个目录树计算得出的。是的,它包括提交信息。每个目录树都有一个 SHA1 名称,该目录树中的每个文件也都有一个。 - Dan Hulme
@robert-rouhani,以我简单的理解,它有助于团队成员在主存储库上具有与git专用于其本地机器上的提交相同的提交标识符,我是对的吗? - aderchox

2
Git和HG都使用SHA1来标识提交。SVN采用连续模式的更改方式,因此能够支持增量版本号,而Git和HG则更为复杂,支持有向无环图形式的开发模型,这种模型更适合频繁的分支和合并。
HG的增量编号与SVN的增量编号不同,并且不适合在不同副本的存储库中引用特定的修订版本,因此不能像SVN修订号一样使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接