Git Tag 理解和使用
1. Tag 的基本概念
什么是 Git Tag?
Git 中的"书签",指向特定的提交
用于标记重要的时间点(版本发布、里程碑)
类似于分支,但不会移动
为什么需要 Tag?
# 没有 Tag 的情况
git checkout 1a2b3c4d # 哪个版本?记不住!# 有 Tag 的情况
git checkout v1.0.0 # 清晰明了!Tag 的应用场景
🚀 版本发布标记
🔖 代码稳定节点
📌 生产环境部署
🎯 热修复基准点
2. Tag 的类型与区别
轻量标签 vs 附注标签
| 特性 | 轻量标签 | 附注标签 |
|---|---|---|
| 存储内容 | 提交的指针 | 完整的 Git 对象 |
| 元数据 | 无 | 包含打标签者、时间、描述 |
| 签名支持 | 不支持 | 支持 GPG 签名 |
| 推荐程度 | ⭐⭐ | ⭐⭐⭐⭐⭐ |
创建示例
# 轻量标签
git tag v1.0.0# 附注标签(推荐)
git tag -a v1.0.0 -m "Release version 1.0.0"3. 创建和管理 Tag
3.1 创建 Tag
命令行方式
# 在当前提交打标签
git tag -a v1.0.0 -m "版本描述"# 为特定提交打标签
git tag -a v1.0.0 a1b2c3d -m "版本描述"# 签名标签(安全要求高的项目)
git tag -s v1.0.0 -m "签名版本"Android Studio 方式
Git → Tag...
Git Log → 右键提交 → New Tag
右下角分支名 → Tags → New Tag
3.2 查看 Tag
# 列出所有标签
git tag# 查看带描述的标签
git tag -n# 按版本号排序
git tag -l --sort=-version:refname "v*"# 查看标签详情
git show v1.0.03.3 推送 Tag
# 推送单个标签
git push origin v1.0.0# 推送所有标签
git push origin --tags# 安全推送(只推送附注标签)
git push --follow-tags3.4 删除 Tag
# 删除本地标签
git tag -d v1.0.0# 删除远程标签
git push origin --delete v1.0.04. Tag 在团队协作中的使用
4.1 版本发布流程
# 1. 准备发布
git checkout main
git pull origin main# 2. 测试验证
./gradlew test
./gradlew assembleRelease# 3. 创建标签
git tag -a v1.2.0 -m "Release v1.2.0
- 新增支付功能
- 修复登录问题
- 性能优化"# 4. 推送标签
git push origin v1.2.0# 5. 基于标签创建发布分支(可选)
git checkout -b release/v1.2.0 v1.2.04.2 热修复流程
# 1. 基于生产标签创建修复分支
git checkout -b hotfix/v1.2.1 v1.2.0# 2. 进行修复
# ... 修复代码 ...# 3. 提交修复
git add .
git commit -m "修复支付页面崩溃"# 4. 创建修复版本标签
git tag -a v1.2.1 -m "热修复 v1.2.1 - 修复支付崩溃"# 5. 推送
git push origin hotfix/v1.2.1
git push origin v1.2.14.3 代码审查与比较
# 比较两个版本
git diff v1.1.0 v1.2.0# 查看版本变更统计
git log v1.1.0..v1.2.0 --oneline --stat# 在 Android Studio 中:
# Git → Log → 选择两个Tag → Compare Versions5. Android 项目最佳实践
5.1 版本命名规范
# 语义化版本 (SemVer)
v主版本.次版本.修订号# 示例
v1.0.0 # 正式发布
v1.1.0 # 新功能
v1.1.1 # Bug修复
v2.0.0 # 不兼容的API修改# 预发布版本
v1.2.0-rc1 # 发布候选
v1.2.0-beta # 测试版
v1.2.0-alpha # 内测版5.2 与 build.gradle 同步
android {defaultConfig {// 数字版本号,每次递增versionCode 100// 字符串版本号,与 Git Tag 保持一致versionName "1.0.0"}
}6. 常见见问题与解决方案
❌ 问题1:切换到 Tag 后无法提交代码
原因:处于"分离头指针"状态
解决方案:
# 基于 Tag 创建分支
git checkout -b feature/from-v1.0.0 v1.0.0
❌ 问题2:远程标签在本地看不到
解决方案:
# 获取所有远程标签
git fetch --tags# 强制更新
git fetch --tags -f
❌ 问题3:误打了错误的标签
解决方案:
# 删除错误标签
git tag -d wrong-tag
git push origin --delete wrong-tag# 重新打标签
git tag -a correct-tag -m "正确的标签"
git push origin correct-tag
❌ 问题4:标签描述信息不全
解决方案:
# 删除后重新创建
git tag -d v1.0.0
git tag -a v1.0.0 -m "详细的版本描述信息" commit-hash
总结与要点
核心要点
- 总是使用附注标签 (
-a和-m) - 遵循语义化版本规范
- 及时推送标签到远程
- 基于标签创建分支进行修改
- 保持 Tag 与 build.gradle 版本同步
推荐工作流
# 1. 开发完成 → 测试通过
# 2. 更新 build.gradle 版本号
# 3. 提交版本更新
# 4. 创建附注标签
# 5. 推送到远程
# 6. 基于标签构建发布包
