Skip to content
On this page

Git 标签管理

标签(Tag)是Git中用于标记特定提交的重要功能,通常用于版本发布。本章详细介绍Git标签的创建、管理和使用。

标签基础概念

什么是标签

标签是指向特定提交的引用,通常用于标记发布版本(如v1.0.0)。与分支不同,标签是不可移动的,始终指向同一个提交。

标签类型

Git支持两种类型的标签:

  1. 轻量标签(Lightweight tags):简单的引用,只包含标签名称和指向的提交
  2. 附注标签(Annotated tags):完整的Git对象,包含标签信息、创建者、日期和可选的签名

创建标签

轻量标签

bash
# 创建轻量标签(指向当前提交)
git tag v1.0.0

# 创建轻量标签(指向特定提交)
git tag v1.0.0 commit-hash

# 创建轻量标签(指向特定分支的最新提交)
git tag v1.0.0 main

附注标签

bash
# 创建附注标签
git tag -a v1.0.0 -m "Version 1.0.0"

# 创建附注标签(多行消息)
git tag -a v1.0.0 -m "Version 1.0.0" -m "Release notes:
- Feature 1
- Feature 2
- Bug fixes"

# 创建附注标签(指向特定提交)
git tag -a v1.0.0 commit-hash -m "Version 1.0.0"

# 创建附注标签(使用标签者信息)
git tag -a v1.0.0 -m "Version 1.0.0" -u your-email@example.com

签名标签

bash
# 创建GPG签名标签
git tag -s v1.0.0 -m "Signed version 1.0.0"

# 创建GPG签名标签(指定密钥)
git tag -u GPG_KEY_ID -s v1.0.0 -m "Version 1.0.0"

# 验证签名标签
git tag -v v1.0.0

查看标签

列出标签

bash
# 列出所有标签
git tag

# 按字母顺序列出标签
git tag -l

# 列出匹配模式的标签
git tag -l "v1.*"
git tag -l "v1.0.*"

# 列出标签并显示注释
git tag -n
git tag -n3  # 显示前3行注释

# 按版本号排序(需要安装sort工具)
git tag -l --sort=version:refname

查看标签详情

bash
# 查看标签详细信息
git show v1.0.0

# 查看标签提交信息
git log v1.0.0

# 查看标签指向的提交
git rev-parse v1.0.0

# 查看标签对象信息
git cat-file -p tag-name

管理标签

删除标签

bash
# 删除本地轻量标签
git tag -d v1.0.0

# 删除本地附注标签
git tag -d v1.0.0

# 删除多个标签
git tag -d v1.0.0 v1.0.1 v1.0.2

# 删除匹配模式的标签
git tag -d $(git tag -l "v0.*")

重命名标签

bash
# 重命名标签需要删除旧标签并创建新标签
git tag new-name old-name
git tag -d old-name
git push origin :refs/tags/old-name
git push origin new-name

远程标签操作

推送标签

bash
# 推送单个标签到远程
git push origin v1.0.0

# 推送所有标签到远程
git push origin --tags

# 推送匹配模式的标签
git push origin $(git tag -l "v1.0.*")

获取远程标签

bash
# 获取远程标签
git fetch origin

# 获取所有远程标签
git fetch --tags

# 获取特定标签
git fetch origin tag v1.0.0

# 更新本地标签到最新
git fetch --prune --tags

删除远程标签

bash
# 删除远程标签
git push origin --delete v1.0.0
git push origin :refs/tags/v1.0.0

# 删除多个远程标签
git push origin --delete v1.0.0 v1.0.1 v1.0.2

# 删除本地和远程标签
git tag -d v1.0.0
git push origin :refs/tags/v1.0.0

标签使用场景

版本发布

bash
# 发布稳定版本
git checkout main
git pull origin main
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0

# 发布预发布版本
git tag -a v1.0.0-beta -m "Beta release"
git push origin v1.0.0-beta

# 发布补丁版本
git checkout v1.0.0
git checkout -b hotfix/v1.0.1
# 修复bug
git commit -m "Fix critical bug"
git tag -a v1.0.1 -m "Patch release: fix critical bug"
git push origin v1.0.1

