像其餘版本控制系統(VCS)同樣,Git 能夠給歷史中的某一個提交打上標籤,以示重要。 比較有表明性的是人們會使用這個功能來標記發佈結點(v1.0 等等)。 在本節中,你將會學習如何列出已有的標籤、如何建立新標籤、以及不一樣類型的標籤分別是什麼。git
在 Git 中列出已有的標籤是很是簡單直觀的。 只須要輸入 git tag
:github
git tag $v0.1v1.3
這個命令以字母順序列出標籤;可是它們出現的順序並不重要。數據庫
你也可使用特定的模式查找標籤。 例如,Git 自身的源代碼倉庫包含標籤的數量超過 500 個。 若是隻對 1.8.5 系列感興趣,能夠運行:服務器
git tag -l $'v1.8.5*'v1.8.5v1.8.5-rc0v1.8.5-rc1v1.8.5-rc2v1.8.5-rc3v1.8.5.1v1.8.5.2v1.8.5.3v1.8.5.4v1.8.5.5
Git 使用兩種主要類型的標籤:輕量標籤(lightweight)與附註標籤(annotated)。編輯器
一個輕量標籤很像一個不會改變的分支 - 它只是一個特定提交的引用。學習
然而,附註標籤是存儲在 Git 數據庫中的一個完整對象。 它們是能夠被校驗的;其中包含打標籤者的名字、電子郵件地址、日期時間;還有一個標籤信息;而且可使用 GNU Privacy Guard (GPG)簽名與驗證。 一般建議建立附註標籤,這樣你能夠擁有以上全部信息;可是若是你只是想用一個臨時的標籤,或者由於某些緣由不想要保存那些信息,輕量標籤也是可用的。spa
在 Git 中建立一個附註標籤是很簡單的。 最簡單的方式是當你在運行 tag
命令時指定 -a
選項:3d
git tag -a v1.4 -m git tag $'my version 1.4'$v0.1v1.3v1.4
-m
選項指定了一條將會存儲在標籤中的信息。 若是沒有爲附註標籤指定一條信息,Git 會運行編輯器要求你輸入信息。版本控制
經過使用 git show
命令能夠看到標籤信息與對應的提交信息:code
git show v1.4 $tag v1.4Tagger: Ben Straub <ben@straub.cc>Date: Sat May 3 20:19:12 2014 -0700my version 1.4commit ca82a6dff817ec66f44342007202690a93763949Author: Scott Chacon <schacon@gee-mail.com>Date: Mon Mar 17 21:52:11 2008 -0700changed the version number
輸出顯示了打標籤者的信息、打標籤的日期時間、附註信息,而後顯示具體的提交信息。
另外一種給提交打標籤的方式是使用輕量標籤。 輕量標籤本質上是將提交校驗和存儲到一個文件中 - 沒有保存任何其餘信息。 建立輕量標籤,不須要使用 -a
、-s
或 -m
選項,只須要提供標籤名字:
git tag v1.4-lw git tag $$v0.1v1.3v1.4v1.4-lwv1.5
這時,若是在標籤上運行 git show
,你不會看到額外的標籤信息。 命令只會顯示出提交信息:
git show v1.4-lw $commit ca82a6dff817ec66f44342007202690a93763949Author: Scott Chacon <schacon@gee-mail.com>Date: Mon Mar 17 21:52:11 2008 -0700changed the version number
你也能夠對過去的提交打標籤。 假設提交歷史是這樣的:
git log --prettyoneline $=15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support0d52aaab4479697da7686c15f77a3d64d9165190 one more thing6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function4682c3261057305bdd616e23b64b0857d832627b added a todo file166ae0c4d3f420721acbb115cc33848dfcc2121a started write support9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
如今,假設在 v1.2 時你忘記給項目打標籤,也就是在 「updated rakefile」 提交。 你能夠在以後補上標籤。 要在那個提交上打標籤,你須要在命令的末尾指定提交的校驗和(或部分校驗和):
git tag -a v1.2 9fceb02 -m 'comments'$
能夠看到你已經在那次提交上打上標籤了:
git tag git show v1.2 $v0.1v1.2v1.3v1.4v1.4-lwv1.5$tag v1.2Tagger: Scott Chacon <schacon@gee-mail.com>Date: Mon Feb 9 15:32:16 2009 -0800version 1.2commit 9fceb02d0ae598e95dc970b74767f19372d61af8Author: Magnus Chacon <mchacon@gee-mail.com>Date: Sun Apr 27 20:43:35 2008 -0700updated rakefile...
默認狀況下,git push
命令並不會傳送標籤到遠程倉庫服務器上。 在建立完標籤後你必須顯式地推送標籤到共享服務器上。 這個過程就像共享遠程分支同樣 - 你能夠運行 git push origin [tagname]
。
git push origin v1.5 $Counting objects: 14, done.Delta compression using up to 8 threads.Compressing objects: 100% (12/12), done.Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.Total 14 (delta 3), reused 0 (delta 0)To git@github.com:schacon/simplegit.git* [new tag] v1.5 -> v1.5
若是想要一次性推送不少標籤,也可使用帶有 --tags
選項的 git push
命令。 這將會把全部不在遠程倉庫服務器上的標籤所有傳送到那裏。
git push origin --tags $Counting objects: 1, done.Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.Total 1 (delta 0), reused 0 (delta 0)To git@github.com:schacon/simplegit.git* [new tag] v1.4 -> v1.4* [new tag] v1.4-lw -> v1.4-lw
如今,當其餘人從倉庫中克隆或拉取,他們也能獲得你的那些標籤。
在 Git 中你並不能真的檢出一個標籤,由於它們並不能像分支同樣來回移動。 若是你想要工做目錄與倉庫中特定的標籤版本徹底同樣,可使用 git checkout -b [branchname] [tagname]
在特定的標籤上建立一個新分支:
git checkout -b version2 v2.0.0 $Switched to a new branch 'version2'
固然,若是在這以後又進行了一次提交,version2
分支會由於改動向前移動了,那麼 version2
分支就會和 v2.0.0
標籤稍微有些不一樣,這時就應該小心了。