LV01-Git-05-远程仓库-03-tag

本文主要是git中tag的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows windows11
Ubuntu Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
点击查看本文参考资料
点击查看相关文件下载
--- ---

参考: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 查看标签列表

1
2
3
4
5
git tag #  直接列出所有的标签

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

2.2 查看标签的提交信息

1
git show 标签名

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

3. 创建标签

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

3.1 创建轻量标签

3.1.1 基本命令

1
2
3
git tag 标签名
# or
git tag 标签名 提交版本

3.1.2 使用实例

我们先看一下提交记录:

1
2
3
4
5
6
7
8
9
10
11
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)
  • 不指定提交版本
1
git tag V2023_06_23_14_47_53
image-20241025180213494
  • 指定提交版本
1
git tag V2023_06_23_11_12_50 9d04b8f
image-20241025180406993

3.2 创建附注标签

3.2.1 基本命令

1
2
3
git tag -a 标签名称 -m 附注信息
# or
git tag -a 标签名称 提交版本号 -m 附注信息

说明:

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

  • -m : 指定附注信息

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

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

3.2.2 使用实例

还是先看提交记录

1
2
3
4
5
6
7
8
9
10
11
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)

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

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

4. 删除标签

4.1 基本命令

1
git tag -d 标签名称

4.2 使用实例

先查看一下提交记录:

1
2
3
4
5
6
7
8
9
10
11
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:

1
2
3
4
5
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

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

1
2
git tag -d V2023_06_23_11_12_50
git tag -d V2023_06_23_14_47_53
image-20241025181905078

5. 不同分支的标签

5.1 分支准备

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

1
2
3
4
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

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

1
git branch -a
image-20241025182348368

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

image-20241025182439537

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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

1
2
3
4
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创建另一个:

1
2
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

1
2
3
4
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下来,准备两个分支:

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

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

image-20241025185413080

2. tag准备

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

1
2
3
4
5
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 基本命令

1
2
3
git push origin 标签名称
# or
git push origin --tags

3.2 使用实例

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

1
2
3
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 基本命令

1
2
3
git push origin :refs/tags/标签名称
# or
git push origin --delete 标签名称

4.2 使用实例

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

1
2
3
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,我们可以执行:

1
2
3
git clone --branch [tags标签] [git地址] 
#或者
git clone -b [tags标签] [git地址]

3. 使用实例

我们来执行看一下:

1
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这一次提交,否则由于庞大的提价记录,这里会很慢。这是在哪个分支?我们执行下面的命令看一眼:

1
git branch
image-20241025191236662

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

1
git switch -c master
image-20241025191416256