Git 打標(biāo)簽

2018-09-27 15:36 更新

同大多數(shù) VCS 一樣,Git 也可以對某一時(shí)間點(diǎn)上的版本打上標(biāo)簽。人們在發(fā)布某個(gè)軟件版本(比如 v1.0 等等)的時(shí)候,經(jīng)常這么做。本節(jié)我們一起來學(xué)習(xí)如何列出所有可用的標(biāo)簽,如何新建標(biāo)簽,以及各種不同類型標(biāo)簽之間的差別。

列顯已有的標(biāo)簽

列出現(xiàn)有標(biāo)簽的命令非常簡單,直接運(yùn)行 git tag 即可:

$ git tag
v0.1
v1.3

顯示的標(biāo)簽按字母順序排列,所以標(biāo)簽的先后并不表示重要程度的輕重。

我們可以用特定的搜索模式列出符合條件的標(biāo)簽。在 Git 自身項(xiàng)目倉庫中,有著超過 240 個(gè)標(biāo)簽,如果你只對 1.4.2 系列的版本感興趣,可以運(yùn)行下面的命令:

$ git tag -l 'v1.4.2.*'
v1.4.2.1
v1.4.2.2
v1.4.2.3
v1.4.2.4

新建標(biāo)簽

Git 使用的標(biāo)簽有兩種類型:輕量級的(lightweight)和含附注的(annotated)。輕量級標(biāo)簽就像是個(gè)不會變化的分支,實(shí)際上它就是個(gè)指向特定提交對象的引用。而含附注標(biāo)簽,實(shí)際上是存儲在倉庫中的一個(gè)獨(dú)立對象,它有自身的校驗(yàn)和信息,包含著標(biāo)簽的名字,電子郵件地址和日期,以及標(biāo)簽說明,標(biāo)簽本身也允許使用 GNU Privacy Guard (GPG) 來簽署或驗(yàn)證。一般我們都建議使用含附注型的標(biāo)簽,以便保留相關(guān)信息;當(dāng)然,如果只是臨時(shí)性加注標(biāo)簽,或者不需要旁注額外信息,用輕量級標(biāo)簽也沒問題。

含附注的標(biāo)簽

創(chuàng)建一個(gè)含附注類型的標(biāo)簽非常簡單,用 -a (譯注:取 annotated 的首字母)指定標(biāo)簽名字即可:

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

-m 選項(xiàng)則指定了對應(yīng)的標(biāo)簽說明,Git 會將此說明一同保存在標(biāo)簽對象中。如果沒有給出該選項(xiàng),Git 會啟動文本編輯軟件供你輸入標(biāo)簽說明。

可以使用 git show 命令查看相應(yīng)標(biāo)簽的版本信息,并連同顯示打標(biāo)簽時(shí)的提交對象。

$ git show v1.4
tag v1.4
Tagger: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Feb 9 14:45:11 2009 -0800

my version 1.4

commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sun Feb 8 19:02:46 2009 -0800

    Merge branch 'experiment'

我們可以看到在提交對象信息上面,列出了此標(biāo)簽的提交者和提交時(shí)間,以及相應(yīng)的標(biāo)簽說明。

簽署標(biāo)簽

如果你有自己的私鑰,還可以用 GPG 來簽署標(biāo)簽,只需要把之前的 -a 改為 -s(譯注: 取 signed 的首字母)即可:

$ git tag -s v1.5 -m 'my signed 1.5 tag'
You need a passphrase to unlock the secret key for
user: "Scott Chacon <schacon@gee-mail.com>"
1024-bit DSA key, ID F721C45A, created 2009-02-09

現(xiàn)在再運(yùn)行 git show 會看到對應(yīng)的 GPG 簽名也附在其內(nèi):

$ git show v1.5
tag v1.5
Tagger: Scott Chacon <schacon@gee-mail.com>
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 <schacon@gee-mail.com>
Date:   Sun Feb 8 19:02:46 2009 -0800

    Merge branch 'experiment'

稍后我們再學(xué)習(xí)如何驗(yàn)證已經(jīng)簽署的標(biāo)簽。

輕量級標(biāo)簽

輕量級標(biāo)簽實(shí)際上就是一個(gè)保存著對應(yīng)提交對象的校驗(yàn)和信息的文件。要創(chuàng)建這樣的標(biāo)簽,一個(gè) -a,-s-m 選項(xiàng)都不用,直接給出標(biāo)簽名字即可:

$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5

現(xiàn)在運(yùn)行 git show 查看此標(biāo)簽信息,就只有相應(yīng)的提交對象摘要:

$ git show v1.4-lw
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sun Feb 8 19:02:46 2009 -0800

    Merge branch 'experiment'

驗(yàn)證標(biāo)簽

可以使用 git tag -v [tag-name] (譯注:取 verify 的首字母)的方式驗(yàn)證已經(jīng)簽署的標(biāo)簽。此命令會調(diào)用 GPG 來驗(yàn)證簽名,所以你需要有簽署者的公鑰,存放在 keyring 中,才能驗(yàn)證:

$ git tag -v v1.4.2.1
object 883653babd8ee7ea23e6a5c392bb739348b1eb61
type commit
tag v1.4.2.1
tagger Junio C Hamano <junkio@cox.net> 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 <junkio@cox.net>"
gpg:                 aka "[jpeg image of size 1513]"
Primary key fingerprint: 3565 2A26 2040 E066 C9A7  4A7D C0C6 D9A4 F311 9B9A

若是沒有簽署者的公鑰,會報(bào)告類似下面這樣的錯(cuò)誤:

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'

后期加注標(biāo)簽

你甚至可以在后期對早先的某次提交加注標(biāo)簽。比如在下面展示的提交歷史中:

$ 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” 后為此項(xiàng)目打上版本號 v1.2,沒關(guān)系,現(xiàn)在也能做。只要在打標(biāo)簽的時(shí)候跟上對應(yīng)提交對象的校驗(yàn)和(或前幾位字符)即可:

$ git tag -a v1.2 9fceb02

可以看到我們已經(jīng)補(bǔ)上了標(biāo)簽:

$ 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
...

分享標(biāo)簽

默認(rèn)情況下,git push 并不會把標(biāo)簽傳送到遠(yuǎn)端服務(wù)器上,只有通過顯式命令才能分享標(biāo)簽到遠(yuǎn)端倉庫。其命令格式如同推送分支,運(yùn)行git push origin [tagname]即可:

$ git push origin v1.5
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]         v1.5 -> v1.5

如果要一次推送所有本地新增的標(biāo)簽上去,可以使用 --tags 選項(xiàng):

$ git push origin --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

現(xiàn)在,其他人克隆共享倉庫或拉取數(shù)據(jù)同步后,也會看到這些標(biāo)簽。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號