打標籤
一般會給提交歷史打個標籤,方便後續進行篩選、檢視
列出標籤
可帶上可選的 -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