我一直想知道为什么git更喜欢哈希而不是版本号。修订版本号更清晰,更容易引用(在我看来):告诉某人查看修订版本1200或提交92ba93e之间是有区别的!(仅举一个例子)。
那么,这种设计有什么理由吗?
我一直想知道为什么git更喜欢哈希而不是版本号。修订版本号更清晰,更容易引用(在我看来):告诉某人查看修订版本1200或提交92ba93e之间是有区别的!(仅举一个例子)。
那么,这种设计有什么理由吗?
Answers:
单一的,单调增加的修订版本号仅对集中式版本控制系统才有意义,在该系统中,所有修订版本都流到可以跟踪和分配编号的单个位置。一旦进入DVCS世界,那里存在大量的存储库副本,并且在任意工作流中都将更改从中拉出并推送到它们,那么该概念就不再适用。(例如,没有一个地方可以分配修订号-如果我分叉您的存储库,而您决定在一年后决定进行更改,那么系统如何确保我们的修订号不冲突?)
Person 1: "Hey, <P2>, what was revision 12345 for?" P2: "Revision 12345 was commited by <P3>." P3: "I don't have a revision 12345..."
如果我没记错的话,Mercurial也有类似的问题。另一方面,如果他们使用的是git,则每个提交的引用都相同。
P1: "Do you have revision with the GUID gdlmsnblngoijlafd-35345-fg?"
...集市上仍然有GUID ...
git
。他们还提供了仅限本地的转速编号,以方便键入。
我谨不同意当前的答案。DVCS不需要哈希,请参见Bazaar方法。您也可以使用任何其他类型的全局唯一标识符执行操作。哈希是保证数据完整性的一种措施:它们表示哈希所引用的对象(commit,tree等)中包含的信息的摘要。尽管并非不可能,但是在不更改哈希值的情况下更改内容(即,前图像攻击或碰撞攻击)被认为是困难的。(如果您真的很感兴趣,请参阅Marc Stevens的2011年论文)。
因此,通过对象的SHA哈希引用对象可以检查内容是否已被篡改。并且,由于它们(几乎)保证是唯一的,因此它们也可以用作修订标识符,因此很方便。
有关更多详细信息,请参见Git书的第9章。
用外行的话来说: