2

我希望这是一个非常简单的问题......但看似很难从文档中获得直接答案,或者在 GIT 的命令行中玩耍。这是场景,我有一个本地存储库并且在 master 中。我创建了一个名为 branch1 的分支,我签出了 branch1。然后我进行一些更改,添加/提交更改(暂存和提交)。在这一点上,我用“git tag 1.0”标记了 branch1。

我的问题是 - 该标签是否会自动获取我在 branch1 中的事实,因此仅适用于 branch1。或者我是否需要使用命令“git tag 1.0 branch1”明确命名它所引用的分支。我在 branch1 工作目录和主工作目录中尝试了“git branch --list”等,它们都列出了任何一种情况下的标签。如果我将 branch1 重新设置为 master,那么我不会对这个结果感到惊讶。但是暂时,如果不合并更改,我怎么能要求在命令行上只查看引用给定分支的标签(如果是这样的话)?

4

3 回答 3

3

标签不引用分支。它们指的是提交。这与您所在的分支完全无关。您甚至可能根本不在分支

git tag foo branch1

不将标签应用于branch1. 这是将其应用于HEAD提交的简写符号branch1

于 2013-03-02T14:26:42.857 回答
2

标签不适用于分支,它们适用于提交。标签是标识单个提交的附加标签。当您切换到 master 时,该提交仍然具有该标记,因此在列表中看到它也就不足为奇了。

此外,分支也只是一个提交的标签。当您签出一个分支时,您将指定的提交作为您当前存储库的 HEAD。

于 2013-03-02T14:26:13.497 回答
2

提交是一组更改;所以第一次提交从“无”变为某事,并且第一次提交之后的每次提交都会改变之前存在的内容。这样,每个提交都依赖于之前的提交,一直到第一个提交。回到开头的路径包括所有父提交,但由于合并提交有两个或更多父提交,它并不总是线性的。

在 git 中,有多种方法可以指定要引用的提交;默认是 SHA1 哈希——但还有其他的:

  • HEAD:当您在存储库中工作时,始终与您一起移动。也就是说,它总是指在工作目录中签出的当前提交。
  • <branch>: 是放置在提交上的标签——它所做的只是为提交命名。它有一个特殊的属性,就像 HEAD 一样,它会自动移动。在这种情况下,标签会在当前签出<branch>时创建时移至新创建的提交。<branch>通过这种方式,<branch>可以看出 不仅指单个提交,还指返回到开头的提交路径。但它始终是单个提交上的标签。
  • <tag>:这是标记提交的另一种方式。但是,不像<branch>a<tag>不动。它总是指它所放置的单个提交。
  • 等:还有许多其他方式可以引用特定的提交,但以上内容与本次讨论相关。

当在 git 命令中使用上述任何内容时,它们首先由该命令转换为它们所指的提交。毕竟,它们只是用来指代提交的标签。每一个都完全独立于所有其他。

一次一个地处理您的各种但相关的问题:

当我在 GIT 中签出一个分支然后在没有明确指定分支名称的情况下进行标记时会发生什么?

标签不引用分支,它们都是引用提交的标签——彼此完全独立。所以你的问题在术语上有点“奇怪”;这似乎来自你读过的一本书。

手册页中的实际相关语法git tag ...git-tag Manual Page

git tag <tagname> <commit>

标签是通过指定标签名称和标签要附加到的提交来创建的。该提交可以通过散列、另一个标签、分支或其他其他方式指定。这不会在用于引用提交的标签和标签之间创建任何类型的连接——它只是引用一个提交。

因此,当未指定提交时会发生什么(通过分支或其他方式)。好吧,总是指定一个提交——如果git可以将该值默认为.git,则它允许省略命令参数HEADHEAD因此,如果您指定: ,会发生什么情况git tag HEAD

同样,为了清楚起见,新创建的标签附加到当前引用的提交上,并且在它更改时HEAD不会移动。HEAD

该标签是否会自动识别我在 branch1 中的事实,因此仅适用于 branch1?

不。当一个标签被创建时,它被附加到一个特定的提交——提交也属于哪个分支(如果有的话)是无关紧要的。

**或者我是否需要使用命令“git tag 1.0 branch1”明确命名它所指的分支?

将分支名称添加到git tag ...命令只是<branch>用作对它当前引用的提交的引用并将标记附加到该提交。由于分支已签出(在您的示例中),HEAD因此也引用了相同的提交 - 所以 commandgit tag <tagname>和all 都引用了相同的提交git tag <tagname> HEAD并将git tag <tagname> <branch>产生相同的标签。

我怎么能要求在命令行上只查看引用给定分支的标签(如果是这样的话)?

同样,标签不指代分支,只是指提交——但是,除此之外,获取附加到单个分支的任何提交的所有标签的列表似乎不是一个命令。已经在几个问题中讨论过(至少)

此外,来自对其他答案的评论的问题(忽略直接重复):

所以我关于你的回答的问题是,如果 GIT 完全没有区别,为什么它甚至还有“git tag”的语法?

它没有这样的语法——这本书已经成为试图使主题变得更简单的牺牲品。git tag <tagname> <commit>有关正确语法的参考,请参见上一节。

好的,所以你说 branch1 的 HEAD 提交(这听起来对我来说是正确的)所以它只适用于在变基之前的 branch1 对吗?

首先,HEAD与分支的头部提交不同。我HEAD在上面定义为一个标签,它总是引用当前在工作目录中签出的提交。分支的头部是该分支中最近的提交——分支标签当前附加到的提交。

顺便说一句,标签不会通过变基移动。变基创建新的提交,任何引用旧提交的标签将继续引用它们。

那么您是说,例如,我在 master 中提交,切换到 branch1(不进行任何提交)并执行“git 标记,然后它仍会标记 master 中的最后一次提交?

创建的标签将附加到最新的提交中branch1—— branch1. 由于从 分支后没有创建任何提交,因此(其头部)中master的最新提交是相同的提交。master这只是处理相同提交的不同方式——仅此而已。

我如何只查询以查看标签(提交)所指的分支?

简短的回答是使用git branch --contains <commit>命令并将标签用作提交的引用,git branch --contains <tagname>.

在这个问题中更详细地讨论了这一点: 如何列出包含给定提交的分支?

我认为这涵盖了您所有独特的问题——希望它有所帮助。

于 2013-03-02T23:06:28.690 回答