[原文链接:
Link
]
转载请注明原作者
🧩 Git tag:区分 git commit 版本,与真实软件版本
在 git 系统中,每一个 commit 就是一次新的版本,版本都用 hash 来代表。
但真实开发环境下,每个软件从 v1.0.1 到 v 1.0.2 可能需要
经历多次
commit 才会开发出来。
这就是软件版本与 commit 版本的区别。
而 tag,就是被用于给 commit
标上当前软件版本号
的指令。
如:
-
在软件 v1.0.1 完成之时,给它发布前的最后一个 commit 标上
v1.0.1
tag (标签)。
此外,
养成标
tag
的习惯可以让你更方便地进行版本回滚!
(而不是每次都要用 git reflog 去翻找 hash)
🔖 tag 底层原理
本质:
tag 与 blob, tree, commit 类似,也是一个
对象
,但仅封装了 commit 的 hash,外加一个名字。仅此而已。
结构:
tag 的数据库可以理解为一个
string-hash
的 k-v 键值对key 存
tag 名
, value 存
hash
位置:
tag 的信息被存储在
/.git/refs/tags
🔖 tag 的 CURD 操作
✨ 创建 tag
-
创建最简单的(
轻量级
)标签:-
$ git tag <tagName>
在本 commit 直接创建 -
$ git tag <tagName> <commitHash>
定点创建 tag
-
-
创建
带有附注
(annotation)的标签 (
比如添加一句版本小总结
):-
$ git tag --annotate <tagName> --message="ANNOTATION TEXT"
-
$ git tag -a <tagName> -m "ANNOTATION TEXT"
(
上述的简写版
)
-
-
(
特殊
)创建带有附注,且具有
个人 GPG 签名
的标签(
类似 SSH 公钥,在 tag 上标注你的个人认证信息
)-
$ git tag --sign <tagName> --message="ANNOTATION TEXT"
-
$ git tag -s <tagName> -m "ANNOTATION TEXT"
(
上述的简写版
)
-
-
(
特殊
)验证标签 GPG 公钥:-
git tag --verify <tagName>
-
git tag -v <tagName>
(
上述的简写版
)
-
✨ 查看 tag
-
筛选 tag:
-
$ git tag --list
列出所有 tags -
$ git tag --list "v1.*"
筛选符合
v1.*
的全部 tags
-
-
分析某 tag 所在的 commit 内容
-
$ git cat-file -p <tagName>
查看对象内容 -
$ git cat-file -t <tagName>
查看对象类型 (返回为 commit 对象) -
$ git show <tagName>
查看对象内容 +
$ git diff
-
✨ 转到 tag
-
又是我们的老朋友
checkout
(
它承担了太多
)
✨ 删除 tag
-
$ git tag --delete <tagName>
-
$ git tag -d <tagName>
(
上述的简写版
)
✨ 上传 tag 到 remote (远程仓库) !
-
虽然还没讲到
$ git push
,但还是要说一下:-
$ git push
!!!默认不上传本地
tags
!!!
-
-
需要使用如下方式共享 tags 到远程仓库:
-
$ git push origin --tags
上传
全部
新增 tags -
$ git push origin <tagName>
上传
指定
tag
-
🔖 在 Github 查看你的 tags
十分漂亮。
☠️ 老朋友 checkout 的老问题: 游离态 HEAD
由于 🔖
tag
是直接打在
commit
上的,
但
checkout
功能既可以给
HEAD
切换
branch
,又可以给
HEAD
切换到 🔖
tag
上。
我想你现在已经明白结果会怎样了(如果你看过上一篇内容)。
解决方式和上一篇中的相同。
😄
望这篇笔记能对你也有所帮助,若是喜欢,也不妨点一下收藏,万分感谢。
如有错误,也尽请指出。