git tag 標(biāo)簽完全用法(如何更好的管理你的分支)

打標(biāo)簽

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

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

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

$ git tag
v0.1
v1.3

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

我們可以用特定的搜索模式列出符合條件的標(biāo)簽飘痛。在 Git 自身項(xiàng)目倉(cāng)庫(kù)中,有著超過(guò) 240 個(gè)標(biāo)簽容握,如果你只對(duì) 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)簽有兩種類型:輕量級(jí)的(lightweight)和含附注的(annotated)。
lightweight :輕量級(jí)標(biāo)簽就像是個(gè)不會(huì)變化的分支剔氏,實(shí)際上它就是個(gè)指向特定提交對(duì)象的引用塑猖。
annotated:含附注標(biāo)簽,實(shí)際上是存儲(chǔ)在倉(cāng)庫(kù)中的一個(gè)獨(dú)立對(duì)象介蛉,它有自身的校驗(yàn)和信息萌庆,包含著標(biāo)簽的名字溶褪,電子郵件地址和日期币旧,以及標(biāo)簽說(shuō)明,標(biāo)簽本身也允許使用 GNU Privacy Guard (GPG) 來(lái)簽署或驗(yàn)證猿妈。

一般我們都建議使用含附注型的標(biāo)簽吹菱,以便保留相關(guān)信息;當(dāng)然彭则,如果只是臨時(shí)性加注標(biāo)簽鳍刷,或者不需要旁注額外信息,用輕量級(jí)標(biāo)簽也沒(méi)問(wèn)題俯抖。

含附注的標(biāo)簽

創(chuàng)建一個(gè)含附注類型的標(biāo)簽非常簡(jiǎn)單输瓜,用 -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)則指定了對(duì)應(yīng)的標(biāo)簽說(shuō)明,Git 會(huì)將此說(shuō)明一同保存在標(biāo)簽對(duì)象中芬萍。如果沒(méi)有給出該選項(xiàng)尤揣,Git 會(huì)啟動(dòng)文本編輯軟件供你輸入標(biāo)簽說(shuō)明。(git 提交注釋都是-m 'XXxx')

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

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

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

簽署標(biāo)簽

如果你有自己的私鑰旧蛾,還可以用 GPG 來(lái)簽署標(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 會(huì)看到對(duì)應(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'

稍后我們?cè)賹W(xué)習(xí)如何驗(yàn)證已經(jīng)簽署的標(biāo)簽蠕嫁。

輕量級(jí)標(biāo)簽

輕量級(jí)標(biāo)簽實(shí)際上就是一個(gè)保存著對(duì)應(yīng)提交對(duì)象的校驗(yàn)和信息的文件锨天。要?jiǎng)?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)的提交對(duì)象摘要:

