1. Git 提交标签简介

在 Git 中,提交(commit)是版本库历史记录的基本单位。我们可以通过三种方式来引用提交:

  • 哈希 ID(identifier)
  • 引用(ref)
  • 标签(tag)

其中,哈希 ID 是唯一且不可变的,引用(如分支)通常也较为稳定,而标签则更易于修改。

本篇文章主要讨论 如何修改 Git 提交标签。我们会先简要回顾 Git 提交与标签的基础知识,然后分别介绍两种标签类型(轻量标签和带注解标签)的修改方法。

文中所有示例均在 Debian 12(Bookworm)+ GNU Bash 5.2.15 环境下测试通过,除非特别说明,应适用于大多数 POSIX 兼容环境。


2. Git 提交标识

通常,Git 提交通过一个 140 位的 SHA-1 哈希值来标识:

$ git log
commit 5474d2774b473dc5b76e14a66606dcb66cf6ff83 (HEAD -> master)
Author: x <user@example.com>
Date:   Thu Feb 15 15:00:01 2024 -0500

    late modifications

commit e76fd96c911d0ab2d36660dead84b691efa86aa1 (tag: antag, branch1)
Author: x <user@example.com>
Date:   Sat Feb 10 17:01:00 2024 -0500

    major modifications

commit dbe16c5120beefa93d43cbb5a3c83e5f7e2b3b59 (tag: minor)
Author: x <user@example.com>
Date:   Sat Feb 10 10:01:40 2024 -0500

    minor modifications

commit 2dac0d5faf151885a0ed14301041c4dabee88168
Author: x <user@example.com>
Date:   Sat Feb 10 10:01:00 2024 -0500

    init commit

以上输出中,HEAD 指向 master 分支,我们可以用以下三种方式引用当前提交:

  • 哈希 ID:5474d2774b473dc5b76e14a66606dcb66cf6ff83
  • 引用(ref):HEAD
  • 分支名:master

标签(tag)则为提交提供了一个更易读的别名。例如,minor 标签指向 dbe16c5120beefa93d43cbb5a3c83e5f7e2b3b59 提交。

标签通常用于标记版本(如 v0.1、v1.0 等),但一旦标签命名错误或需要调整,就需要修改它。

虽然标签本身是不可变的,但我们可以删除并重新创建它们。接下来我们分别介绍两种标签类型的修改方式。


3. 创建或修改轻量标签(Lightweight Tag)

轻量标签本质上只是一个指向提交的指针,不包含额外信息。它的修改方式相对简单,只需三步:

  1. 用旧标签、哈希或引用创建新标签
  2. 删除旧标签
  3. 推送更改(可选)

我们先查看现有标签:

$ git show minor
commit dbe16c5120beefa93d43cbb5a3c83e5f7e2b3b59 (tag: minor)
[...]

然后创建新标签:

$ git tag v0.1 minor

语法格式如下:

$ git tag <新标签名> <旧标签/哈希/引用>

此时,两个标签都指向同一个提交:

$ git show v0.1
commit dbe16c5120beefa93d43cbb5a3c83e5f7e2b3b59 (tag: v0.1, tag: minor)
[...]

最后删除旧标签:

$ git tag --delete minor
Deleted tag 'minor' (was dbe16c5)

再次查看,确认只保留新标签:

$ git show v0.1
commit dbe16c5120beefa93d43cbb5a3c83e5f7e2b3b59 (tag: v0.1)
[...]

✅ 小贴士:轻量标签适合临时标记,修改也较为简单。


4. 创建或修改带注解标签(Annotated Tag)

带注解标签是一个完整的 Git 对象,包含标签作者、邮箱、时间戳和注释信息。因此,修改它需要额外步骤来保留原有元数据。

修改步骤如下:

  1. 获取原标签的日期
  2. 设置 GIT_COMMITTER_DATE
  3. 创建新标签
  4. 删除旧标签

我们先查看现有标签信息:

$ git show antag
tag antag
Tagger: x <user@example.com>
Date:   Sat Feb 10 17:01:00 2024 -0500

annotated tag

commit e76fd96c911d0ab2d36660dead84b691efa86aa1 (tag: antag, branch1)
[...]

接下来提取标签的提交时间:

$ git log -1 --format=%aI antag
2024-02-10T17:01:00-05:00

将其赋值给 GIT_COMMITTER_DATE

$ export GIT_COMMITTER_DATE=$(git log -1 --format=%aI antag)

然后创建新标签。⚠️注意使用 TAG^{} 语法避免嵌套标签:

$ git tag --annotate v0.2 --message='version v0.2 with major improvements' antag^{}

验证新标签:

$ git show v0.2
tag v0.2
Tagger: x <user@example.com>
Date:   Sat Feb 10 17:01:00 2024 -0500

version v0.2 with major improvements

commit e76fd96c911d0ab2d36660dead84b691efa86aa1 (tag: v0.2, tag: antag, branch1)
[...]

最后删除旧标签:

$ git tag --delete antag
Deleted tag 'antag' (was fd83e3b)

确认只保留新标签:

$ git show v0.2
commit e76fd96c911d0ab2d36660dead84b691efa86aa1 (tag: v0.2)
[...]

✅ 小贴士:使用 TAG^{} 可避免嵌套标签问题,避免 Git 提示。


5. 总结

本文介绍了 Git 提交标签的概念以及如何修改标签。虽然标签本身不可变,但我们可以:

  • 对轻量标签:直接创建新标签 + 删除旧标签
  • 对带注解标签:提取元数据 + 设置环境变量 + 创建新标签 + 删除旧标签

通过这种方式,我们可以在不破坏提交历史的前提下,有效地对标签进行重命名和调整。

✅ 总结建议:

  • 使用 git tag <new> <old> 创建新标签
  • 删除旧标签用 git tag --delete <tag>
  • 对注解标签,注意保留时间戳和避免嵌套
  • 修改标签后记得推送到远程仓库(git push origin <tag>

本文为原创技术文章,转载请注明出处。如需进一步优化或扩展内容,欢迎留言交流。


原始标题:Git Tag Handling and Renaming