定义

tag(标签)是特定提交(commit)一个指针,也就是每个 tag 对应一个特定的 commit。

release(发行)是具有 changelogs 和二进制文件的一级对象,它可以代表超出 Git 架构本身的一个特定时间点之前的所有项目历史。也就是通过 release,不但能够通过源码体现出项目历史,还能通过已经编译好的二进制文件来进一步描述此时的项目状态。“超出 Git 架构本身“的意思则在于,git 本身只能记录项目修改,本质上不适合将编译好的项目二进制文件记录下来。而通过 release 则把项目二进制文件保存了下来,方便用户下载,也方便查找特定版本的二进制文件。

以下是Github official announcement所定义原文:

eleases are first-class objects with changelogs and binary assets that present a full project history beyond Git artifacts.

创建方法

Release 分为两种:lightweight and annotated.

创建 lightweight 类型的 tag:

git tag v1.4-lw

创建 annotated 类型的 tag:

git tag -a v1.4 -m "my version 1.4"

通过 tag 可以返回到项目的特定状态下,所以可以将 tag 看作是在大量 commit 中设定的书签。

创建 release,则需要通过源码托管商的网页操作界面来进行,一般会要求填写 tag 名、分支以及相应的发布说明,还可上传编译好的程序、打包好的文件等。

区别

标签是 git 中的概念,而 release 则是 Github、码云等源码托管商所提供的更高层的概念。也就是说 git 本身是没有 release 这个概念的,只有 tag。

两者之间的关系则是,release 基于 tag,为 tag 添加更丰富的信息,一般是编译好的文件。

总结

Release 是源码托管商对 git 的 tag 功能的增强。通过 git 提供的 tag 功能,我们可以给项目进行版本标识,以识别特定的版本,如v0.1.0v1.0.0等。而通过源码托管商提供的 release 功能,在 tag 的基础上我们可以添加编译好的二进制文件等,如.deb.exe等给特定的版本提供更多的信息,方便用户,也方便后期查找特定版本的程序。