Skip to content
01.版本控制»01.Git»03.远程仓库»LV010-tag标签.md

LV010-tag标签

参考:Git - 打标签 (git-scm.com)

一、什么是 tag?

1. tag 的简单理解

tag 中文我们可以称它为标签。 简单的理解,tag 就是 对某次 commit 的一个标识,相当于起了一个 别名。 例如,在项目发布某个版本的时候,针对最后一次 commit 起一个 v1.0 这样的标签来标识里程碑的意义。

自己觉得吧,这个主要是在远程仓库中使用很方便,可以清楚的标记一些稳定的版本。

2. tag 的类型

Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)。

轻量标签很像一个不会改变的分支——它只是某个特定提交的引用。它不会存储任何额外的信息。

而附注标签是存储在 Git 数据库中的一个完整对象, 它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间, 此外还有一个标签信息,并且可以使用 GNU Privacy Guard (GPG)签名并验证。 通常会建议创建附注标签,这样你可以拥有以上所有信息。但是如果你只是想用一个临时的标签, 或者因为某些原因不想要保存这些信息,那么也可以用轻量标签。

二、本地仓库 tag 操作

1. 准备一个代码仓库

我们准备一个代码仓库:git-example: 学习 Git 的时候的测试仓库 (gitee.com),我们把它 clone 下来,它包含这些提交记录:

image-20241025075715046

说明:这个仓库在这次提交之前是没有任何 tag 的:feat: 添加 readme 文件 · 95f3a07 · 苏木/git-example - Gitee.com

image-20241025175213043

2. 查看标签

2.1 查看标签列表

shell
git tag #  直接列出所有的标签

git tag -l [标签名称筛选字符串*]     # 可以根据 xxxx 进行标签的筛选
# 或者
git tag --list [标签名称筛选字符串*] # 可以根据 xxxx 进行标签的筛选

2.2 查看标签的提交信息

shell
git show 标签名

轻量标签 和 附注标签 的信息是不一样的。

3. 创建标签

注意:可以对同一个提交记录创建不同的标签,但是不能对不同的提交记录创建相同的标签(不区分轻量标签和附注标签,主要名称相同均会报错)。

3.1 创建轻量标签

3.1.1 基本命令
shell
git tag 标签名
# or
git tag 标签名 提交版本
3.1.2 使用实例

我们先看一下提交记录:

shell
sumu@sumu-virtual-machine:~/6RK3568/repo-test/git-example$ git mylog
* [qidaink] 95f3a07 : feat:添加readme文件  (HEAD -> master, origin/master, origin/HEAD) (2023-06-23 14:47:53)
*   [qidaink] 9d04b8f : feat:C6 合并iss53(冲突已解决)  (2023-06-23 11:12:50)
|\
| * [qidaink] 684f9e8 : feat:C5 结束BUG的修复[issue 53]  (origin/iss53) (2023-06-23 10:36:42)
| * [qidaink] 2f0500f : feat:C3 修复C1出现的BUG[issue 53]  (2023-06-23 09:23:52)
* | [qidaink] f5a3adf : feat:C4 修复紧急问题  (origin/hotfix) (2023-06-23 10:06:53)
|/
* [qidaink] 08ec435 : feat:C2功能开发  (2023-06-23 08:57:24)
* [qidaink] 65b2acb : feat:C1功能开发  (2023-06-23 08:56:56)
* [qidaink] 859b8ea : feat:C0功能开发  (2023-06-23 08:56:15)
  • 不指定提交版本
shell
git tag V2023_06_23_14_47_53
image-20241025180213494
  • 指定提交版本
shell
git tag V2023_06_23_11_12_50 9d04b8f
image-20241025180406993

3.2 创建附注标签

3.2.1 基本命令
shell
git tag -a 标签名称 -m 附注信息
# or
git tag -a 标签名称 提交版本号 -m 附注信息

