← 上一章:Reset、Revert 跟 Rebase 指令有什麼差別? 下一章:【冷知識】標籤跟分支有什麼不一樣? →


使用標籤

標籤是什麼?

在 Git,「標籤(tag)」是一個指向某一個 Commit 的指標。咦?這好像跟分支(Branch)一樣不是嗎?是的,他們還滿像的,但也有一些不太一樣的地方,在下一章「【冷知識】標籤跟分支有什麼不一樣?」會再另外說明。

什麼時候使用標籤?

通常在開發軟體有完成特定的里程碑,例如軟體版號 1.0.0 或是 beta-release 之類的,這時候就很適合使用標籤做標記。

標籤有兩種

跟斯斯一樣,標籤也有兩種,一種是輕量標籤(lightweight tag),一種是有附註標籤(annotated tag),但不管哪一種,都可以把它當做貼紙一樣看待,它就是貼在某個 Commit 上的東西。

輕量標籤(lightweight tag)

輕量標籤的使用方法相當簡單,只要直接指定打算貼上去的那個 Commit 給它就行了。假設目前的 Commit 紀錄如下:

$ git log --oneline
db3bbec (HEAD -> master) add fish
930feb3 add pig
51d54ff add lion and tiger
27f6ed6 add dog 2
2bab3e7 add dog 1
ca40fc9 add 2 cats
1de2076 add cat 2
cd82f29 add cat 1
382a2a5 add database settings
bb0c9c2 init commit

我想在 add lion and tiger 這個 Commit(51d54ff)打上一個 big_cats 的標籤:

$ git tag big_cats 51d54ff

這樣就貼好標籤了!如果只使用 git tag big_cats 而沒有加上後面 Commit 的 SHA-1 值,會把標籤貼在目前所在的這個 Commit 上。看看現在的狀態:

$ git log --oneline
db3bbec (HEAD -> master) add fish
930feb3 add pig
51d54ff (tag: big_cats) add lion and tiger
27f6ed6 add dog 2
2bab3e7 add dog 1
ca40fc9 add 2 cats
1de2076 add cat 2
cd82f29 add cat 1
382a2a5 add database settings
bb0c9c2 init commit

可以看到在有一個標籤 big_cats 指向 51d54ff 這個 Commit。如果使用 SourceTree 來操作,可以在你打貼標籤的地方按滑鼠右鍵,選擇「Tag…」功能:

tag

填上標籤的名字,但這邊需要特別點開下方的「Advanced Options」,展開後有一項「Lightweight tag(not recommended)」的選項打勾:

tag

這樣就能建立一個輕量標籤了。因為輕量標籤僅是一個指向某個 Commit 的指標,沒有含有其它的資訊,所以 Git 比較推薦使用有附註的標籤(annotated tag)。

有附註標籤(annotated tag)

以上面的 add lion and tiger 那個 Commit(51d54ff)為例,如果要建立一個有附註的標籤:

$ git tag big_cats 51d54ff -a -m "Big Cats are comming"

這樣就行了,那個 -a 參數就是請 Git 幫你建立有附註的標籤,而後面的 -m 則是跟我們在做一般的 Commit 一樣輸入的訊息,如果沒有使用 -m 參數,會自動跳出一個 Vim 編輯器出來。而在 SourceTree 上要加上有附註的標籤也很容易,跟一般的輕量標籤一樣的流程,但不要勾選「Lightweight tag(not recommended)」的選項就好了。

這是 Git 官方文件對這兩種標籤的說明:

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

有附註標籤主要用來做像是軟體版號之類的用途,而輕量標籤則是用來個人使用或是暫時標記用途。簡單的說,有附註標籤的好處就是有更多關於這張標籤的資訊,例如是誰在什麼時候貼這張標籤,以及為什麼要貼這張標籤。所以如果你不是很在乎這些資訊,用一般的輕量標籤也是沒什麼問題。

兩種標籤的差別

這兩種標籤的第一個差別,就是訊息量的不同,如果是一般的輕量標籤:

$ git show big_cats
commit 51d54ffcbd76902f2f580cf5638305eaaf6acde5
Author: Sherly <[email protected]>
Date:   Tue Aug 22 01:10:54 2017 +0800

    add lion and tiger

diff --git a/cute_animals/lion.html b/cute_animals/lion.html
new file mode 100644
index 0000000..e69de29
diff --git a/cute_animals/tiger.html b/cute_animals/tiger.html
new file mode 100644
index 0000000..e69de29

只有標籤指向的那個 Commit 的訊息。而這是有附註的標籤:

$ git show big_cats

tag big_cats
Tagger: Eddie Kao <[email protected]>
Date:   Tue Aug 22 03:39:37 2017 +0800

Big Cats are comming

commit 51d54ffcbd76902f2f580cf5638305eaaf6acde5
Author: Sherly <[email protected]>
Date:   Tue Aug 22 01:10:54 2017 +0800

    add lion and tiger

diff --git a/cute_animals/lion.html b/cute_animals/lion.html
new file mode 100644
index 0000000..e69de29
diff --git a/cute_animals/tiger.html b/cute_animals/tiger.html
new file mode 100644
index 0000000..e69de29

有附註的標籤比一般的輕量標籤多了一些資訊,可以清楚的看得出來是誰在什麼時候打了這張標籤。

不管是哪種標籤,跟分支一樣都是以檔案方式存在 .git/refs/tags 目錄下:

tag

檔案的內容也跟分支一樣,是一個 40 個字元的 SHA-1 值,指向某個地方。但差別是,輕量標籤指向的是某一個 Commit,但附註標籤是指向某個 Tag 物件,而這個 Tag 物件才再指向那個 Commit。關於 Tag 物件,在「【超冷知識】在 .git 目錄裡有什麼東西?Part 1」章節有詳細說明。

刪除標籤

不管是哪一種標籤,標籤基本上就是一張貼紙的概念,撕掉一張貼紙並不會造成 Commit 或檔案不見。要刪除只要給它 -d 參數就行了:

$ git tag -d big_cats
Deleted tag 'big_cats' (was 8ee0144)

使用 SourceTree 的話,則可在左邊側邊選單,找到那個分支,按滑鼠右鍵選擇最下面「Delete..」的就行了:

tag


← 上一章:Reset、Revert 跟 Rebase 指令有什麼差別? 下一章:【冷知識】標籤跟分支有什麼不一樣? →

Comments