Git Commit Generation Numbers

Poo*_*rna 24 git commit

什么是git commit generation number(黑客新闻链接)以及它们的意义是什么?

Von*_*onC 21

只是为了补充siri答案,"提交代号"是:

提交的生成是历史图中的高度,从最远的根开始测量.它被定义为:

  • 如果提交没有父项,则其生成为0.
  • 否则,它的代数比其父代的最大值高1倍.
  • 2005年Git创建时已经提到的一个老话题:

Linus Torwald(7月14日,yester):
好的,所以我看到关于世代号的旧讨论重新浮出水面.
而且我不得不说,经过6年的git使用,我认为多年来代数的概念已经出现了几次并不是巧合:我认为它们的缺乏实际上是我们唯一真正的设计错误.
[...]
它实际上早在2005年7月出现了,所以"让我们在提交中使用世代号"的事情真的很古老.

  • 关于快速了解提交是否是另一个提交的祖先的问题(无需返回DAG - 提交图 - ):

我认为这个问题基本上归结为一个git问题是完全合理的:"可以让X成为提交Y的祖先"(作为一种基本上限制某些算法不必一直走下去的方法).我们已经使用了提交日期,实际上它确实非常有用.但它始终是一个破碎的启发式.

所以,是的,我个人认为生成计数器是一种进行提交日期比较的方法.只要说"如果没有世代号,我们将使用日期戳,并知道它们可能是不正确的",这将是完全正确的.

那个"使用日期戳"后备的东西很可能涉及我们已经做过的所有启发式(即检查看起来很健全的邮票,而不是仅仅信任一个个体).

正如黑客新闻线程所提到的:

生成号是树状态的结果,而时间戳是从提交提交的环境(可能不正确!)环境派生的.

目前,每个提交都存储对父树的引用.
通过解析该树并读取整个历史记录,您可以获得提交层次结构.
因为您需要在许多情况下对提交进行排序,所以读取整个历史记录的效率非常低,因此git使用时间戳来确定提交的顺序.
如果给定机器上的系统时钟关闭,这当然会失败.
使用世代号,您可以从最新提交获得本地订购,而无需依赖时间戳或读取整个树.

当你有一个生成提交时n,任何包含它的后续提交都有生成>n,所以要告诉提交之间的关系,你只需要看远n,你可以立即得到任何中间提交的顺序.
它与"易记"无关.它是关于使git更有效和更强大

  • 不多余:

生成数与父指针表示的历史的实际结构完全不同.

莱纳斯:

不对.只有当你将"...解析整个历史记录"添加到该语句时才会出现这种情况.
而且我们从未解析过整个历史,因为它太昂贵而且无法扩展.所以现在我们依赖于几个黑客的提交日期.
所以不,代数并不是多余的.他们是根本的.这就是六年前我们进行这次讨论的原因.


关于缓存该信息的位置(或者是否应该缓存)仍然存在争议,但是从用户的角度来看,它仍然是一些"容易记住"的信息(这不是提交生成的目标)数):

所以几乎,但不完全,就像其他人一直有的修订号码一样?

是的 - 差不多,但并不完全.
如果你和我各创建一个分支关闭与根提交#123的话,我的理解是,在我的分支随后提交会#124,#125等等,你在你的分支提交也将是#124,#125

进行对比: -与CVS,在那里我会1.124.1.1,1.124.1.2等等,你会1.124.2.1,1.124.2.2或者-使用Subversion,在那里我可能会得到修正125,128129,而服务器给你的提交#124,127130和别人,就得到了一个完全不同的项目部分#126.

只要开发在一个分支上线性地进行,那么是的,它是关于在集中式RCS中作为修订号的保存 - 一旦你开始分支和合并,它完全代表了一个不同的概念.

对于单个存储库,它确实具有与svn revnos非常相似的解释.
您可以在特定存储库中说出"分支的修订版#125".这通常正是人与人之间关于发展的沟通所需要的.
"你能看出那个不稳定的r125中的那个bug吗?" "我已经做了所有更改到r245的产品"
我想如果中央服务器中的"r245 prod"在我的本地回购中是"r100 of prod",那令人困惑的方面是因为我还没有克隆完整的历史记录?