我希望这是一个非常简单的问题......但是看起来难以直接从文档中获得答案或在GIT中的命令行中玩游戏。这是场景,我有一个本地回购,我在主人。我创建了一个名为branch1的分支,我checkout branch1。然后我做了一些更改,添加/提交更改(暂存和提交)。此时我用“git tag 1.0”标记branch1。
我的问题是 - 该标签是否会自动获取我在branch1中的事实,因此仅适用于branch1。或者我是否需要使用命令“git tag 1.0 branch1”明确命名它所引用的分支。我在branch1工作目录和主工作目录中尝试了“git branch --list”等,他们都在两种情况下都列出了标签。如果我将branch1重新设置为master,那么我不会对这个结果感到惊讶。但是暂时没有合并更改,我怎么能要求只查看命令行中引用给定分支的标记(如果是这种情况)?
答案 0 :(得分:3)
标签不是指分支。他们指的是提交。这与你所在的分支完全无关。您可能根本不在分支。
git tag foo branch1
不会将标记应用于branch1
。这是将其应用于HEAD
branch1
提交的简写表示法。
答案 1 :(得分:2)
标签不适用于分支,它们适用于提交。标签是标识单个提交的附加标签。切换到master时,该提交仍然具有该标记,因此在列表中看到它并不奇怪。
此外,分支也只是一个提交的标签。当您签出分支时,您将使命名提交成为当前存储库的HEAD。
答案 2 :(得分:2)
提交是一组更改;所以第一次提交从“没有”改变。在第一次改变之后存在的东西和每次提交。通过这种方式,每次提交都依赖于先前的提交,一直到第一次提交。返回到开头的路径包括所有父提交,但由于合并提交有两个或更多父项,因此它并不总是线性的。
在git中有许多方法可以指定要引用的提交;默认值是SHA1哈希值 - 但还有其他哈希值:
HEAD
:当您在存储库中工作时,始终与您一起移动。也就是说,它总是引用在工作目录中检出的当前提交。<branch>
:是一个放在提交上的标签 - 它只是命名提交。它有一个特殊的属性,像HEAD一样,它会自动移动。在这种情况下,<branch>
标签在当前检出<branch>
时创建时会移动到新创建的提交。通过这种方式,<branch>
不仅可以指代单个提交,还可以指提交回到开头的路径。但它始终是一个提交的标签。<tag>
:这是标记提交的另一种方式。但是,与<branch>
不同,<tag>
不会移动。它始终指的是它所放置的单个提交。当在git命令中使用上述任何一个时,它们首先被该命令转换为它们引用的提交。毕竟,它们只是用于引用提交的标签。每个人都完全独立于其他所有人。
一次一个地处理各种相关的问题:
当我在GIT结帐分支然后标记而没有明确指定分支名称会发生什么?
标签不是指分支,它们都是引用提交的标签 - 完全相互独立。所以你的问题有点奇怪&#39;在术语上;这似乎来自你读过的一本书。
git tag ...
:git-tag Manual Page
git tag <tagname> <commit>
通过指定标记名称和标记要附加到的提交来创建标记。该提交可以通过散列,另一个标记,分支或其他方式指定。这不会在用于引用提交的标签和标记之间创建任何类型的连接 - 它只引用提交。
因此,未指定提交时(通过分支或其他方式)会发生什么。好吧,总是指定一个提交 - 如果它可以将该值默认为HEAD
,则git允许保留命令参数。所以会发生什么,就像指定HEAD
:git tag HEAD
。
同样,为了清楚起见,新创建的标记附加到HEAD
当前引用的提交,并且在更改时不会随HEAD
移动。
该标记是否会自动获取我在branch1中的事实,因此仅适用于branch1?
没有。创建标记时,它附加到特定的提交 - 提交也属于哪个分支(如果有)是无关紧要的。
**或者我是否需要使用命令&#34; git tag 1.0 branch1&#34;明确命名它引用的分支?
将分支名称添加到git tag ...
命令只是使用<branch>
作为对当前引用的提交的引用,并将标记附加到该提交。由于分支已签出(在您的示例中),HEAD
也引用相同的提交 - 因此命令git tag <tagname>
,git tag <tagname> HEAD
和git tag <tagname> <branch>
都引用相同的提交并将生成相同的标签。
如何在命令行中查看引用给定分支的标记(如果是这种情况)?
同样,标签不引用分支,只引用提交 - 但是,除此之外,获取附加到单个分支的任何提交的所有标记的列表似乎没有一个单一的命令对于。已经在几个问题(至少)中进行了讨论
此外,对其他答案的评论提出的问题(忽略直接重复):
所以关于你答案的问题是为什么GIT甚至会为&#34; git标签提供语法,如果它完全没有区别呢?
它没有这样的语法 - 这本书已成为试图让这个主题变得简单的受害者。有关正确的git tag <tagname> <commit>
语法的参考,请参阅上一节。
好的,所以你说leg1提交了branch1(听起来对我来说是正确的)所以它只适用于在rebase之前的branch1吗?
首先,HEAD
与分支的头部提交不同。我将上面的HEAD
定义为一个标签,它始终引用当前在工作目录中检出的提交。分支的头部是该分支中最近的提交 - 当前附加分支标签的提交。
顺便说一句,标签不会通过变基法移动。重新创建新的提交,引用旧提交的任何标记将继续引用它们。
所以你是说,例如,我在master中提交,切换到branch1(没有进行任何提交)并执行&#34; git标记然后它仍会标记master中的最后一次提交?
创建的代码将附加到branch1
中的最新提交 - branch1
的头部。由于自master
分支后未创建任何提交,因此master
(其头部)中的最新提交是相同的提交。这只是解决相同提交的另一种方式 - 仅此而已。
我如何只查询标签(提交)所指的分支?
简短回答是使用git branch --contains <commit>
命令并使用标记作为提交的引用,git branch --contains <tagname>
。
在此问题中对此进行了更详细的讨论:How to list branches that contain a given commit?
我认为这涵盖了你所有的独特问题 - 希望它有所帮助。