28

有许多 git 命令,例如git clone --depth 10 <repo>,需要给出修订数 [ git help revisions]。

提交和修订之间有什么区别(在 git 中,而不是说 svn)?

还是仅在尝试计算修订/提交时以复数形式显示,例如必须通过遍历提交及其父项的 DAG(有向无环图)或其他一些仔细的区别来计算修订?

4

2 回答 2

16

请参阅git rev-parse的“指定修订” :

修订参数<rev>通常但不一定会命名提交对象。
它使用所谓的扩展 SHA1 语法,[并包括]各种拼写对象名称的方法。

所以“revision”是指可以用作参数来引用git 中的对象(通常是提交)的 id。

HEAD@{5 minutes ago}是引用 5 分钟前提交的修订版。

gitrevision提到:

[...] 一些 Git 命令(例如git show)还采用修订参数,这些参数表示除提交之外的其他对象,例如blob(“文件”)或(“文件目录”)。

例如,以下 rev 参数不引用提交:

<rev>:<path>, e.g. HEAD:README, :README, master:./README

后缀:后跟路径命名树状对象中给定路径上的 blob 或树,该对象由冒号之前的部分命名。


Git 中的“提交”通常指定一个“提交对象”(例如,如中所述git commit-tree):

提交封装:

  • 所有父对象 ID
  • 作者姓名、电子邮件和日期
  • 提交者姓名和电子邮件以及提交时间。

所以:

  • 提交指定其中一个git 对象(其他是 blob、树、标签、注释),
  • 修订是引用 git 对象的一种方式。

在您的情况下 ( git clone)--depth <n>会:

创建一个浅克隆,其历史被截断为指定的修订数。

它适用于在该深度可访问的所有提交,直至nDAG 中每个路径的修订。
由于结果可能不仅仅是n提交,因此此处更适合使用修订一词,以强调您不只想要n提交,而是任何n可访问的最大修订引用的提交。

但是,在这种情况下,修订明确地引用了可访问的提交(如下图所示)(正如您在“ (浅克隆)比它做出来的更有用吗?git clone --depth 1中提到的)。

问题是“从什么可以到达”?

您引用了这个线程,其中包括:

IIRC,--depth=<n>不是“加深<n>”,而是“确保我至少<n>有更新的提示”。如果您过去以浅克隆方式并在另一方添加比 更多的提交后
获取,那么浅克隆 hack 会给您带来非常无用的语义(即使它可能是内部一致的),因为您无法猜测正确的值应该没有实际获取没有.--depth<n><n>--depth

于 2012-08-03T09:10:35.927 回答
2

有趣的。我以前没有遇到过这种区别,但是从浏览文档和我自己的经验来看,git 中的提交是一个指向项目历史中特定时间点的对象(以及有关它如何到达那里的信息) . 修订版是它的超集,它讨论了引用提交或一系列提交的不同方式。

于 2012-08-03T09:02:21.923 回答