Git 與標籤管理

peterjxl發表於2024-09-27

在 Git 中,標籤 tag 是指向某個 commit 的指標(所以建立和刪除都很快)。Git 有 commit id 了,為什麼還要有 tag?commit id 是一串無規律的數字,不好記;而 tag 是我們自定義的,例如我們可以命名為 v1.2

所以 tag 就是一個讓人容易記住的有意義的名字,它跟某個 commit 綁在一起。

建立標籤

在 Git 中建立標籤非常簡單,首先切換到要打標籤的分支上:

$ git checkout master

然後,敲命令 git tag <name> ​就可以打一個新標籤:

$ git tag v1.0

預設標籤是打在最新提交的 commit 上的。如果想要打在某個 commit id 上,指定 commit id 即可:

$ git tag v0.9 1794212

可以用命令 git tag ​檢視所有標籤:

$ git tag
v0.9
v1.0

注意,標籤不是按時間順序列出,而是按字母排序的。可以用 git show <tagname> ​檢視標籤資訊:

$ git show v0.9
commit 17942124f48557a93541974769ba1187321b8133 (tag: v0.9, bug)
Author: peterjxl <peterjxl@qq.com>
Date:   Sat Jan 14 20:06:01 2023 +0800

    fix bug

diff --git a/3-branch/branch.txt b/3-branch/branch.txt
index b7edfda..42c8f36 100644
--- a/3-branch/branch.txt
+++ b/3-branch/branch.txt
@@ -1,3 +1,3 @@
 Creating a new branch is quick and simple
 test no fast forward
-test
+test cherry-pick

還可以建立帶有說明的標籤,用 -a ​指定標籤名,-m ​指定說明文字:

$ git tag -a v0.1 -m "version 0.1 released" 1094adb

再次用 git show <tagname>​,可以看到說明文字:

$ git show v0.1
tag v0.1
Tagger: peterjxl <peterjxl@qq.com>
Date:   Sat Jan 14 20:50:31 2023 +0800

version 0.1 released

commit abf2051bd989d0b129066bff3700a019665469ce (tag: v0.1)
Author: peterjxl <peterjxl@qq.com>
Date:   Wed Jan 11 22:50:39 2023 +0800

    add diff and patch hello.txt

diff --git a/1-diffAndPath/hello.txt b/1-diffAndPath/hello.txt
new file mode 100644
index 0000000..9bef518
--- /dev/null
+++ b/1-diffAndPath/hello.txt
@@ -0,0 +1,2 @@
+This is hello file
+Welcome to diff

之前說的第一種是輕量標籤(lightweight),第二種帶說明的就是附註標籤(annotated)。

輕量標籤很像一個不會改變的分支——它只是某個特定提交的引用。

而附註標籤是儲存在 Git 資料庫中的一個完整物件, 它們是可以被校驗的,其中包含打標籤者的名字、電子郵件地址、日期時間, 此外還有一個標籤資訊,並且可以使用 GNU Privacy Guard (GPG)簽名並驗證。 通常會建議建立附註標籤,這樣你可以擁有以上所有資訊。但是如果你只是想用一個臨時的標籤, 或者因為某些原因不想要儲存這些資訊,那麼也可以用輕量標籤。

標籤總是和某個 commit 掛鉤。如果這個 commit 既出現在 master 分支,又出現在 dev 分支,那麼在這兩個分支上都可以看到這個標籤。

刪除標籤

如果標籤打錯了,也可以刪除:

$ git tag -d v0.1
Deleted tag 'v0.1' (was 361b94d)

因為建立的標籤都只儲存在本地,不會自動推送到遠端。所以,打錯的標籤可以在本地安全刪除。

推送標籤

如果要推送某個標籤到遠端,使用命令 git push origin <tagname>​:

$ git push gitee v1.0
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.4]
To gitee.com:peterjxl/LearnGit.git
 * [new tag]         v1.0 -> v1.0

或者,一次性推送全部尚未推送到遠端的本地標籤:

$ git push gitee --tags
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.4]
To gitee.com:peterjxl/LearnGit.git
 * [new tag]         v0.9 -> v0.9

如果標籤已經推送到遠端,要刪除遠端標籤就麻煩一點,先從本地刪除:

$ git tag -d v0.9

然後,從遠端刪除。刪除命令也是 push,但是格式如下:

$ git push origin :refs/tags/v0.9

第二種更直觀的刪除遠端標籤的方式是:

$ git push origin --delete <tagname>

要看看是否真的從遠端庫刪除了標籤,可以登入遠端倉庫檢視。

查詢標籤

你也可以按照特定的模式查詢標籤。 例如,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

小結

常用的 git tag 命令如下:

  • git tag tagName 建立標籤
  • git tag 建立標籤
  • 命令 git push origin <tagname> ​可以推送一個本地標籤;
  • 命令 git push origin --tags ​可以推送全部未推送過的本地標籤;
  • 命令 git tag -d <tagname> ​可以刪除一個本地標籤;
  • 命令 git push origin :refs/tags/<tagname> ​可以刪除一個遠端標籤。

相關文章