【问题标题】:Do Git tags only apply to the current branch?Git 标签是否只适用于当前分支?
【发布时间】:2013-01-14 19:57:42
【问题描述】:

我目前正在使用具有多个分支的存储库。

当我创建一个标签时,那个标签是指当时的分支吗?

换句话说:每当我创建一个标签时,我是否需要切换到该分支内的所需分支和标签,以便标签在那个时间点引用该分支?

【问题讨论】:

    标签: git git-tag


    【解决方案1】:

    CharlesB's answerhelmbert's answer 都很有帮助,但我花了一段时间才理解它们。 这是另一种表达方式:

    • 标签指向提交的指针提交独立于分支存在
      • 重要的是要了解标签与分支没有直接关系 - 它们只识别一个提交
        • 可以从任意数量的分支指向该提交 - 即,它可以是任意数量的分支历史的一部分 - 包括没有。
      • 因此,运行git show <tag> 来查看标签的详细信息不包含对任何分支的引用,只有标签指向的提交的ID。
        • (提交 ID(也称为对象名称或 SHA-1 ID)是 40 个字符的字符串,由十六进制数字组成,这些数字是提交内容的哈希值;例如:6f6b5997506d48fc6267b0b60c3f0261b6afe7a2
    • 分支仅间接发挥作用:
      • 创建标签时,通过暗示提交标签将指向
        • 不为标签指定目标默认为当前分支的最新提交(又名 HEAD);例如。:
          • 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 引用的标签可能无法反映最近创建的标签总体

    【讨论】:

    • 因此,对于给定的标签(例如 v0.1.0),要知道(该源的)实际构建中的实际源是什么,您确实需要知道构建所基于的分支, 正确的?也就是说,给定的提交可能在不同的分支中有不同的后代,对吧?
    • @HawkeyeParker:我不再沉浸在这个过程中,但是您不需要知道分支,因为标签标识了特定的提交(可以是多个分支的一部分),而您可以从那里调查。
    • 但是如果我执行 git show [tagname] 那么它会在作者和日期上方显示一个分支名称,这与“运行 git show 以查看标签的详细信息不包含对任何分支的引用”相矛盾
    【解决方案2】:

    如果您通过例如创建标签

    git tag v1.0
    

    标签将引用您当前所在分支的最新提交。您可以更改分支并在那里创建标签。

    你也可以在标记时只参考另一个分支,

    git tag v1.0 name_of_other_branch
    

    这将为另一个分支的最新提交创建标签。

    或者你可以把标签放在任何地方,不管是哪个分支,直接引用某个提交的SHA1

    git tag v1.0 <sha1>
    

    【讨论】:

      【解决方案3】:

      标签和分支完全不相关,因为标签指的是特定的提交,而分支是对历史最后一次提交的移动引用。树枝走了,标签留下了。

      所以当你标记一个提交时,git 并不关心签出哪个提交或分支,如果你向他提供你想要标记的 SHA1。

      我什至可以通过引用分支来标记(然后它会标记分支的尖端),然后说分支的尖端在其他地方(例如git reset --hard),或者删除分支。但是我创建的标签不会移动。

      【讨论】:

      • 换句话说,标签只是丑陋 git 哈希的好名字。无论存在哪个分支,标签(和哈希)都存在(ed)。
      【解决方案4】:

      当只调用 git tag &lt;TAGNAME&gt; 而没有任何附加参数时,Git 将从您当前的 HEAD(即当前分支的 HEAD)创建一个新标签。当向这个分支添加额外的提交时,分支 HEAD 会跟上那些新的提交,而标签总是指向同一个提交。

      调用git tag &lt;TAGNAME&gt; &lt;COMMIT&gt; 时,您甚至可以指定使用哪个提交来创建标签。

      无论如何,标签仍然只是指向某个提交(而不是分支)的“指针”。

      【讨论】:

        【解决方案5】:

        我们可以为过去的提交创建一个标签:

        git tag [tag_name] [reference_of_commit]
        

        例如:

        git tag v1.0 5fcdb03
        

        【讨论】:

          【解决方案6】:

          如果你想标记你所在的分支,那么输入:

          git tag <tag>
          

          并使用以下命令推送分支:

          git push origin --tags
          

          【讨论】:

            【解决方案7】:

            如果你想从一个类似于release/yourbranch 等的分支创建一个标签 那么你应该使用类似的东西

            git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch
            

            创建正确的标签后,如果您希望将标签推送到远程,请使用命令

            git push origin YOUR_TAG_VERSION_OR_NAME
            

            【讨论】:

              猜你喜欢
              • 2013-08-07
              • 2013-09-10
              • 1970-01-01
              • 2019-06-26
              • 2017-12-18
              • 2015-05-15
              • 2011-08-28
              • 1970-01-01
              • 2011-08-07
              相关资源
              最近更新 更多