Git 系列教程(9)- 打標籤

小菠蘿測試筆記發表於2021-05-16

打標籤

一般會給提交歷史打個標籤,方便後續進行篩選、檢視

 

列出標籤

可帶上可選的 -l 選項 --list

$ git tag
v1.0
v2.0

這個命令以字母順序列出標籤

 

可以按照特定的模式查詢標籤

例如,Git 程式碼倉庫包含標籤的數量超過 500 個,只想查 v1.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 支援兩種標籤

  • 輕量標籤(lightweight)
  • 附註標籤(annotated)

 

輕量標籤

很像一個不會改變的分支,它只是某個特定提交的引用

 

附註標籤

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

 

附註標籤相關命令

建立附註標籤

在執行 tag 命令時指定 -a 選項

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

-m 選項指定了一條將會儲存在標籤中的資訊,如果不加,就會要求你手動輸入

 

檢視標籤資訊和提交資訊

通過使用 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

    changed the version number

輸出顯示了打標籤者的資訊、打標籤的日期時間、附註資訊,然後顯示具體的提交資訊

 

輕量標籤相關命令

本質上是將提交校驗和(SHA,那串很長的亂碼)儲存到一個檔案中,沒有儲存任何其他資訊

 

建立輕量標籤

不需要使用 -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

    changed the version number

 

後期打標籤

也可以對提交歷史打標籤

 

實際栗子

假設提交歷史是這樣的

$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme

現在,假設在 v1.2 時你忘記給專案打標籤,也就是在 “updated 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

    updated rakefile
...

 

共享標籤

  • 預設情況下,git push 命令並不會傳送標籤到遠端倉庫伺服器上
  • 在建立完標籤後你必須顯式地推送標籤到遠端倉庫上

 

推送標籤的語法格式

git push <remote> <tagname>

 

實際栗子

polo@B-J5D1MD6R-2312 watermarker % git push origin2 1.11
列舉物件中: 17, 完成.
物件計數中: 100% (17/17), 完成.
使用 12 個執行緒進行壓縮
壓縮物件中: 100% (12/12), 完成.
寫入物件中: 100% (14/14), 1.47 KiB | 1.47 MiB/s, 完成.
總共 14(差異 6),複用 0(差異 0),包複用 0
remote: Powered by GITEE.COM [GNK-5.0]
To gitee.com:poloyy/watermarker.git
 * [new tag]         1.11 -> 1.11

 

一次性推送過個標籤

如果想要一次性推送很多標籤,也可以使用帶有 --tags 選項的 git push 命令。 這將會把所有不在遠端倉庫伺服器上的標籤全部傳送到那裡。

git push origin2 --tags
列舉物件中: 6, 完成.
物件計數中: 100% (6/6), 完成.
使用 12 個執行緒進行壓縮
壓縮物件中: 100% (4/4), 完成.
寫入物件中: 100% (5/5), 452 位元組 | 452.00 KiB/s, 完成.
總共 5(差異 2),複用 0(差異 0),包複用 0
remote: Powered by GITEE.COM [GNK-5.0]
To gitee.com:poloyy/watermarker.git
 * [new tag]         1.2 -> 1.2
 * [new tag]         1.3 -> 1.3

現在,當其他人從倉庫中克隆或拉取,他們也能得到這些標籤

 

刪除標籤

刪除掉本地倉庫上的標籤,加個 -d 就行

polo@B-J5D1MD6R-2312 watermarker % git tag
1.11
1.2
1.3
testbu
v1.1
polo@B-J5D1MD6R-2312 watermarker % git tag -d 1.11
已刪除標籤 '1.11'(曾為 9baca61)
polo@B-J5D1MD6R-2312 watermarker % git tag -d 1.2
已刪除標籤 '1.2'(曾為 e4da7ac)
polo@B-J5D1MD6R-2312 watermarker % git tag -d 1.3
已刪除標籤 '1.3'(曾為 bf12eaa)
polo@B-J5D1MD6R-2312 watermarker % git tag
testbu
v1.1

-d 刪除標籤並不會從任何遠端倉庫中刪除這個標籤

 

刪除遠端倉庫的標籤

第一種,--delete 

$ git push origin --delete <tagname>

簡單粗暴的方式

 

栗子

polo@B-J5D1MD6R-2312 watermarker % git push origin2 --delete 1.2
remote: Powered by GITEE.COM [GNK-5.0]
To gitee.com:poloyy/watermarker.git
 - [deleted]         1.2
polo@B-J5D1MD6R-2312 watermarker % git push origin2 --delete 1.3
remote: Powered by GITEE.COM [GNK-5.0]
To gitee.com:poloyy/watermarker.git
 - [deleted]         1.3

 

第二種 ,傳空值

git push <remote> :refs/tags/<tagname> 

將冒號前面的空值推送到遠端標籤名,從而高效地刪除它 

 

栗子

polo@B-J5D1MD6R-2312 watermarker % git push origin2 :refs/tags/1.11
remote: Powered by GITEE.COM [GNK-5.0]
To gitee.com:poloyy/watermarker.git
 - [deleted]         1.11

 

checkout 標籤

  • 如果想檢視某個標籤所指向的檔案版本,可以使用 git checkout 命令
  • 但倉庫處於“分離頭指標(detached HEAD)”的狀態,會有些小問題存在 
polo@B-J5D1MD6R-2312 watermarker % git status
頭指標分離於 testbu
無檔案要提交,乾淨的工作區

 

checkout 的栗子

polo@B-J5D1MD6R-2312 watermarker % git checkout testbu
注意:正在切換到 'testbu'。

您正處於分離頭指標狀態。您可以檢視、做試驗性的修改及提交,並且您可以在切換
回一個分支時,丟棄在此狀態下所做的提交而不對分支造成影響。

如果您想要通過建立分支來保留在此狀態下所做的提交,您可以通過在 switch 命令
中新增引數 -c 來實現(現在或稍後)。例如:

  git switch -c <新分支名>

或者撤銷此操作:

  git switch -

通過將配置變數 advice.detachedHead 設定為 false 來關閉此建議

HEAD 目前位於 7fa175d test

 

檢視當前所處分支

polo@B-J5D1MD6R-2312 watermarker % git branch
* (頭指標在 1.2 分離)
  master

能看到執行 git checkout 之後,本地分支會自動切換到頭指標分支

 

重點

  • 在“分離頭指標”狀態下,如果做了某些更改然後提交它們,標籤不會發生變化
  • 但新提交將不屬於任何分支,並且將無法訪問,除非通過確切的提交雜湊才能訪問,看下面的實際栗子
polo@B-J5D1MD6R-2312 watermarker % git push
fatal: 您當前不在一個分支上。
現在為推送當前(分離頭指標)的歷史,使用

    git push origin HEAD:<遠端分支名字> 

需要指定遠端分支的雜湊(就是那串很長的亂碼字串)

 

因此,如果你需要進行更改,比如你要修復舊版本中的錯誤,那麼通常需要建立一個新分支

polo@B-J5D1MD6R-2312 watermarker % git checkout -b newtest3 1.2
切換到一個新分支 'newtest3'
polo@B-J5D1MD6R-2312 watermarker % git branch
  master
  newtest2
* newtest3

 

相關文章