git diff tag中的tag指的是什么?如何找到标签指向的位置?

时间:2019-01-29 16:50:04

标签: git

git diff tag中的标记在哪里引用?

我知道该标记是正在比较的项目的HEAD的标记。 但是,如果我像这样使用它:

git diff tag1

并省略tag2,这意味着我位于tag2所引用的workind目录中。那么tag1指向哪里?我是否必须已经获得tag1所指的项目?还是在我的git之类的东西中(我无法引用其他人的存储库)?

如何找到标签指向的位置?

2 个答案:

答案 0 :(得分:1)

--prod --configuration=将显示工作树和索引之间的更改,或者显示$ git diff tag1中的索引。

您可以参考Documentation.

答案 1 :(得分:1)

在我看来,您可能对git diff的工作方式和/或标签和其他Git 引用(或 refs )的方式有错误的思维模式。 > —这里是一个技术术语)。

chepner said in a comment一样,您可以使用git rev-parse查找任何可解析的修订说明符的Git哈希ID。 the gitrevisions documentation中详细介绍了修订说明符的语法。

Git是一个分布式版本控制系统,其设计意味着每个Git存储库都是 all 提交的完整独立集合。 1 每个提交的“真实名称”是一些大的丑陋的哈希ID,例如0d0ac3826a3bbb9247e39e12623bbcfdd722f24c。您可以随时使用此ID告诉Git:看看这个特定的提交。这些名称实际上对人类没有用,因此,我们添加了人类可读的名称。其中包括诸如v1.1之类的 tag 名称(其全名实际上是refs/tags/v1.1),但这些标签名称仅是哈希ID的名称。

通常,当您运行git diff时,您选择两次提交-确实是两张 tree (另一个Git技术术语),但是一次提交有一对一的映射哈希ID或与其等效的ID,以进行比较。 Git提取两棵树并进行比较,从而为您提供总体差异,通常还包含配对文件的一次文件差异。

如果您使用git diff选择一个提交,则它使用的第二棵树就是您在工作树中拥有的树。工作树的内容不是提交(至少现在还不是),但是能够将树(例如最新提交的树)与工作树的内容进行比较非常有用。

令人讨厌但非常有用的是,Git根本不从工作树中进行新的提交。相反,它是从第三树(它们被Git称为 index (有时是暂存区 cache ) >,具体取决于Git的哪个部分正在执行此调用)。因此,Git需要能够将索引与工作树进行比较,或者对索引进行提交,并且git diff也可以做到这一点。

对于git diff tag1的特定情况,Git首先使用等效项将tag1转换为提交或树哈希ID:

git rev-parse tag1^{tree}

^{tree}位是gitrevisions语法,用于:无论是什么,我都需要提交的树状部分,因此,如果您可以将其转换为该部分,那么我们很好。我将使用您提供的树ID来完成我的工作。如果不是,请抱怨并死去。现在git diff拥有一个树ID,没有其他任何东西,它显示:好吧,您要我将您命名的树与工作内容进行比较。 -tree。这就是它的比较。您需要确保工作树的内容正是您所关心的(当然,您提供的名称将为比较提供正确的起始树)。


1 当然,那实际上只是存储库中的所有提交,但这是重言式的。这里的想法是,在一般情况下,您总是拥有所有提交;如果人数不多,您可以使用git fetch让您的Git调用其他Git并提取您缺少的所有新提交,现在您又可以完成了。如果将新提交添加到您的存储库中,您可以让Git通过从您那里获取它们或使用git push将您的提交推到其他Git上,将它们交付到其他Git。

Git确实支持故意忽略某些提交的 shallow 存储库。如果您的存储库较浅,那么您将没有引用,因此无法使用对您没有的任何提交的任何引用。任何引入此类引用的尝试都会根据需要自动引入其提交,以便您同时获得两者。因此,根据定义,如果您有引用(例如像v1.1这样的标记名),那么您也将拥有它的提交。