$ 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)簽迟赃。此命令會(huì)調(diào)用 GPG 來(lái)驗(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

若是沒(méi)有簽署者的公鑰左刽,會(huì)報(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)簽

你甚至可以在后期對(duì)早先的某次提交加注標(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)目打上版本號(hào) v1.2酌媒,沒(méi)關(guān)系欠痴,現(xiàn)在也能做。只要在打標(biāo)簽的時(shí)候跟上對(duì)應(yīng)提交對(duì)象的校驗(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 并不會(huì)把標(biāo)簽傳送到遠(yuǎn)端服務(wù)器上喇辽,只有通過(guò)顯式命令才能分享標(biāo)簽到遠(yuǎn)端倉(cāng)庫(kù)。其命令格式如同推送分支雨席,運(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)在,其他人克隆共享倉(cāng)庫(kù)或拉取數(shù)據(jù)同步后陡厘,也會(huì)看到這些標(biāo)簽抽米。

拉取tag分支

先 git clone 整個(gè)倉(cāng)庫(kù),然后 git checkout tag_name 就可以取得 tag 對(duì)應(yīng)的代碼了糙置。
但是這時(shí)候 git 可能會(huì)提示你當(dāng)前處于一個(gè)“detached HEAD" 狀態(tài)云茸,因?yàn)?tag 相當(dāng)于是一個(gè)快照,是不能更改它的代碼的谤饭,如果要在 tag 代碼的基礎(chǔ)上做修改标捺,你需要一個(gè)分支:
git checkout -b branch_name tag_name
這樣會(huì)從 tag 創(chuàng)建一個(gè)分支,然后就和普通的 git 操作一樣了揉抵。

其實(shí)要取得不同的branch的tag亡容,只需要在相應(yīng)的分支上打tag就行了。這樣的tag就唯一對(duì)應(yīng)了不同的分支功舀。例如萍倡,你在master上打了tag為v1,在某個(gè)branch上打了tag為v2辟汰,則你取出v2代碼的時(shí)候列敲,自然就是對(duì)應(yīng)的branch分支了阱佛。

刪除tag分支

如果標(biāo)簽已經(jīng)推送到遠(yuǎn)程,要?jiǎng)h除遠(yuǎn)程標(biāo)簽就麻煩一點(diǎn)戴而,先從本地刪除:

$ git tag -d v0.9
Deleted tag 'v0.9' (was 6224937)

然后凑术,從遠(yuǎn)程刪除。刪除命令也是push所意,但是格式如下:

$ git push origin :refs/tags/v0.9
To git@github.com:michaelliao/learngit.git
 - [deleted]         v0.9

要看看是否真的從遠(yuǎn)程庫(kù)刪除了標(biāo)簽淮逊,可以登陸GitHub查看。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扶踊,一起剝皮案震驚了整個(gè)濱河市泄鹏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秧耗,老刑警劉巖备籽,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異分井,居然都是意外死亡车猬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)尺锚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)珠闰,“玉大人,你說(shuō)我怎么就攤上這事瘫辩》龋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵杭朱,是天一觀的道長(zhǎng)阅仔。 經(jīng)常有香客問(wèn)我吹散,道長(zhǎng)弧械,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任空民,我火速辦了婚禮刃唐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘界轩。我一直安慰自己画饥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布浊猾。 她就那樣靜靜地躺著抖甘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪葫慎。 梳的紋絲不亂的頭發(fā)上衔彻,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天薇宠,我揣著相機(jī)與錄音,去河邊找鬼艰额。 笑死澄港,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柄沮。 我是一名探鬼主播回梧,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼祖搓!你這毒婦竟也來(lái)了狱意?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拯欧,失蹤者是張志新(化名)和其女友劉穎髓涯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體哈扮,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纬纪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了滑肉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片包各。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖靶庙,靈堂內(nèi)的尸體忽然破棺而出问畅,到底是詐尸還是另有隱情,我是刑警寧澤六荒,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布护姆,位于F島的核電站,受9級(jí)特大地震影響掏击,放射性物質(zhì)發(fā)生泄漏卵皂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一砚亭、第九天 我趴在偏房一處隱蔽的房頂上張望灯变。 院中可真熱鬧,春花似錦捅膘、人聲如沸添祸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刃泌。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耙替,已是汗流浹背鲤遥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留林艘,地道東北人盖奈。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像狐援,于是被迫代替她去往敵國(guó)和親钢坦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Add & Commit git init 初始化一個(gè) Git 倉(cāng)庫(kù)(repository)啥酱,即把當(dāng)前所在目錄變成...
    冬絮閱讀 4,804評(píng)論 0 8
  • 遠(yuǎn)程倉(cāng)庫(kù) 到目前為止爹凹,我們已經(jīng)掌握了如何在Git倉(cāng)庫(kù)里對(duì)一個(gè)文件進(jìn)行時(shí)光穿梭,你再也不用擔(dān)心文件備份或者丟失的問(wèn)題...
    歸云丶閱讀 1,958評(píng)論 0 5
  • git基礎(chǔ)總結(jié) 在工作目錄中初始化新倉(cāng)庫(kù):$ git init 將文件添加到git: 格式:$ git add 舉...
    努力三兒閱讀 410評(píng)論 0 0
  • 這篇筆記是為了學(xué)習(xí)Git知識(shí)而收集總結(jié)的镶殷,主要是看受一篇帖子《你可能不知道的15條Git命令》的影響禾酱,才想記錄這篇...
    WEB全棧開(kāi)發(fā)陳老師閱讀 1,296評(píng)論 0 0
  • 了解 Linux 常見(jiàn)命令 在使用 git 前,建議事先熟悉一些常見(jiàn)的 bash 命令 進(jìn)入xxx目錄$ cd x...
    acc8226閱讀 600評(píng)論 0 1