说明:

  • -a : 理解为 annotated 的首字符,表示 附注标签

  • -m : 指定附注信息

  • git tag -a 标签名称 -m 附注信息 :直接给当前的提交版本创建一个 【附注标签】

  • git tag -a 标签名称 提交版本号 -m 附注信息 :给指定的提交版本创建一个【附注标签】

3.2.2 使用实例

还是先看提交记录

shell
sumu@sumu-virtual-machine:~/6RK3568/repo-test/git-example$ git mylog
* [qidaink] 95f3a07 : feat:添加readme文件  (HEAD -> master, tag: V2023_06_23_14_47_53, origin/master, origin/HEAD) (2023-06-23 14:47:53)
*   [qidaink] 9d04b8f : feat:C6 合并iss53(冲突已解决)  (tag: V2023_06_23_11_12_50) (2023-06-23 11:12:50)
|\
| * [qidaink] 684f9e8 : feat:C5 结束BUG的修复[issue 53]  (origin/iss53) (2023-06-23 10:36:42)
| * [qidaink] 2f0500f : feat:C3 修复C1出现的BUG[issue 53]  (2023-06-23 09:23:52)
* | [qidaink] f5a3adf : feat:C4 修复紧急问题  (origin/hotfix) (2023-06-23 10:06:53)
|/
* [qidaink] 08ec435 : feat:C2功能开发  (2023-06-23 08:57:24)
* [qidaink] 65b2acb : feat:C1功能开发  (2023-06-23 08:56:56)
* [qidaink] 859b8ea : feat:C0功能开发  (2023-06-23 08:56:15)

比起上面,这里的信息多了轻量标签的一些信息。

  • 不指定提交版本
shell
git tag -a V2023_06_23_14_47_53-release -m "发布版本V2023_06_23_14_47_53-release"
image-20241025181045042
  • 指定提交版本
shell
git tag -a V2023_06_23_11_12_50-release 9d04b8f -m "发布版本V2023_06_23_11_12_50-release"
image-20241025181514042

4. 删除标签

4.1 基本命令

shell
git tag -d 标签名称
4.2 使用实例

先查看一下提交记录:

shell
sumu@sumu-virtual-machine:~/6RK3568/repo-test/git-example$ git mylog
* [qidaink] 95f3a07 : feat:添加readme文件  (HEAD -> master, tag: V2023_06_23_14_47_53-release, tag: V2023_06_23_14_47_53, origin/master, origin/HEAD) (2023-06-23 14:47:53)
*   [qidaink] 9d04b8f : feat:C6 合并iss53(冲突已解决)  (tag: V2023_06_23_11_12_50-release, tag: V2023_06_23_11_12_50) (2023-06-23 11:12:50)
|\
| * [qidaink] 684f9e8 : feat:C5 结束BUG的修复[issue 53]  (origin/iss53) (2023-06-23 10:36:42)
| * [qidaink] 2f0500f : feat:C3 修复C1出现的BUG[issue 53]  (2023-06-23 09:23:52)
* | [qidaink] f5a3adf : feat:C4 修复紧急问题  (origin/hotfix) (2023-06-23 10:06:53)
|/
* [qidaink] 08ec435 : feat:C2功能开发  (2023-06-23 08:57:24)
* [qidaink] 65b2acb : feat:C1功能开发  (2023-06-23 08:56:56)
* [qidaink] 859b8ea : feat:C0功能开发  (2023-06-23 08:56:15)

会发现显示了 log 信息中会大概显示 tag 的信息。然后我们看一下都有哪些 tag:

shell
sumu@sumu-virtual-machine:~/6RK3568/repo-test/git-example$ git tag -l
V2023_06_23_11_12_50
V2023_06_23_11_12_50-release
V2023_06_23_14_47_53
V2023_06_23_14_47_53-release

我们现在删除两个轻量标签:

shell
git tag -d V2023_06_23_11_12_50
git tag -d V2023_06_23_14_47_53
image-20241025181905078

5. 不同分支的标签

5.1 分支准备

我们删除前面创建的所有标签:

shell
git tag -d V2023_06_23_11_12_50
git tag -d V2023_06_23_11_12_50-release
git tag -d V2023_06_23_14_47_53
git tag -d V2023_06_23_14_47_53-release

其实我的这个仓库是有多个分支的:

image-20241025182247250

我们也可以通过这个命令查看:

shell
git branch -a
image-20241025182348368

我这里本地会有两个是因为我刚才用 git checkout repo-demo 命令迁出了 repo-demo 分支:

image-20241025182439537

我们看一下两个分支的提交记录:

shell
sumu@sumu-virtual-machine:~/6RK3568/repo-test/git-example$ git checkout master
已经位于 'master'
您的分支与上游分支 'origin/master' 一致。
sumu@sumu-virtual-machine:~/6RK3568/repo-test/git-example$ git mylog
* [qidaink] 95f3a07 : feat:添加readme文件  (HEAD -> master, origin/master, origin/HEAD) (2023-06-23 14:47:53)
*   [qidaink] 9d04b8f : feat:C6 合并iss53(冲突已解决)  (2023-06-23 11:12:50)
|\
| * [qidaink] 684f9e8 : feat:C5 结束BUG的修复[issue 53]  (origin/iss53) (2023-06-23 10:36:42)
| * [qidaink] 2f0500f : feat:C3 修复C1出现的BUG[issue 53]  (2023-06-23 09:23:52)
* | [qidaink] f5a3adf : feat:C4 修复紧急问题  (origin/hotfix) (2023-06-23 10:06:53)
|/
* [qidaink] 08ec435 : feat:C2功能开发  (2023-06-23 08:57:24)
* [qidaink] 65b2acb : feat:C1功能开发  (2023-06-23 08:56:56)
* [qidaink] 859b8ea : feat:C0功能开发  (2023-06-23 08:56:15)

sumu@sumu-virtual-machine:~/6RK3568/repo-test/git-example$ git checkout repo-demo
切换到分支 'repo-demo'
您的分支与上游分支 'origin/repo-demo' 一致。
sumu@sumu-virtual-machine:~/6RK3568/repo-test/git-example$ git mylog
* [sumu] 3c94a66 : 添加一个repo-demo测试分支  (HEAD -> repo-demo, origin/repo-demo) (2024-10-25 06:56:51)
* [qidaink] 95f3a07 : feat:添加readme文件  (origin/master, origin/HEAD, master) (2023-06-23 14:47:53)
*   [qidaink] 9d04b8f : feat:C6 合并iss53(冲突已解决)  (2023-06-23 11:12:50)
|\
| * [qidaink] 684f9e8 : feat:C5 结束BUG的修复[issue 53]  (origin/iss53) (2023-06-23 10:36:42)
| * [qidaink] 2f0500f : feat:C3 修复C1出现的BUG[issue 53]  (2023-06-23 09:23:52)
* | [qidaink] f5a3adf : feat:C4 修复紧急问题  (origin/hotfix) (2023-06-23 10:06:53)
|/
* [qidaink] 08ec435 : feat:C2功能开发  (2023-06-23 08:57:24)
* [qidaink] 65b2acb : feat:C1功能开发  (2023-06-23 08:56:56)
* [qidaink] 859b8ea : feat:C0功能开发  (2023-06-23 08:56:15)

可以看到在 master 分支的 95f3a07 这个地方迁出了 repo-demo 分支,并且产生了一次提交。

5.2 相同提交记录创建 tag

两个分支是有相同的部分的,我们看看能否创建相同和不同的 tag。我们选择这个提交记录为 9d04b8f 的版本创建 tag:

image-20241025183207305

5.2.1 创建相同 tag
shell
git checkout master
git tag V2023_06_23_11_12_50-master 9d04b8f
git checkout repo-demo
git tag V2023_06_23_11_12_50-master 9d04b8f
image-20241025183831133

可以得到以下结论:

