@[TOC]
像其他版本控制系統(tǒng)(VCS
)一樣,Git
可以給倉庫歷史中的某一個(gè)提交打上標(biāo)簽块攒,以示重要励稳。 比較有代表性的是人們會(huì)使用這個(gè)功能來標(biāo)記發(fā)布結(jié)點(diǎn)( v1.0
、 v2.0
等等)囱井。 在本節(jié)中驹尼,你將會(huì)學(xué)習(xí)如何列出已有的標(biāo)簽、如何創(chuàng)建和刪除新的標(biāo)簽庞呕、以及不同類型的標(biāo)簽分別是什么新翎。
1、列出標(biāo)簽
在 Git
中列出已有的標(biāo)簽非常簡(jiǎn)單住练,只需要輸入 git tag
(可帶上可選的 -l
選項(xiàng) --list
):
我這個(gè)倉庫還沒有推送過標(biāo)簽地啰,所以顯示為空。
這個(gè)命令以字母順序列出標(biāo)簽讲逛,但是它們顯示的順序并不重要亏吝。
看一下git
源碼庫的標(biāo)簽:
你也可以按照特定的模式查找標(biāo)簽。 例如盏混,
Git
自身的源代碼倉庫包含標(biāo)簽的數(shù)量超過 500 個(gè)蔚鸥。 如果只對(duì) 1.8.5
系列感興趣,可以運(yùn)行:
按照通配符列出標(biāo)簽需要
-l
或 --list
選項(xiàng):
如果你只想要完整的標(biāo)簽列表括饶,那么運(yùn)行
git tag
就會(huì)默認(rèn)假定你想要一個(gè)列表株茶,它會(huì)直接給你列出來, 此時(shí)的-l
或--list
是可選的图焰。然而启盛,如果你提供了一個(gè)匹配標(biāo)簽名的通配模式,那么
-l
或--list
就是強(qiáng)制使用的。
2僵闯、創(chuàng)建標(biāo)簽
Git 支持兩種標(biāo)簽:輕量標(biāo)簽(lightweight
)與附注標(biāo)簽(annotated
)卧抗。
輕量標(biāo)簽很像一個(gè)不會(huì)改變的分支——它只是某個(gè)特定提交的引用。
而附注標(biāo)簽是存儲(chǔ)在 Git
數(shù)據(jù)庫中的一個(gè)完整對(duì)象鳖粟, 它們是可以被校驗(yàn)的社裆,其中包含打標(biāo)簽者的名字、電子郵件地址向图、日期時(shí)間泳秀, 此外還有一個(gè)標(biāo)簽信息,并且可以使用 GNU Privacy Guard (GPG)
簽名并驗(yàn)證榄攀。 通常會(huì)建議創(chuàng)建附注標(biāo)簽嗜傅,這樣你可以擁有以上所有信息。但是如果你只是想用一個(gè)臨時(shí)的標(biāo)簽檩赢, 或者因?yàn)槟承┰虿幌胍4孢@些信息吕嘀,那么也可以用輕量標(biāo)簽。
2.1贞瞒、附注標(biāo)簽
在 Git
中創(chuàng)建附注標(biāo)簽十分簡(jiǎn)單偶房。 最簡(jiǎn)單的方式是當(dāng)你在運(yùn)行 tag
命令時(shí)指定 -a
選項(xiàng):
-m
選項(xiàng)指定了一條將會(huì)存儲(chǔ)在標(biāo)簽中的信息。 如果沒有為附注標(biāo)簽指定一條信息军浆,Git
會(huì)啟動(dòng)編輯器要求你輸入信息棕洋。
通過使用 git show
命令可以看到標(biāo)簽信息和與之對(duì)應(yīng)的提交信息:
輸出顯示了打標(biāo)簽者的信息、打標(biāo)簽的日期時(shí)間瘾敢、附注信息拍冠,然后顯示具體的提交信息。
2.2簇抵、輕量標(biāo)簽
另一種給提交打標(biāo)簽的方式是使用輕量標(biāo)簽庆杜。 輕量標(biāo)簽本質(zhì)上是將提交校驗(yàn)和存儲(chǔ)到一個(gè)文件中——沒有保存任何其他信息。 創(chuàng)建輕量標(biāo)簽碟摆,不需要使用 -a
晃财、-s
或 -m
選項(xiàng),只需要提供標(biāo)簽名字:
這時(shí)典蜕,如果在標(biāo)簽上運(yùn)行
git show
断盛,你不會(huì)看到額外的標(biāo)簽信息。 命令只會(huì)顯示出提交信息:
3愉舔、后期打標(biāo)簽
你也可以對(duì)過去的提交打標(biāo)簽钢猛。 假設(shè)提交歷史是這樣的:
現(xiàn)在,假設(shè)在
v1.0
時(shí)你忘記給項(xiàng)目打標(biāo)簽轩缤,也就是在 “Initial commit
” 提交命迈。 你可以在之后補(bǔ)上標(biāo)簽贩绕。 要在那個(gè)提交上打標(biāo)簽,你需要在命令的末尾指定提交的校驗(yàn)和(或部分校驗(yàn)和):可以看到你已經(jīng)在那次提交上打上標(biāo)簽了:
4壶愤、共享標(biāo)簽
默認(rèn)情況下淑倾,git push
命令并不會(huì)傳送標(biāo)簽到遠(yuǎn)程倉庫服務(wù)器上。 在創(chuàng)建完標(biāo)簽后你必須顯式地推送標(biāo)簽到共享服務(wù)器上征椒。 這個(gè)過程就像共享遠(yuǎn)程分支一樣——你可以運(yùn)行 git push origin <tagname>
娇哆。
如果想要一次性推送很多標(biāo)簽,也可以使用帶有
--tags
選項(xiàng)的 git push
命令勃救。 這將會(huì)把所有不在遠(yuǎn)程倉庫服務(wù)器上的標(biāo)簽全部傳送到那里碍讨。現(xiàn)在,當(dāng)其他人從倉庫中克隆或拉取蒙秒,他們也能得到你的那些標(biāo)簽垄开。
git push
推送兩種標(biāo)簽:
使用git push <remote> --tags
推送標(biāo)簽并不會(huì)區(qū)分輕量標(biāo)簽和附注標(biāo)簽,沒有簡(jiǎn)單的選項(xiàng)能夠讓你只選擇推送一種標(biāo)簽税肪。
5、刪除標(biāo)簽
要?jiǎng)h除掉你本地倉庫上的標(biāo)簽榜田,可以使用命令 git tag -d <tagname>
益兄。 例如,可以使用以下命令刪除一個(gè)輕量標(biāo)簽:
注意上述命令并不會(huì)從任何遠(yuǎn)程倉庫中移除這個(gè)標(biāo)簽箭券,你必須用
git push <remote> :refs/tags/<tagname>
來更新你的遠(yuǎn)程倉庫:
第一種變體是 git push <remote> :refs/tags/<tagname>
:
上面這種操作的含義是净捅,將冒號(hào)前面的空值推送到遠(yuǎn)程標(biāo)簽名,從而高效地刪除它辩块。
第二種更直觀的刪除遠(yuǎn)程標(biāo)簽的方式是:
git push origin --delete <tagname>
6蛔六、檢出標(biāo)簽
如果你想查看某個(gè)標(biāo)簽所指向的文件版本,可以使用 git checkout
命令废亭, 雖然這會(huì)使你的倉庫處于“分離頭指針(detached HEAD
)”的狀態(tài)——這個(gè)狀態(tài)有些不好的副作用:
在“分離頭指針”狀態(tài)下国章,如果你做了某些更改然后提交它們,標(biāo)簽不會(huì)發(fā)生變化豆村, 但你的新提交將不屬于任何分支液兽,并且將無法訪問,除非通過確切的提交哈希才能訪問掌动。 因此四啰,如果你需要進(jìn)行更改,比如你要修復(fù)舊版本中的錯(cuò)誤粗恢,那么通常需要?jiǎng)?chuàng)建一個(gè)新分支:
如果在這之后又進(jìn)行了一次提交柑晒,v4.0.0
分支就會(huì)因?yàn)檫@個(gè)改動(dòng)向前移動(dòng), 此時(shí)它就會(huì)和 v1.4
標(biāo)簽稍微有些不同眷射,這時(shí)就要當(dāng)心了匙赞。