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