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


打標簽

一般會給提交歷史打個標簽,方便后續進行篩選、查看

 

列出標簽

可帶上可選的 -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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM