LV010-tag标签
一、什么是 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 下来,它包含这些提交记录:

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

2. 查看标签
2.1 查看标签列表
git tag # 直接列出所有的标签
git tag -l [标签名称筛选字符串*] # 可以根据 xxxx 进行标签的筛选
# 或者
git tag --list [标签名称筛选字符串*] # 可以根据 xxxx 进行标签的筛选2.2 查看标签的提交信息
git show 标签名轻量标签 和 附注标签 的信息是不一样的。
3. 创建标签
注意:可以对同一个提交记录创建不同的标签,但是不能对不同的提交记录创建相同的标签(不区分轻量标签和附注标签,主要名称相同均会报错)。
3.1 创建轻量标签
3.1.1 基本命令
git tag 标签名
# or
git tag 标签名 提交版本3.1.2 使用实例
我们先看一下提交记录:
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)- 不指定提交版本
git tag V2023_06_23_14_47_53
- 指定提交版本
git tag V2023_06_23_11_12_50 9d04b8f
3.2 创建附注标签
3.2.1 基本命令
git tag -a 标签名称 -m 附注信息
# or
git tag -a 标签名称 提交版本号 -m 附注信息说明:
-a : 理解为 annotated 的首字符,表示 附注标签
-m : 指定附注信息
git tag -a 标签名称 -m 附注信息 :直接给当前的提交版本创建一个 【附注标签】
git tag -a 标签名称 提交版本号 -m 附注信息 :给指定的提交版本创建一个【附注标签】
3.2.2 使用实例
还是先看提交记录
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)比起上面,这里的信息多了轻量标签的一些信息。
- 不指定提交版本
git tag -a V2023_06_23_14_47_53-release -m "发布版本V2023_06_23_14_47_53-release"
- 指定提交版本
git tag -a V2023_06_23_11_12_50-release 9d04b8f -m "发布版本V2023_06_23_11_12_50-release"
4. 删除标签
4.1 基本命令
git tag -d 标签名称4.2 使用实例
先查看一下提交记录:
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:
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我们现在删除两个轻量标签:
git tag -d V2023_06_23_11_12_50
git tag -d V2023_06_23_14_47_53
5. 不同分支的标签
5.1 分支准备
我们删除前面创建的所有标签:
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其实我的这个仓库是有多个分支的:

我们也可以通过这个命令查看:
git branch -a
我这里本地会有两个是因为我刚才用 git checkout repo-demo 命令迁出了 repo-demo 分支:

我们看一下两个分支的提交记录:
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:

5.2.1 创建相同 tag
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
可以得到以下结论:
(1)不可以在不同分支的相同提交记录创建相同的 tag,tag 名必须是唯一的。
(2)我们在 repo-demo 分支上查看 tag。依然可以看到 master 分支的 tag。
5.2.2 创建不同的 tag
这个显然是可以的,刚才我们已经在 master 创建了一个 tag,我们在 repo-demo 创建另一个:
git checkout repo-demo
git tag V2023_06_23_11_12_50-repo-demo 9d04b8f
我们切换回 master 分支:

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

然后我们分别在 master 分支的 d8c1ae8 和 repo-demo 分支的 3c94a66 创建以下 tag
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
会发现不管在哪个分支都可以看到所有的 tag。
三、远程仓库 tag 操作
1.准备一个代码仓库
和之前一样:git-example: 学习 Git 的时候的测试仓库 (gitee.com):

不包含任何 tag。然后 clone 下来,准备两个分支:
git clone git@gitee.com:sumumm/git-example.git
git checkout repo-demo
repo-demo 分支的提交记录如下:

2. tag 准备
我们在两个分支分别创建 tag:
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
3. 推送到远程仓库
3.1 基本命令
git push origin 标签名称
# or
git push origin --tags3.2 使用实例
我们好像处于哪个分支都可以,我们在 master 分支推送吧:
git checkout master
git push origin V2023_06_23_14_47_53-master
git push origin V2024_10_25_06_56_51-repo-demo
我们来看一下远程仓库:

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

4. 删除远程 tag
4.1 基本命令
git push origin :refs/tags/标签名称
# or
git push origin --delete 标签名称4.2 使用实例
我们依然是在哪个分支都可以:
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
然后我们看一下远程仓库:

会发现这里的 tags 都消失了。
四、下载指定 tag
1. 应用场景
我在 uboot 学习的时候,教程用的是某一个版本的 uboot,它直接是有一个 tag 的,可以通过这个 tag 直接获取这个版本,比如:

2. 基本命令
我现在想在本地拉取这个 tag,我们可以执行:
git clone --branch [tags标签] [git地址]
#或者
git clone -b [tags标签] [git地址]3. 使用实例
我们来执行看一下:
git clone --depth 1 -b rel_imx_4.1.15_2.1.0_ga git@github.com:nxp-imx/uboot-imx.git
会发现 clone 下来的就是这一次的提交记录,加了 depth 选项,只会 clone 这一次提交,否则由于庞大的提价记录,这里会很慢。这是在哪个分支?我们执行下面的命令看一眼:
git branch
发现他并不属于哪一个分支,其实上面有提示的,我们需要通过哪个 git switch 创建一个分支,例如:
git switch -c master