[TOC] #### 1. 標(biāo)簽介紹 --- **應(yīng)用場(chǎng)景** 當(dāng)我們發(fā)布版本時(shí),通常會(huì)先在版本庫(kù)打一個(gè)標(biāo)簽,這個(gè)標(biāo)簽就是我們平時(shí)所說(shuō)代碼倉(cāng)庫(kù)的版本號(hào) 標(biāo)簽是版本庫(kù)的一個(gè)快照,但它其實(shí)就是指向某個(gè) commit 的指針。所以,創(chuàng)建和刪除標(biāo)簽都是瞬間完成的 **git 有 commit ,為什么還要引入 tag ?** “請(qǐng)把上周一的那個(gè)版本打包發(fā)布,commit號(hào)是 6a5819e...” “一串亂七八糟的數(shù)字不好找!” 如果換一個(gè)辦法: “請(qǐng)把上周一的那個(gè)版本打包發(fā)布,版本號(hào)是v1.2” “好的,按照tag v1.2查找commit就行!” 所以,tag 就是一個(gè)讓人容易記住的有意義的名字,它跟某個(gè) commit 綁在一起。 #### 2. 查看標(biāo)簽 --- ``` # 查看本地庫(kù)標(biāo)簽 git tag # 一行顯示多個(gè)標(biāo)簽 git tag --column ``` #### 3. 創(chuàng)建標(biāo)簽 --- 創(chuàng)建標(biāo)簽 ``` # 基于當(dāng)前 commit id 創(chuàng)建標(biāo)簽 git tag <tagname> # 基于指定 commit id 創(chuàng)建標(biāo)簽 git tag <tagname> <commit id> ``` 創(chuàng)建標(biāo)簽并且添加標(biāo)簽描述(如果不帶 -m 參數(shù)會(huì)進(jìn)入 vi 編輯模式輸入標(biāo)簽描述) ``` # `-a, --annotate` 標(biāo)簽名 `-m, --message` 標(biāo)簽描述 git tag -a <tagname> -m <message> # 經(jīng)測(cè)試,-a 不寫(xiě)也是可以的 git tag <tagname> -m <message> ``` 使用示例 ``` # 添加標(biāo)簽 git tag v1.0.0 # 創(chuàng)建標(biāo)簽并設(shè)置標(biāo)簽描述 git tag v1.0.0 -m '正式上線' git tag -a v1.0.0 -m '正式上線' ``` 當(dāng)在代碼托管平臺(tái)中新增了標(biāo)簽,如果想要將遠(yuǎn)程倉(cāng)庫(kù)中新增的標(biāo)簽更新到本地,只需執(zhí)行 ``` git pull ``` #### 4. 刪除標(biāo)簽 --- 有時(shí)會(huì)因?yàn)槭炙龠^(guò)快導(dǎo)致標(biāo)簽名稱打錯(cuò)了,此時(shí)可以刪除該標(biāo)簽,重新創(chuàng)建 因?yàn)閯?chuàng)建的標(biāo)簽都只存儲(chǔ)在本地,不會(huì)自動(dòng)推送到遠(yuǎn)程庫(kù)。所以,打錯(cuò)的標(biāo)簽可以在本地安全刪除 ``` # 刪除本地標(biāo)簽 git tag -d <tagname> # 刪除遠(yuǎn)程倉(cāng)庫(kù)中的標(biāo)簽的幾種方式 git push origin -d <tagname> git push origin :<tagname> git push origin :refs/tags/<tagname> # 使用示例 git tag -d v1.0.0 git push origin -d v1.0.0 git push origin :v1.0.0 git push origin :refs/tags/v1.0.0 ``` 要看看是否真的從遠(yuǎn)程庫(kù)刪除了標(biāo)簽,可以登錄遠(yuǎn)程倉(cāng)庫(kù)查看,比如: Gitee、GitHub。也可以通過(guò)下面命令查看: ``` # 查看遠(yuǎn)程庫(kù)標(biāo)簽 git ls-remote --tags ``` #### 5. 修改標(biāo)簽 --- git 并沒(méi)有直接修改標(biāo)簽名的命令,但是可以根據(jù)標(biāo)簽名創(chuàng)建新的標(biāo)簽,然后將舊的標(biāo)簽刪除 ``` # 根據(jù)指定標(biāo)簽創(chuàng)建新標(biāo)簽 git tag <new_tagname> <old_tagname> # 刪除本地倉(cāng)庫(kù)中的舊標(biāo)簽 git tag -d <old_tagname> # 將新標(biāo)簽推送到遠(yuǎn)程庫(kù)、將舊標(biāo)簽從遠(yuǎn)程庫(kù)中刪除 git push <remote> <new_tagname> :<old_tagname> ``` 下面兩種寫(xiě)法等同,建議使用第一種寫(xiě)法: ``` # 寫(xiě)法一: # 將新標(biāo)簽推送到遠(yuǎn)程庫(kù)、將舊標(biāo)簽從遠(yuǎn)程庫(kù)中刪除 git push <remote> <new_tagname> :<old_tagname> # 寫(xiě)法二: # 將新標(biāo)簽推送遠(yuǎn)程庫(kù) git push <remote> <new_tagname> # 刪除遠(yuǎn)程倉(cāng)庫(kù)中的舊標(biāo)簽 git push <remote> :<old_tagname> ``` #### 6. 推送標(biāo)簽 --- 將本地標(biāo)簽推送到遠(yuǎn)程倉(cāng)庫(kù) ``` # 將指定標(biāo)簽推送到遠(yuǎn)程倉(cāng)庫(kù) git push <remote> <tagname> # 將所有本地標(biāo)簽一次性推送到遠(yuǎn)程倉(cāng)庫(kù) git push <remote> --tags # 使用示例 git push origin v1.0.0 git push origin --tags ``` #### 7. 檢出標(biāo)簽 --- 可以通過(guò)標(biāo)簽名稱,檢出相應(yīng)版本的代碼 ``` git checkout <tagname> ``` 實(shí)際開(kāi)發(fā)中,如果需要基于指定標(biāo)簽進(jìn)行開(kāi)發(fā),可以先檢出標(biāo)簽,然后創(chuàng)建新的分支,在這個(gè)新分支上進(jìn)行開(kāi)發(fā) ``` # 切換到標(biāo)簽對(duì)應(yīng)的提交記錄 git checkout <tagname> # 創(chuàng)建并切換到新分支 git checkout -b <branch> ``` 基于指定標(biāo)簽創(chuàng)建分支也有更簡(jiǎn)潔的寫(xiě)法 ``` git checkout -b <branch> <tagname> ``` #### 8. git show 查看標(biāo)簽 --- 查看標(biāo)簽以及指向的對(duì)象。其實(shí)就是查看標(biāo)簽的備注和對(duì)應(yīng)的提交記錄 ``` git show v1.0.0 ``` 查看標(biāo)簽指向的樹(shù)。其實(shí)就是查看標(biāo)簽下的文件 ``` git show v1.0.0^{tree} ``` 查看標(biāo)簽對(duì)應(yīng)提交記錄的備注信息 ``` git show -s --format=%s v1.0.0^{commit} ```