六、Git命令篇:打標籤tag的運用
打標籤
同大多數 VCS 一樣,Git 也可以對某一時間點上的版本打上標籤。人們在釋出某個軟體版本(比如 v1.0 等等)的時候,經常這麼做。本節我們一起來學習如何列出所有可用的標籤,如何新建標籤,以及各種不同型別標籤之間的差別。
列顯已有的標籤
列出現有標籤的命令非常簡單,直接執行 git tag 即可:
$ git tag v0.1 v1.3
顯示的標籤按字母順序排列,所以標籤的先後並不表示重要程度的輕重。 我們可以用特定的搜尋模式列出符合條件的標籤。在 Git 自身專案倉庫中,有著超過 240 個標籤,如果你只對 1.4.2 系列的版本感興趣,可以執行下面的命令:
$ git tag -l 'v1.4.2.*' v1.4.2.1 v1.4.2.2 v1.4.2.3 v1.4.2.4
新建標籤
Git 使用的標籤有兩種型別:輕量級的(lightweight)和含附註的(annotated)。
輕量級標籤就像是個不會變化的分支,實際上它就是個指向特定提交物件的引用。
而含附註標籤,實際上是儲存在倉庫中的一個獨立物件,它有自身的校驗和資訊,包含著標籤的名字,電子郵件地址和日期,以及標籤說明,標籤本身也允許使用 GNU Privacy Guard (GPG) 來簽署或驗證。一般我們都建議使用含附註型的標籤,以便保留相關資訊 ;當然,如果只是臨時性加註標籤,或者不需要旁註額外資訊,用輕量級標籤也沒問題。
含附註的標籤建立一個含附註型別的標籤非常簡單,用 -a (譯註:取 annotated 的首字母)指定標籤名字即可:
$ git tag -a v1.4 -m 'my version 1.4' $ git tag v0.1 v1.3 v1.4
而 -m 選項則指定了對應的標籤說明,Git 會將此說明一同儲存在標籤物件中。如果沒有給出該選項,Git 會啟動文字編輯軟體供你輸入標籤說明。可以使用 git show 命令檢視相應標籤的版本資訊,並連同顯示打標籤時的提交物件。
$ git show v1.4 tag v1.4 Tagger: Scott Chacon Date: Mon Feb 9 14:45:11 2009 -0800 my version 1.4 commit 15027957951b64cf874c3557a0f3547bd83b3ff6 Merge: 4a447f7... a6b4c97... Author: Scott Chacon Date: Sun Feb 8 19:02:46 2009 -0800 Merge branch 'experiment'
我們可以看到在提交物件資訊上面,列出了此標籤的提交者和提交時間,以及相應的標籤說明。
簽署標籤
如果你有自己的私鑰,還可以用 GPG 來簽署標籤,只需要把之前的 -a 改為 -s (譯註: 取 signed 的首字母)即可:
$ git tag -s v1.5 -m 'my signed 1.5 tag' You need a passphrase to unlock the secret key for user: "Scott Chacon" 1024-bit DSA key, ID F721C45A, created 2009-02-09
現在再執行 git show 會看到對應的 GPG 簽名也附在其內。
輕量級標籤
輕量級標籤實際上就是一個儲存著對應提交物件的校驗和資訊的檔案。要建立這樣的標籤,一個 -a,-s 或 -m 選項都不用,直接給出標籤名字即可:
$ git tag v1.4-lw $ git tag v0.1 v1.3 v1.4 v1.4-lw v1.5
現在執行 git show 檢視此標籤資訊,就只有相應的提交物件摘要:
$ git show v1.4-lw commit 15027957951b64cf874c3557a0f3547bd83b3ff6 Merge: 4a447f7... a6b4c97... Author: Scott Chacon Date: Sun Feb 8 19:02:46 2009 -0800 Merge branch 'experiment'
驗證標籤
可以使用 git tag -v [tag-name] (譯註:取 verify 的首字母)的方式驗證已經簽署的標籤。此命令會呼叫 GPG 來驗證簽名,所以你需要有簽署者的公鑰,存放在 keyring 中,才能驗證
後期加註標籤
只要在打標籤的時候跟上對應提交物件的校驗和(或前幾位字元)即可:
$ git tag -a v1.2 9fceb02
分享標籤
預設情況下,git push 並不會把標籤傳送到遠端伺服器上,只有通過顯式命令才能分享標籤到遠端倉庫。其命令格式如同推送分支,執行 git push origin [tagname] 即可:
$ git push origin v1.5
Counting objects: 50, done.
Compressing objects: 100% (38/38), done.
Writing objects: 100% (44/44), 4.56 KiB, done.
Total 44 (delta 18), reused 8 (delta 1)
To[email protected]:schacon/simplegit.git
* [new tag] v1.5 -> v1.5
如果要一次推送所有本地新增的標籤上去,可以使用 --tags 選項:
$ git push origin --tags
如果打完標籤想進入這個標籤版本怎麼辦呢?
檢視存在的tag
git tag -l
切換到某個tag
git checkout tag_name