在git中,commit(s)和revision(s)之间有什么区别

时间:2012-08-03 08:59:04

标签: git version-control

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

提交和修订之间有什么区别(在git中,rather than say svn)?

或者在尝试计算修订/提交时,它只显示复数形式,例如必须通过走向提交及其父母的DAG(有向无环图)或其他一些仔细的区别来计算修订?

2 个答案:

答案 0 :(得分:8)

请参阅SPECIFYING REVISIONS的“git rev-parse”:

  

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

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

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

gitrevision提及:

  

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

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

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

后缀:后跟一个路径,命名在冒号前的部分命名的树形对象中给定路径上的blob或树。


Git中的“提交”通常指定“commit object ”(例如git commit-tree中所述):

  

提交封装:

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

所以:

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

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

  

创建一个浅层克隆,其历史记录被截断为指定数量的修订版

适用于在该深度可访问的所有提交,DAG中每条路径最多n个版本。
由于结果可能超过n提交,因此这里更适合修订术语,以强调您不仅仅需要n提交,而是由{{1}的最大值引用的任何提交修改可访问。

但是,在这种情况下,修订明确引用只能提交(如下图所示)可达(如“Is git clone --depth 1 (shallow clone) more useful than it makes out?”中所述)。

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

您引用了this thread,其中包括:

  

IIRC,n并非“--depth=<n>加深”,但“确保我从更新的提示中获得至少<n> ” 。
  如果你过去采用浅层克隆方式并且在另一方添加了比<n>更多的提交之后使用--depth获取,那么浅克隆黑客会给你很多无用(即使它可能是内部一致的)语义,因为你无法猜出什么是正确的    如果没有<n><n>的值应该没有实际提取。

答案 1 :(得分:0)

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