我目前正在使用一个有多个分支的存储库。
当我创建标记时,该标记是否引用当时的分支?
换句话说:每当我创建标记时,我是否需要切换到所需的分支并在该分支内添加标记,以便该标记在该时间点引用该分支?
r7s23pms1#
CharlesB's answer和helmbert's answer都很有帮助,但我花了一段时间才理解它们。这是另一种说法:
标签是指向提交的指针,提交独立于分支存在。
重要的是要知道,标签与分支没有直接关系-它们只标识*提交。
可以从任何数量的分支指向该提交-即,它可以是任何数量的分支的历史记录的一部分-包括没有分支。
因此,运行git show <tag>查看标记的详细信息不包含对任何分支的引用,只包含标记指向的提交的ID。
git show <tag>
(提交ID(也称为对象名称或SHA-1 ID)是由十六进制组成的40个字符的字符串。提交内容上的散列数字;例如:6f6b5997506d48fc6267b0b60c3f0261b6afe7a2)
6f6b5997506d48fc6267b0b60c3f0261b6afe7a2
分支机构只能间接地发挥作用:
在创建标签时,通过*暗示该标签将指向**:
不为标记指定目标默认为当前分支的最新提交(也称为头);例如:
git tag v0.1.0 # tags HEAD of *current* branch
将分支名称指定为标记目标默认为该分支的最新提交;例如:
git tag v0.1.0 develop # tags HEAD of 'develop' branch
(正如其他人所指出的,您还可以显式指定一个提交ID作为标记的目标。)
用git describe描述当前分支时:**
git describe
git describe [--tags]描述了当前分支自该分支历史上最近的[可能是轻量级的]标记以来的提交数。
git describe [--tags]
因此,**git describe引用的标签可能不反映最近创建的标签总体。
twh00eeo2#
如果您通过例如创建标记
git tag v1.0
该标记将引用您当前所在分支的最新提交。您可以在那里更改分支并创建标记。
您也可以在标记时只参考其他分支,
git tag v1.0 name_of_other_branch
其将创建对另一分支的最近提交的标签。
或者,通过直接引用某个提交的SHA1,您可以将标记放在任何地方,而不管是哪个分支
git tag v1.0 <sha1>
lc8prwob3#
标记和分支是完全不相关的,因为标记引用特定的提交,而分支是对历史的最后一次提交的移动引用。树枝走了,标签留了下来。
因此,当您标记提交时,如果您向Git提供您想要标记的内容的SHA1,那么Git并不关心哪个提交或分支被 checkout 。
我甚至可以通过引用分支来标记(然后它将标记分支的尖端),然后说分支的尖端在其他地方(例如,使用git reset --hard),或者删除分支。但是,我创建的标签不会移动。
git reset --hard
pn9klfpd4#
当只调用不带任何附加参数的git tag <TAGNAME>时,Git将从您当前的Head(即当前分支的Head)创建一个新标记。当将额外的提交添加到该分支中时,分支头将跟上那些新提交,而标签总是引用相同的提交。
git tag <TAGNAME>
在调用git tag <TAGNAME> <COMMIT>时,您甚至可以指定使用哪个Commit来创建标记。
git tag <TAGNAME> <COMMIT>
无论如何,标记仍然只是指向某个提交(而不是分支)的“指针”。
vltsax255#
我们可以为一些过去的提交创建一个标记:
git tag [tag_name] [reference_of_commit]
例如:
git tag v1.0 5fcdb03
eiee3dmh6#
如果要标记您所在的分支机构,请键入:
git tag <tag>
并通过以下方式推送分支:
git push origin --tags
tnkciper7#
如果想要从类似release/yourbranch等的分支创建标记,则应该使用类似于
release/yourbranch
git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch
创建正确的标签后,如果希望将标签推送到远程,请使用以下命令
git push origin YOUR_TAG_VERSION_OR_NAME
gv8xihay8#
一个相关且有用的命令是
git branch --contains tag/<tag>
它将为您提供所提供的标记所在的所有分支的列表
more detail here…
8条答案
按热度按时间r7s23pms1#
CharlesB's answer和helmbert's answer都很有帮助,但我花了一段时间才理解它们。这是另一种说法:
标签是指向提交的指针,提交独立于分支存在。
重要的是要知道,标签与分支没有直接关系-它们只标识*提交。
可以从任何数量的分支指向该提交-即,它可以是任何数量的分支的历史记录的一部分-包括没有分支。
因此,运行
git show <tag>
查看标记的详细信息不包含对任何分支的引用,只包含标记指向的提交的ID。(提交ID(也称为对象名称或SHA-1 ID)是由十六进制组成的40个字符的字符串。提交内容上的散列数字;例如:
6f6b5997506d48fc6267b0b60c3f0261b6afe7a2
)分支机构只能间接地发挥作用:
在创建标签时,通过*暗示该标签将指向**:
不为标记指定目标默认为当前分支的最新提交(也称为头);例如:
git tag v0.1.0 # tags HEAD of *current* branch
将分支名称指定为标记目标默认为该分支的最新提交;例如:
git tag v0.1.0 develop # tags HEAD of 'develop' branch
(正如其他人所指出的,您还可以显式指定一个提交ID作为标记的目标。)
用
git describe
描述当前分支时:**git describe [--tags]
描述了当前分支自该分支历史上最近的[可能是轻量级的]标记以来的提交数。因此,**
git describe
引用的标签可能不反映最近创建的标签总体。twh00eeo2#
如果您通过例如创建标记
该标记将引用您当前所在分支的最新提交。您可以在那里更改分支并创建标记。
您也可以在标记时只参考其他分支,
其将创建对另一分支的最近提交的标签。
或者,通过直接引用某个提交的SHA1,您可以将标记放在任何地方,而不管是哪个分支
lc8prwob3#
标记和分支是完全不相关的,因为标记引用特定的提交,而分支是对历史的最后一次提交的移动引用。树枝走了,标签留了下来。
因此,当您标记提交时,如果您向Git提供您想要标记的内容的SHA1,那么Git并不关心哪个提交或分支被 checkout 。
我甚至可以通过引用分支来标记(然后它将标记分支的尖端),然后说分支的尖端在其他地方(例如,使用
git reset --hard
),或者删除分支。但是,我创建的标签不会移动。pn9klfpd4#
当只调用不带任何附加参数的
git tag <TAGNAME>
时,Git将从您当前的Head(即当前分支的Head)创建一个新标记。当将额外的提交添加到该分支中时,分支头将跟上那些新提交,而标签总是引用相同的提交。在调用
git tag <TAGNAME> <COMMIT>
时,您甚至可以指定使用哪个Commit来创建标记。无论如何,标记仍然只是指向某个提交(而不是分支)的“指针”。
vltsax255#
我们可以为一些过去的提交创建一个标记:
例如:
eiee3dmh6#
如果要标记您所在的分支机构,请键入:
并通过以下方式推送分支:
tnkciper7#
如果想要从类似
release/yourbranch
等的分支创建标记,则应该使用类似于创建正确的标签后,如果希望将标签推送到远程,请使用以下命令
gv8xihay8#
一个相关且有用的命令是
它将为您提供所提供的标记所在的所有分支的列表
more detail here…