本文主要是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下来,它包含这些提交记录:
说明:这个仓库在这次提交之前是没有任何tag的:feat:添加readme文件 · 95f3a07 · 苏木/git-example - Gitee.com
2. 查看标签
2.1 查看标签列表
1 2 3 4 5
| git tag # 直接列出所有的标签 git tag -l [标签名称筛选字符串*] # 可以根据 xxxx 进行标签的筛选 # 或者 git tag --list [标签名称筛选字符串*] # 可以根据 xxxx 进行标签的筛选
|
2.2 查看标签的提交信息
轻量标签 和 附注标签 的信息是不一样的。
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
|
1
| git tag V2023_06_23_11_12_50 9d04b8f
|
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"
|
1
| git tag -a V2023_06_23_11_12_50-release 9d04b8f -m "发布版本V2023_06_23_11_12_50-release"
|
4. 删除标签
4.1 基本命令
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
|
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
|
其实我的这个仓库是有多个分支的:
我们也可以通过这个命令查看:
我这里本地会有两个是因为我刚才用git checkout repo-demo
命令迁出了repo-demo分支:
我们看一下两个分支的提交记录:
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:
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
|
可以得到以下结论:
(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
|
我们切换回master分支:
依然可以看到所有tag。
5.3 不同提交记录创建tag
先删除所有的tag,从前面提交记录可以看出,repo-master是比mater超前的,我们在mater随便改一下也进行一次提交:
然后我们分别在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
|
会发现不管在哪个分支都可以看到所有的tag。
三、远程仓库tag操作
1.准备一个代码仓库
和之前一样:git-example: 学习Git的时候的测试仓库 (gitee.com):
不包含任何tag。然后clone下来,准备两个分支:
1 2
| git clone git@gitee.com:sumumm/git-example.git git checkout repo-demo
|
repo-demo分支的提交记录如下:
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
|
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
|
我们来看一下远程仓库:
出现了两个标签,我们点开看一下:
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
|
然后我们看一下远程仓库:
会发现这里的tags都消失了。
四、下载指定tag
1. 应用场景
我在uboot学习的时候,教程用的是某一个版本的uboot,它直接是有一个tag的,可以通过这个tag直接获取这个版本,比如:
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
|
会发现clone下来的就是这一次的提交记录,加了depth选项,只会clone这一次提交,否则由于庞大的提价记录,这里会很慢。这是在哪个分支?我们执行下面的命令看一眼:
发现他并不属于哪一个分支,其实上面有提示的,我们需要通过哪个git switch创建一个分支,例如: