原文:https://www.cnblogs.com/zhoug2020/p/6479365.html
---------------
Git 的標簽管理。跟大多數的 VCS 工具一樣,git 也有在歷史狀態的關鍵點“貼標簽”的功能,一般人們用這個功能來標記發布點(例如’v1.0′)。
列出git中現有標簽
要想列出git中現有的所有標簽,輸入’git tag’命令運行即可:
$ git tag
v0.1
v1.3
這個列表是按照字母表順序給出的,其實排名先后跟重要程度沒有直接聯系。
當然,你也可以按照特定表達式搜索某些標簽。假如在一個 git 倉庫中有超過 240 個標簽,而你只想得到 1.4.2 序列的標簽,那么你可以:
$ git tag -l v1.4.2.*
v1.4.2.1
v1.4.2.2
v1.4.2.3
v1.4.2.4
創建標簽
在 git 中有兩種最主要的標簽–輕量級標簽(lightweight)和帶注釋的標簽(annotated)。輕量級標簽跟分枝一樣,不會改變。它就是針對某個特定提交的指針。然而,帶注釋的標簽是git倉庫中的對象。它是一組校驗和,包含標簽名、email、日期,標簽信息,GPG簽名和驗證。一般情況下,建議創建帶注釋的標簽,這樣就會保留這些信息,但是如果你只是需要臨時性標簽或者某些原因你不想在標簽中附帶上面說的這些信息,lightweight標簽更合適些。
帶注釋的標簽
在git中創建帶注釋的標簽非常簡單,在運行’tag’命令時加上-a就可以了。
$ git tag -a v1.4 -m ‘version 1.4′
$ git tag
v0.1
v1.3
v1.4
‘-m’指明標簽信息,跟標簽一起存儲。如果你不使用-m指明標簽信息,git會自動啟動文本編輯器讓你輸入。
可以使用 git show 命令查看相應標簽的版本信息,並連同顯示打標簽時的提交對象。
$ git show v1.4
tag v1.4
Tagger: Scott Chacon
Date: Mon Feb 9 14:45:11 2009 -0800
my version 1.4
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7… a6b4c97…
Author: Scott Chacon
Date: Sun Feb 8 19:02:46 2009 -0800
Merge branch ‘experiment’
我們可以看到,在提交對象信息上面,列出了此標簽的提交者和提交時間,以及相應的標簽信息。
有簽名的標簽。
如果你有GPG私鑰的話,你也可以用GPG來給你的標簽簽名,把-a換成-s就可以了:
[master]$ git tag -s v1.5 -m ‘my signed 1.5 tag’
You need a passphrase to unlock the secret key for
user: “Scott Chacon ”
1024-bit DSA key, ID F721C45A, created 2009-02-09
然后,如果你對某個標簽運行’git show’的話,你就會看到你的GPG前面附加上去了。
[master]$ git show v1.5
tag v1.5
Tagger: Scott Chacon
Date: Mon Feb 9 15:22:20 2009 -0800
my signed 1.5 tag
—–BEGIN PGP SIGNATURE—–
Version: GnuPG v1.4.8 (Darwin)
iEYEABECAAYFAkmQurIACgkQON3DxfchxFr5cACeIMN+ZxLKggJQf0QYiQBwgySN
Ki0An2JeAVUCAiJ7Ox6ZEtK+NvZAj82/
=WryJ
—–END PGP SIGNATURE—–
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7… a6b4c97…
Author: Scott Chacon
Date: Sun Feb 8 19:02:46 2009 -0800
Merge branch ‘experiment’
稍后,我們會介紹如何驗證簽名標簽。
輕量級標簽
輕量級標簽實際上就是存在一個文件中的提交校驗和–沒有附加任何其他信息。創建輕量級標簽的方法就是把上面’-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 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7… a6b4c97…
Author: Scott Chacon
Date: Sun Feb 8 19:02:46 2009 -0800
Merge branch ‘experiment’
驗證標簽
使用’git tag -v (tag)’就可以驗證一個簽名標簽了。這個命令會用到GPG來驗證簽名。前提是:你必須在密鑰環中存放着簽名者的公鑰。
$ git tag -v v1.4.2.1
object 883653babd8ee7ea23e6a5c392bb739348b1eb61
type commit
tag v1.4.2.1
tagger Junio C Hamano 1158138501 -0700
GIT 1.4.2.1
Minor fixes since 1.4.2, including git-mv and git-http with alternates.
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Good signature from “Junio C Hamano ”
gpg: aka “[jpeg image of size 1513]”
Primary key fingerprint: 3565 2A26 2040 E066 C9A7 4A7D C0C6 D9A4 F311 9B9A
如果你沒有這個公鑰的話,你會看到這樣的信息:
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Can’t check signature: public key not found
error: could not verify the tag ‘v1.4.2.1′
后期貼標簽
這種情況是說你想對以前的某次提交貼個標簽,如果整個提交歷史是這樣的:
$ 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
忘記在那個提交信息為’updated rakefile’的點上貼一個’v1.2′的標簽了,我可以現在貼一個上去。你可以在執行創建標簽的語句后面跟上那次提交的校驗和(或者部分校驗和)。
$ 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
Date: Mon Feb 9 15:32:16 2009 -0800
version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon
Date: Sun Apr 27 20:43:35 2008 -0700
updated rakefile
…
共享標簽
默認情況下,git push
並不會把標簽傳送到遠端服務器上,只有通過顯式命令才能分享標簽到遠端倉庫。其命令格式如同推送分支,運行git push origin [tagname]
即可:
默認情況下,’git push’命令不會將標簽上傳到遠程服務器上。為了共享這些標簽,你必須在’git push’命令后明確添加-tags選項
[master]$ git push –tags
Counting objects: 50, done.
Compressing objects: 100% (38/38), done.
Writing objects: 100% (44/44), 4.56 KiB, done.
Total 44 (delta 18), reused 8 (delta 1)
To git@github.com:schacon/simplegit.git
* [new tag] v0.1 -> v0.1
* [new tag] v1.2 -> v1.2
* [new tag] v1.4 -> v1.4
* [new tag] v1.4-lw -> v1.4-lw
* [new tag] v1.5 -> v1.5
現在,如果有人克隆或者在線同步你的git倉庫的話,標簽也會一並同步了。
刪除tag這么用:
git push origin --delete tag
tag是對歷史一個提交id的引用,如果理解這句話就明白了 使用git checkout tag即可切換到指定tag,例如:git checkout v0.1.0 切換到tag歷史記錄會處在分離頭指針狀態,這個是的修改是很危險的,在切換回主線時如果沒有合並,之前的修改提交基本都會丟失,如果需要修改可以嘗試git checkout -b branch tag創建一個基於指定tag的分支,例如:git checkout -b tset v0.1.0 這個時候就會在分支上進行開發,之后可以切換到主線合並