(1)不可以在不同分支的相同提交记录创建相同的 tag,tag 名必须是唯一的。

(2)我们在 repo-demo 分支上查看 tag。依然可以看到 master 分支的 tag。

5.2.2 创建不同的 tag

这个显然是可以的,刚才我们已经在 master 创建了一个 tag,我们在 repo-demo 创建另一个:

shell
git checkout repo-demo
git tag V2023_06_23_11_12_50-repo-demo 9d04b8f
image-20241025183933873

我们切换回 master 分支:

image-20241025184005057

依然可以看到所有 tag。

5.3 不同提交记录创建 tag

先删除所有的 tag,从前面提交记录可以看出,repo-master 是比 mater 超前的,我们在 mater 随便改一下也进行一次提交:

image-20241025184423124

然后我们分别在 master 分支的 d8c1ae8 和 repo-demo 分支的 3c94a66 创建以下 tag

shell
git checkout master
git tag V2023_10_25_14_47_53-master d8c1ae8
git checkout repo-demo
git tag V2023_06_23_06_56_51-repo-demo 3c94a66
image-20241025184705476

会发现不管在哪个分支都可以看到所有的 tag。

三、远程仓库 tag 操作

1.准备一个代码仓库

和之前一样:git-example: 学习 Git 的时候的测试仓库 (gitee.com)

image-20241025175213043

不包含任何 tag。然后 clone 下来,准备两个分支:

shell
git clone git@gitee.com:sumumm/git-example.git
git checkout repo-demo
image-20241025185102641

repo-demo 分支的提交记录如下:

image-20241025185413080

2. tag 准备

我们在两个分支分别创建 tag:

shell
git checkout master
git tag V2023_06_23_14_47_53-master 95f3a07

git checkout repo-demo
git tag V2024_10_25_06_56_51-repo-demo 3c94a66
image-20241025185541528

3. 推送到远程仓库

3.1 基本命令

shell
git push origin 标签名称
# or
git push origin --tags

3.2 使用实例

我们好像处于哪个分支都可以,我们在 master 分支推送吧:

shell
git checkout master
git push origin V2023_06_23_14_47_53-master
git push origin V2024_10_25_06_56_51-repo-demo
image-20241025185827489

我们来看一下远程仓库:

image-20241025185917690

出现了两个标签,我们点开看一下:

image-20241025185956679

4. 删除远程 tag

4.1 基本命令

shell
git push origin :refs/tags/标签名称
# or
git push origin --delete 标签名称

4.2 使用实例

我们依然是在哪个分支都可以:

shell
git checkout master
git push origin --deleteV2024_10_25_06_56_51-repo-demo
git push origin :refs/tags/V2023_06_23_14_47_53-master
image-20241025190812717

然后我们看一下远程仓库:

image-20241025190845157

会发现这里的 tags 都消失了。

四、下载指定 tag

1. 应用场景

我在 uboot 学习的时候,教程用的是某一个版本的 uboot,它直接是有一个 tag 的,可以通过这个 tag 直接获取这个版本,比如:

image-20241025074017705

2. 基本命令

我现在想在本地拉取这个 tag,我们可以执行:

shell
git clone --branch [tags标签] [git地址]
#或者
git clone -b [tags标签] [git地址]

3. 使用实例

我们来执行看一下:

shell
git clone --depth 1 -b rel_imx_4.1.15_2.1.0_ga git@github.com:nxp-imx/uboot-imx.git
image-20241025074304584

会发现 clone 下来的就是这一次的提交记录,加了 depth 选项,只会 clone 这一次提交,否则由于庞大的提价记录,这里会很慢。这是在哪个分支?我们执行下面的命令看一眼:

shell
git branch
image-20241025191236662

发现他并不属于哪一个分支,其实上面有提示的,我们需要通过哪个 git switch 创建一个分支,例如:

shell
git switch -c master
image-20241025191416256

莫道桑榆晚 为霞尚满天.