學習 Git (8) - Tag 標籤


Posted by Calon on 2022-05-25

Tag 會指向某一個物件,和分支有點類似,並且 Tag 檔案的位置也和分支一樣在 .git/refs 目錄裡面,至於和分支不同的地方除了 Tag 物件是在 .git/refs/tags 裡面以外,Tag 也不會跟著 commit 的進度而有所移動。

Tag 的使用時機

通常會在開發到一個特定階段的時候使用,例如:正式上線版本號 1.0.0、beta-release 1.0.0 等等。
而 Tag 又分為兩種類型,分別是輕量標籤(lightweight tag)以及附註標籤(annotated tag),不管是哪一種都可以將它想像成一張便利貼,而這張便利貼會貼在我們所指定的 commit 上面並且不會跟隨著 commit 的新增而被撕下來移動。

輕量標籤(lightweight tag)

首先我們來介紹怎麼使用輕量標籤,我們先來看一下範例的 commit 紀錄:

$ git log --oneline --graph
*   485e562 (HEAD -> main) Merge branch 'new_develop' into main
|\  
| * 4444f10 (develop) 新增 work2.txt
| * 6f5eefa 新增 work1.txt
* | 595b530 新增 test.txt
|/  
* ccf65d1 新增 rule 3
* c8699fa 新增 rule2.txt
* 7cf2baa 新增 rules.txt 內容
* deb6d18 init

接下來我想要在最新一筆紀錄著被合併的 commit 上貼上 Tag:

$ git tag merge_develop

我們使用 git log 來檢視一下有沒有變化:

$ git log --oneline --graph
*   485e562 (HEAD -> main, tag: merge_develop) Merge branch 'new_develop' into main
|\
| * 4444f10 (develop) 新增 work2.txt
| * 6f5eefa 新增 work1.txt
* | 595b530 新增 test.txt
|/
* ccf65d1 新增 rule 3
* c8699fa 新增 rule2.txt
* 7cf2baa 新增 rules.txt 內容
* deb6d18 init

在最新的 485e562 旁邊有出現 tag: merge_develop,我們已經成功將輕量標籤指向 485e562 了。
沒有指定 commit 的 SHA-1 的話就會是最新一筆,如果想要指定其他時間的 commit 只要帶上該 commit 的 SHA-1:

$ git tag develop_1.1.0_done 4444f10

這樣就為 4444f10 這筆 commit 貼上 Tag 了:

$ git log --oneline --graph
*   485e562 (HEAD -> main, tag: merge_develop) Merge branch 'new_develop' into main
|\
| * 4444f10 (tag: develop_1.1.0_done, develop) 新增 work2.txt
| * 6f5eefa 新增 work1.txt
* | 595b530 新增 test.txt
|/
* ccf65d1 新增 rule 3
* c8699fa 新增 rule2.txt
* 7cf2baa 新增 rules.txt 內容
* deb6d18 init

附註標籤(annotated tag)

附註標籤的指令有點像在提交 commit,在這邊我們沿用上面的 commit 紀錄範例:

$ git tag release_1.0.0 485e562 -a -m 'release version 1.0.0'

上面的參數 -a 是告訴 Git 要建立附註標籤,而後面的參數 -m 則是跟提交 commit 時一樣輸入訊息內容,如果沒加上的話就會跳出 Vim 編輯器出來讓我們編輯訊息。

兩種標籤的差異

我們來使用 git log 來檢視一下剛才貼上去的附註標籤:

$ git log --oneline --graph
*   485e562 (HEAD -> main, tag: release_1.0.0) Merge branch 'new_develop' into main
|\
| * 4444f10 (develop) 新增 work2.txt
| * 6f5eefa 新增 work1.txt
* | 595b530 新增 test.txt
|/
* ccf65d1 新增 rule 3
* c8699fa 新增 rule2.txt
* 7cf2baa 新增 rules.txt 內容
* deb6d18 init

這樣看起來好像跟輕量標籤一樣,到底是哪裡有差異呢?我們換一個指令來檢視,首先是輕量標籤 develop_done:

commit 485e562ee0d47d372c277207329674d0980dbe2c (HEAD -> main, tag: merge_develop)
Merge: 595b530 4444f10
Author: Calon <calon@mail.com>
Date:   Fri May 20 15:22:21 2022 +0800

    Merge branch 'new_develop' into main

接下來我們來檢視附註標籤的 release_1.0.0:

$ git show release_1.0.0
tag release_1.0.0
Tagger: Calon <calon@mail.com>
Date:   Wed May 25 23:15:47 2022 +0800

release version 1.0.0

commit 485e562ee0d47d372c277207329674d0980dbe2c (HEAD -> main, tag: release_1.0.0)
Merge: 595b530 4444f10
Author: Calon <calon@mail.com>
Date:   Fri May 20 15:22:21 2022 +0800

    Merge branch 'new_develop' into main

有發現差別了嗎?沒錯,如果是輕量標籤的話只會單純顯示所指向的 commit 內容,而如果是用附註標籤的話會有貼上 Tag 的時間以及誰貼上的,另外在 Git 的 Tag 官方文件中也有對這兩種 Tag 的用途進行說明:

Annotated tags are meant for release while lightweight tags are meant for private or temporary object labels.

大意是附註標籤主要是給軟體版號等比較正式的用途,而輕量標籤則是個人用途或臨時紀錄用,因此在一些指令預設會忽略輕量標籤(例如 git describe)。

刪除 Tag

最後我們來介紹怎麼刪除 Tag,我們在最初介紹 Tag 時有說過 Tag 跟分支一樣像是一張便利貼貼在指定的 commit 上,所以當我們刪除 Tag 時就只是把這張 Tag 便利貼從 commit 上撕起來而已。而我們只要加上參數 -d 就可以刪掉我們不要的 Tag:

$ git tag -d merge_develop
Deleted tag 'merge_develop' (was 485e562)

參考資料
  • 高見龍,《為你自己學 Git》

#Git







Related Posts

JavaScript-提升hoisting

JavaScript-提升hoisting

[第九週]  PHP 與 MySQL 的互動:讀取資料

[第九週] PHP 與 MySQL 的互動:讀取資料

滲透測試基本技術 第三章 (003)

滲透測試基本技術 第三章 (003)


Comments