Git基础09 — 标签

前言

在日常生活中,标签(tag)就如其名称一样,是为了给某些事物做标记,方便下次快速寻找。

在 Git 中,除了 commit id 、提交信息之外,我们还可以给某次提交记录打上一个标签,方便下次快速寻找和定位。标签在 Git 中不是必须的,您可以根据需要选择性地添加,既可以在新提交记录上添加标签,也可以在已有的提交记录上添加标签。

Git 中的标签分为两种:

  1. 轻量标签(lightweight tag) – 给提交记录打一个标记,仅作为临时标记使用。
  2. 附注标签(annotated tag) – 存储在 Git 数据库中的一个完整对象,该对象包含打标签者的名称、电子邮件地址、日期时间、标签签名等,这些信息还允许被校验与验证。在项目正式发布版本之前,通常都会使用附注标签。

操作 git 中的标签

涉及到的命令有:

  • git tag – 该命令可以对标签进行创建、删除、查看、重命名以及验证。该命令常用选项有:

    • -l – 列出标签,git tag 等同于 git tag -l。该选项也支持可选的模式(pattern),pattern 指的是 Shell 中的通配符,如用 "?" 匹配一个字符;"*" 匹配 0 个或多个任意字符;"[ ]" 匹配括号中的任意一个字符
    • -n<num> – 显示标签注释的前 n 行,若不指定 num,则默认值为 1。该选项需要与 -l 一起使用
    • -a – 创建附注标签
    • -m – 与附注标签一起使用,表示为附注标签添加单行或多行的说明文本。bash 当中,多行文本请使用 \n 进行换行操作,其他平台可考虑忽略 -m 选项,这样会直接请求编辑器。
    • -s – 创建带 GPG 签名的标签
    • -d – 删除现有的给定名称的标签,支持对一个或多个标签的删除
    • --sort=<key> – 按照特定的 key 进行排序。key 可以有 objectsize、authordate、committerdate、creatordate、taggerdate、version:refname等。例如 git tag -l --sort=creatordate 将按照提交记录的创建时间正序排列标签(即最旧提交记录的标签名排在最前面);git tag -l --sort=-creatordate 将按照提交记录的创建时间倒序排列标签(即最新提交记录的标签名排在最前面)
  • git show <tag-name> – 显示某个标签的详细信息

  • git ls-remote --tags <remote-name> – 显示远程仓库的标签信息。

