簡(jiǎn)介
本文辨析在參與開(kāi)源項(xiàng)目時(shí)會(huì)遇到的tag與release的概念區(qū)別與聯(lián)系,并比較兩者的創(chuàng)建方法。
定義
標(biāo)簽(tag)是特定提交(commit)一個(gè)指針,也就是每個(gè)tag對(duì)應(yīng)一個(gè)特定的commit。
Release是具有changelogs和二進(jìn)制文件的一級(jí)對(duì)象,它可以代表超出Git架構(gòu)本身的一個(gè)特定時(shí)間點(diǎn)之前的所有項(xiàng)目歷史。也就是通過(guò)release,不但能夠通過(guò)源碼體現(xiàn)出項(xiàng)目歷史,還能通過(guò)已經(jīng)編譯好的二進(jìn)制文件來(lái)進(jìn)一步描述此時(shí)的項(xiàng)目狀態(tài)。“超出Git架構(gòu)本身“的意思則在于,git本身只能記錄項(xiàng)目修改,本質(zhì)上不適合將編譯好的項(xiàng)目二進(jìn)制文件記錄下來(lái)。而通過(guò)release則把項(xiàng)目二進(jìn)制文件保存了下來(lái),方便用戶(hù)下載,也方便查找特定版本的二進(jìn)制文件。
以下是Github official announcement所定義原文:
Releases are first-class objects with changelogs and binary assets that present a full project history beyond Git artifacts.
創(chuàng)建方法
Release分為兩種:lightweight and annotated.
創(chuàng)建lightweight類(lèi)型的tag:
$ git tag v1.4-lw
創(chuàng)建annotated類(lèi)型的tag:
$ git tag -a v1.4 -m "my version 1.4"
通過(guò)tag可以返回到項(xiàng)目的特定狀態(tài)下,所以可以將tag看作是在大量commit中設(shè)定的書(shū)簽。
創(chuàng)建release,則需要通過(guò)源碼托管商的網(wǎng)頁(yè)操作界面來(lái)進(jìn)行,一般會(huì)要求填寫(xiě)tag名、分支以及相應(yīng)的發(fā)布說(shuō)明,還可上傳編譯好的程序、打包好的文件等。
比較
標(biāo)簽是git中的概念,而release則是Github、碼云等源碼托管商所提供的更高層的概念。也就是說(shuō)git本身是沒(méi)有release這個(gè)概念的,只有tag。
兩者之間的關(guān)系則是,release基于tag,為tag添加更豐富的信息,一般是編譯好的文件。
總結(jié)
Release是源碼托管商對(duì)git的tag功能的增強(qiáng)。通過(guò)git提供的tag功能,我們可以給項(xiàng)目進(jìn)行版本標(biāo)識(shí),以識(shí)別特定的版本,如v0.1.0
、v1.0.0
等。而通過(guò)源碼托管商提供的release功能,在tag的基礎(chǔ)上我們可以添加編譯好的二進(jìn)制文件等,如.deb
、.exe
等給特定的版本提供更多的信息,方便用戶(hù),也方便后期查找特定版本的程序。