在 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>
可以刪除一個遠端標籤。