标签名称的规范要求:

  1. 不能以 . 结尾
  2. 不能包含 \
  3. 不能出现 *?[、空格、波浪号(~)、^:
  4. 不能出现两个连续的点
  5. 对单词的大小写无特殊要求
  6. 多个单词可用 -_ 进行连接
  7. 其他未提到的特殊字符

轻量标签

以下为轻量标签的示例:

  1. 为新的提交记录打上一个标签

    上一篇文档我们演示了合并后的冲突解决,我们可以将这次的提交记录(9139f56)打一个标签:

    PS > git log --oneline
    9139f56 (HEAD -> master) 人为解决 error.log 的合并冲突
    94f3acd 新文件 error.log
    40ed5ac 新增三行内容到新文件 error.log
    6f4b5d9 对文件control.txt的第三行进行追加
    33fca75 新增文件control.txt
    4be932e newb1分支中的第一个新文件
    8a77771 修改后的lab-file文件
    f20abbc lab-file初始内容
    47d9368 tmp-file.txt --> Tmp-File.txt
    ae6cc9d First commit
    9a70355 测试文件
    
    PS > git tag Merge-Conflict 9139f56
    
    PS > git tag -l
    Merge-Conflict
  2. 为旧的提交记录(f20abbc)打一个标签

    PS > git tag lab-file f20abbc
    
    PS > git tag -l
    Merge-Conflict
    lab-file

    注意!在默认情况下,标签的排序并不是按照打标签的时间先后顺序进行排序的,而是按照标签名称的字典序(字母序)进行排序。

  3. 查阅已有标签的信息

    PS > git show lab-file
    commit f20abbc2845ea159ffc2bc998a7c374c5f6d4b0f (tag: lab-file)
    Author: xxxx 
    Date:   Sun Mar 9 16:49:29 2025 +0800
    
        lab-file初始内容
    
    diff --git a/lab-file.txt b/lab-file.txt
    new file mode 100644
    index 0000000..5516f96
    --- /dev/null
    +++ b/lab-file.txt
    @@ -0,0 +1 @@
    +hit = frotz(nitfol, mf2.ptr, 1, 0);
  4. 删除已有的标签

    PS > git tag -d Merge-Conflict
    Deleted tag 'Merge-Conflict' (was 9139f56)
  5. 重命名已有的标签

    Git 中并不支持直接对标签名称进行重命名,我们需以间接的方式进行重命名。

    PS > git tag -d lab-file
    Deleted tag 'lab-file' (was f20abbc)
    
    PS > git tag LAB-FILE f20abbc
  6. 对标签进行排序

    PS > git tag alpha 9a70355
    
    PS > git tag beta 33fca75
    
    PS > git tag c1 40ed5ac
    
    PS > git log --oneline
    9139f56 (HEAD -> master) 人为解决 error.log 的合并冲突
    94f3acd 新文件 error.log
    40ed5ac (tag: c1) 新增三行内容到新文件 error.log
    6f4b5d9 对文件control.txt的第三行进行追加
    33fca75 (tag: beta) 新增文件control.txt
    4be932e newb1分支中的第一个新文件
    8a77771 修改后的lab-file文件
    f20abbc (tag: LAB-FILE) lab-file初始内容
    47d9368 tmp-file.txt --> Tmp-File.txt
    ae6cc9d First commit
    9a70355 (tag: alpha) 测试文件
    
    # 默认的字典序
    PS > git tag
    LAB-FILE
    alpha
    beta
    c1
    
    # 按照提交记录的创建时间正序排列标签,即最旧提交记录的标签名排在最前面
    PS > git tag -l --sort=creatordate
    alpha
    LAB-FILE
    beta
    c1
    
    # 按照提交记录的创建时间倒序排列标签,即最新提交记录的标签名排在最前面
    PS > git tag -l --sort=-creatordate
    c1
    beta
    LAB-FILE
    alpha

附注标签

先将前面的示例轻量标签删除:

PS > git tag -d c1 beta LAB-FILE alpha
Deleted tag 'c1' (was 40ed5ac)
Deleted tag 'beta' (was 33fca75)
Deleted tag 'LAB-FILE' (was f20abbc)
  1. 对最新的提交记录创建带说明文本的附注标签

    PS > git log --oneline
    9139f56 (HEAD -> master) 人为解决 error.log 的合并冲突
    94f3acd 新文件 error.log
    40ed5ac 新增三行内容到新文件 error.log
    6f4b5d9 对文件control.txt的第三行进行追加
    33fca75 新增文件control.txt
    4be932e newb1分支中的第一个新文件
    8a77771 修改后的lab-file文件
    f20abbc lab-file初始内容
    47d9368 tmp-file.txt --> Tmp-File.txt
    ae6cc9d First commit
    9a70355 测试文件
    
    # 假设 9139f56 是即将发布的版本,我们可以添加一个带说明文本的附注标签
    PS > git tag -a "v-1.0.0-2025-03-16" -m "第一个发布版本" 9139f56
    
    PS > git tag -l
    v-1.0.0-2025-03-16
    
    PS > git show v-1.0.0-2025-03-16
    tag v-1.0.0-2025-03-16
    Tagger: xxxx 
    Date:   Sun Mar 16 10:04:28 2025 +0800
    
    第一个发布版本
    
    commit 9139f56b551e8b92e9f44cced300d20958f1d66f (HEAD -> master, tag: v-1.0.0-2025-03-16)
    Merge: 94f3acd 40ed5ac
    Author: xxxx 
    Date:   Sat Mar 15 11:25:20 2025 +0800
    
        人为解决 error.log 的合并冲突
    
    diff --cc error.log
    index b064141,77f96c9..af87e92
    --- a/error.log
    +++ b/error.log
    @@@ -1,3 -1,3 +1,4 @@@
    1111
    +NAME
    + ERROR
    3333

    如您所见,附注标签的输出信息分为三部分:

    1. 标签本身的元数据。包含附注标签名称;附注标签的创建者姓名与邮箱;附注标签的创建时间;附注标签的说明;GPG 签名信息(如果有的话)
    2. 标签指向的提交记录的信息
    3. 文件变更的内容
  2. 对历史的提交记录创建附注标签

    PS > git tag -a "v-0.0.1-2025-03-16" -m "test" ae6cc9d 

推送标签到远程仓库

默认情况下,git push 并不会将标签(轻量标签或附注标签)推送到远程仓库。

相关推送的语法:

# 推送单个标签(轻量标签或附注标签都可以)
Shell > git push <remote-name> <tag-name>

# 一次性推送所有标签(不区分轻量标签或附注标签)
Shell > git push <remote-name> --tags

删除远程仓库的标签

删除远程仓库的标签:

# 先将本地的标签删除
Shell > git tag -d <tag-name>

Shell > git push <remote-name> -d :refs/tags/<tag-name>

查看远程仓库的标签

Shell > git ls-remote --tags <remote-name>
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