Git
章節 ▾ 第二版

2.6 Git 基礎 - 標籤

標籤

如同大多數的版本控制系統,Git 能夠將儲存庫歷史中的特定點標記為重要點。一般來說,人們會使用此功能來標記發佈點(v1.0v2.0 等等)。在本節中,您將學習如何列出現有標籤、如何建立和刪除標籤,以及不同標籤類型。

列出您的標籤

在 Git 中列出現有的標籤很簡單。只需輸入 git tag(可選用 -l--list

$ git tag
v1.0
v2.0

此命令會依字母順序顯示標籤;顯示的順序沒有實際的重要性。

您也可以搜尋符合特定模式的標籤。例如,Git 原始碼儲存庫包含超過 500 個標籤。如果您只對查看 1.8.5 系列感興趣,您可以執行此操作

$ git tag -l "v1.8.5*"
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5
注意
列出標籤萬用字元需要 -l--list 選項

如果您只需要完整的標籤清單,執行命令 git tag 會隱含地假設您需要清單並提供一個;在這種情況下,使用 -l--list 是可選的。

但是,如果您提供萬用字元模式來匹配標籤名稱,則必須使用 -l--list

建立標籤

Git 支援兩種標籤類型:輕量級附註型

輕量級標籤非常像一個不會變更的分支,它只是一個指向特定提交的指標。

然而,附註型標籤會以完整物件的形式儲存在 Git 資料庫中。它們會經過檢查總和;包含標籤者的名稱、電子郵件和日期;具有標籤訊息;並且可以使用 GNU Privacy Guard (GPG) 進行簽署和驗證。一般來說,建議您建立附註型標籤,以便擁有所有這些資訊;但是,如果您需要暫時性標籤,或因為某些原因不想保留其他資訊,您也可以使用輕量級標籤。

附註型標籤

在 Git 中建立附註型標籤很簡單。最簡單的方法是在執行 tag 命令時指定 -a

$ git tag -a v1.4 -m "my version 1.4"
$ git tag
v0.1
v1.3
v1.4

-m 指定一個標籤訊息,該訊息會與標籤一起儲存。如果您沒有為附註型標籤指定訊息,Git 會啟動您的編輯器,讓您可以輸入訊息。

您可以使用 git show 命令查看標籤資料以及標籤所指向的提交。

$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:19:12 2014 -0700

my version 1.4

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number

這會顯示標籤者資訊、提交被標籤的日期,以及在顯示提交資訊之前的註解訊息。

輕量標籤

另一種標記提交的方式是使用輕量標籤。這基本上是儲存在檔案中的提交校驗和,不保留其他資訊。要建立輕量標籤,請不要提供任何 -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 ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number

稍後標籤

您也可以在移動到提交之後才標記它們。假設您的提交歷史記錄如下所示:

$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 Create write support
0d52aaab4479697da7686c15f77a3d64d9165190 One more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc Add commit function
4682c3261057305bdd616e23b64b0857d832627b Add todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a Create write support
9fceb02d0ae598e95dc970b74767f19372d61af8 Update rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc Commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a Update readme

現在,假設您忘記在 v1.2 版本標記專案,而該版本是在「Update rakefile」提交上。您可以在事後添加它。要標記該提交,請在命令末尾指定提交校驗和 (或其一部分)。

$ git tag -a v1.2 9fceb02

您可以看到您已標記了該提交。

$ git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5

$ git show v1.2
tag v1.2
Tagger: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Feb 9 15:32:16 2009 -0800

version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <mchacon@gee-mail.com>
Date:   Sun Apr 27 20:43:35 2008 -0700

    Update 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

如果您有很多標籤想要一次推送,您也可以使用 git push 命令的 --tags 選項。這會將所有尚未在遠端伺服器上的標籤傳輸到該伺服器。

$ 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 push 會推送兩種標籤

git push <remote> --tags 會推送輕量和附註標籤。目前沒有選項可以只推送輕量標籤,但如果您使用 git push <remote> --follow-tags,則只會將附註標籤推送至遠端。

刪除標籤

要在您的本機儲存庫中刪除標籤,您可以使用 git tag -d <tagname>。例如,我們可以如下移除上面的輕量標籤:

$ git tag -d v1.4-lw
Deleted tag 'v1.4-lw' (was e7d5add)

請注意,這不會從任何遠端伺服器上移除標籤。從遠端伺服器刪除標籤有兩種常見的變體。

第一種變體是 git push <remote> :refs/tags/<tagname>

$ git push origin :refs/tags/v1.4-lw
To /git@github.com:schacon/simplegit.git
 - [deleted]         v1.4-lw

解釋上述內容的方式是將冒號前的空值推送至遠端標籤名稱,實際上是刪除它。

刪除遠端標籤的第二種 (也是更直觀的) 方式是使用:

$ git push origin --delete <tagname>

檢出標籤

如果您想查看標籤指向的檔案版本,您可以對該標籤執行 git checkout,雖然這會使您的儲存庫進入「分離 HEAD」狀態,這會產生一些不良的副作用。

$ git checkout v2.0.0
Note: switching to 'v2.0.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final

$ git checkout v2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... Add atlas.json and cover image

在「分離 HEAD」狀態下,如果您進行變更然後建立提交,標籤將保持不變,但您的新提交將不屬於任何分支,並且除了確切的提交雜湊之外,將無法訪問。因此,如果您需要進行變更 (例如,您正在修復舊版本上的錯誤),您通常會想要建立一個分支。

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

如果您這樣做並進行提交,您的 version2 分支將與您的 v2.0.0 標籤略有不同,因為它會隨著您的新變更向前移動,因此請務必小心。

scroll-to-top