更新时间:2023-07-25 GMT+08:00

标签管理

标签(tag)是Git提供的帮助团队进行版本管理的工具,您可以使用Git标签标记提交,从而将项目中的重要的版本管理起来,以便日后精确检索历史版本。

标签会指向一个commit,就像一种引用,无论后续版本怎么变化,它永远指向这个commit不会变化,相当于一个被永远保存的版本快照(只有手动删除时才会被剔除版本库)。

在使用Git进行代码管理时,您可以根据每次提交(commit)的ID去查找、追述历史版本,这个ID是一长串编码(如下图中所示),相对于熟知的“V 1.0.0”这样的版本号,CommitID不便于记忆,同时也不具备可识别性,这时就可以给重要的版本打上标签,给它一个相对友好的名称(比如“myTag_V1.0.0”“首个商业化版本”)以便更容易记住和追溯它。

如何在控制台为最新的提交创建标签?

  1. 进入仓库列表。
  2. 单击仓库名称进入仓库详情。
  3. 单击“代码”页签下的“Tags”子页签,在这里可以看到标签列表。
  4. 单击“新建”按钮,弹出新建标签页面如下图,选择要基于哪条分支或标签的最新版本进行标签的创建。

    如果在描述中输入信息会生成附注标签(描述相当于 -m 后的内容),不输入则生成轻量标签。(什么是附注标签?

  5. 单击“确定”按钮,即可基于某个分支的最新版本生成标签,页面跳转到标签列表。

如何在控制台为历史版本创建标签?

  1. 进入仓库列表。
  2. 单击仓库名称进入仓库详情。在“代码”页签中,单击“文件 > 历史”页签。
  3. 在历史列表中的某条提交记录中,单击,选择“新建Tag”,弹出为历史版本新建标签的弹窗。

    如果在描述中输入信息会生成附注标签(描述相当于 -m 后的内容),不输入则生成轻量标签。(什么是附注标签?

  4. 单击“确定”按钮,即可基于某个指定历史版本生成标签,页面跳转到标签列表。

在控制台管理标签

  • 在控制台的标签列表中,可查看该远程仓库中的全量标签并进行如下操作。
    • 单击“标签名”,跳转到该标签对应版本的文件列表。
    • 单击“提交号”,跳转到该次提交(commit)的详情页面。
    • 单击,可下载tar.gz或zip格式的被标签版本的文件包。
    • 单击,可以将此标签从代码托管仓库删除(想从本地删除请clone、pull或本地手动-d删除)。

    若仓库设置IP白名单,则只有IP白名单内的机器才可以在界面下载仓库源码,若仓库没有设置IP白名单,则均可在界面下载仓库源码。

  • 在控制台创建分支时,您可以选择基于某个标签去创建分支。
  • 在控制台中,单击“代码”页签,单击目标文件的“文件名称”,单击文件的“对比”页签,可在该文件的提交记录之间做差异对比。

标签的分类

Git提供的标签类型分为两种:

  • 轻量级标签:仅是一个指向特定commit的引用,可以理解为给特定commit起了一个别名。
    git tag <你给标签起的名称>

    如下图是一个轻量标签被查看详情时的显示内容,可以看到它其实就是一次commit的别名。

  • 附注标签:指向一个特定的commit,但在Git中被作为一个完整对象存储,相比于轻量标签,附注标签可以为标签附上说明,类似代码的注释功能,方便注解标签。在标签信息的记录中,除包括标签名、附注标签说明外,同时包含了打标签者名字、电子邮件地址、打标签时间/日期。
    git tag -a  <你给标签起的名称> -m <"你给标签编写的说明">

    如下图是一个附注标签被查看详情时的显示内容,它指向了一次commit,相对于轻量标签它包含了更多的信息。

两种标签都可进行版本标识,附注标签包含了更多的信息,同时其在Git中也以更稳定安全的结构被存储,被更多的应用于大型企业与项目中。

关于标签的常用Git命令

  • 新建轻量标签
    git tag <你给标签起的名称>       #为当前最新的提交打上轻量标签

    示例如下:

    git tag myTag1                   #为当前最新的提交上名称为 myTag1 的轻量标签
  • 新建附注标签
    git tag -a  <你给标签起的名称> -m <"你给标签编写的说明">          #为当前最新的提交打上附注标签

    示例如下:

    git tag -a myTag2 -m "This is a tag." #为当前最新的提交打上名称为 myTag2 的附注标签,标签的备注信息为 This is a tag.
  • 为历史版本打标签
    也可以对于历史版本打标签,只要使用给git log命令获取到历史版本的commit ID就行,以附标签为例,其操作如下。
    git log                 #会显示历史提交信息,获取commitID如下图,只取前几位即可,按 q 返回

    git tag -a historyTag -m "Tag a historical version." 6a5b7c8db    #为commitID为6a5b7c8d开头的历史版本打上一个标签,名称为 historyTag,备注为 Tag a historical version.
    • 执行完新建标签操作,如果无回显则是创建成功,如果有回显一般是标签名称重复(回显如下图),更换标签名称重新执行即可。

    • Git支持为一次commit打上多个标签,其在log中显示如下图,当然标签名不能重复。

  • 查看本地仓库的标签列表
    将目前仓库内的标签的名称全部显示出来,在使用时可对其添加参数达到进行过滤的效果 。
    git tag                                   
  • 查看指定标签详情
    git show <你想查看的标签的名称> 

    示例如下:

    将名称为 myTag1 的标签详细信息和其指向的commit的信息显示出来,其执行回显示例如下。

    git show myTag1

  • 将本地标签推送到远程仓库
    • 默认情况下,将本地仓库推送(git push)到远程仓库时,不会把标签一起推送;当从远程仓库同步内容到本地时(clone、pull),会自动将远程仓库的标签同步到本地仓库,所以如果想将本地标签分享项目里的其他人时,需要使用单独的Git命令,其用法如下。
      git push <远程仓库地址或别名> <你想推送的标签的名称>      #将指定标签推送到远程仓库

      示例如下:

      将名为 myTag1 的本地标签推送到别名为 origin 的远程仓库。

      git push origin myTag1 
    • 当您需要将本地所有新增标签推送到远程仓库时,可使用如下命令
      git push  <远程仓库地址或别名> --tags

      当您在远程仓库建立了一个标签,又在本地仓库建立了一个同名的标签,这时在推送时会失败(出现标签冲突),只能删除其一,再次推送。

      如何在远程仓库查看全量标签?

  • 删除本地标签
    git tag -d <你要删除的标签的名称>

    其应用示例如下图,删除本地名为 tag1 的标签,删除成功。

  • 删除远程仓库标签

    如同标签的创建需要单独手动推送,标签的删除,也需要手动推送,其具体用法如下。

    git push <远程仓库地址或别名> :refs/tags/<你要删除的标签的名称>

    示例如下,图为删除成功。

    git push HTTPSOrigin :refs/tags/666               #删除别名为 HTTPSOrigin 的远程仓库的名为 666 的标签

如何使用标签找回历史版本

当您要查看某个标签指向版本的代码时,可以将其检出到工作区。由于被检出的版本仅隶属于标签,而不属于任何分支,因此该代码可以编辑,但是不能add、commit。您可以基于工作区新建一条分支,在此分支上修改代码,并将此分支合入主干。具体的操作步骤如下所示。

  1. 通过标签检出历史版本。
    git checkout V2.0.0                 #将被标签为 V2.0.0 的版本检出到工作区

  2. 基于当前的工作区新建一条分支并切换到其中。
    git switch -c  forFixV2.0.0         #新建一条名为 forFixV2.0.0 的分支,并切换到其中                

  3. (可选)如果修改了新建的分支的内容,需要将修改内容提交到该分支的版本库中。
    git add .                           #将修改添加到新分支的暂存区
    git commit -m "fix bug for V2.0.0"  #将修改内容存入该分支的版本库

  4. 切换到master分支,并将新建立的分支合入(本示例中为 forFixV2.0.0 分支)。
    git checkout master                #切换到master分支
    git merge forFixV2.0.0             #将基于历史版本的修改 合入到master分支

    以上命令旨在帮助您理解通过标签找回历史版本的过程原理,请根据原理自行裁剪增补Git命令以完成您在特定场景下需要的操作,不建议全流程直接复制使用。