里程碑标记

bash
# 标记重要里程碑
git tag -a milestone-project-completion -m "Complete initial project"
git tag -a milestone-security-audit -m "Complete security audit"

# 标记性能测试点
git tag -a perf-test-baseline -m "Performance baseline measurement"

高级标签操作

从标签创建分支

bash
# 从标签创建新分支
git checkout -b release-branch v1.0.0

# 基于标签创建分支
git switch -c feature-branch v1.0.0

比较标签

bash
# 比较两个标签
git diff v1.0.0 v1.0.1

# 比较标签和分支
git diff v1.0.0 main

# 查看两个标签间的提交
git log v1.0.0..v1.0.1

# 统计两个标签间的差异
git diff --stat v1.0.0..v1.0.1

查找标签

bash
# 查找包含特定提交的标签
git describe --contains commit-hash

# 查找最近的标签
git describe --tags

# 查找最近的带注释标签
git describe --abbrev=0

# 查找标签的创建日期
git log -1 --format="%ai" v1.0.0

标签命名规范

语义化版本

bash
# 推荐的版本标签命名
v1.0.0          # 主版本号.次版本号.修订号
v1.0.0-alpha    # 预发布版本
v1.0.0-beta     # 测试版本
v1.0.0-rc.1     # 发布候选版本
v1.0.0-hotfix   # 热修复版本

项目特定命名

bash
# 日期为基础的标签
2023.01.01
release-2023-01-01

# 功能为基础的标签
feature-complete
security-update-2023

标签管理最佳实践

自动化标签

bash
# 使用脚本自动创建版本标签
#!/bin/bash
# version-bump.sh
current_version=$(git describe --tags --abbrev=0)
echo "Current version: $current_version"

# 解析版本号
IFS='.' read -ra version_parts <<< "${current_version#v}"

# 增加修订号
new_revision=$((version_parts[2] + 1))
new_version="v${version_parts[0]}.${version_parts[1]}.$new_revision"

echo "Creating new version: $new_version"
git tag -a "$new_version" -m "Release version $new_version"
git push origin "$new_version"

标签验证

bash
# 验证所有标签的签名
for tag in $(git tag -l); do
  if git cat-file tag $tag | grep -q "object"; then
    echo "Verifying signed tag: $tag"
    git tag -v $tag
  fi
done

标签清理

bash
# 删除未引用的标签
git tag -l | grep -v "v[0-9]" | xargs git tag -d  # 删除非版本标签

# 查找并删除错误标签
git tag -l | grep -E "v[0-9]+\.[0-9]+\.[0-9]+-.*" | head -n 5 | xargs git tag -d

标签与CI/CD集成

在CI中使用标签

bash
# .github/workflows/release.yml
name: Release
on:
  push:
    tags:
      - 'v*'  # 触发标签推送事件

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
        with:
          ref: ${{ github.ref }}
      
      - name: Get version
        run: echo "VERSION=${GITHUB_REF#refs/tags/}"

自动化发布

bash
# 发布脚本
#!/bin/bash
# release.sh

# 检查是否有未提交的更改
if [[ -n $(git status --porcelain) ]]; then
  echo "Error: Working directory is not clean"
  exit 1
fi

# 获取新版本号
read -p "Enter new version (e.g., 1.0.0): " version

# 创建标签
git tag -a "v$version" -m "Release version $version"

# 推送到远程
git push origin main
git push origin "v$version"

echo "Released version v$version"

标签安全性

签名验证

bash
# 验证标签签名
git tag -v v1.0.0

# 验证所有标签
git tag -l | xargs -n 1 git tag -v

# 自动验证推送的标签
# 在pre-receive钩子中验证标签签名

访问控制

bash
# 在Git服务器上配置标签推送权限
# 可以限制谁可以推送标签
# 通常只有维护者或CI系统可以推送标签

通过合理使用标签,你可以更好地管理项目版本,标记重要的发布节点,并建立清晰的发布历史记录。