2019年7月6日 星期六

[Git 文章收集] 使用標籤

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

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

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

輕量標籤(lightweight tag) 
輕量標籤的使用方法相當簡單,只要直接指定打算貼上去的那個 Commit 給它就行了。假設目前的 Commit 紀錄如下: 
$ git log --oneline
0b894d9 Add alg for collecting all sub set of a set
27e435b CountChild
52b40b5 Update .gitignore
9e427b6 Merge pull request #1 from johnklee/add-license-1
ec9ce62 Create LICENSE
1d7fd28 Create README.md

我想在 CountChild 這個 Commit(27e435b)打上一個 count_child 的標籤: 
# git tag count_child 27e435b

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

# git log --oneline
0b894d9 (HEAD -> master, origin/master, origin/HEAD) Add alg for collecting all sub set of a set
27e435b (tag: count_child) CountChild
52b40b5 Update .gitignore
9e427b6 Merge pull request #1 from johnklee/add-license-1
ec9ce62 (origin/add-license-1) Create LICENSE
1d7fd28 Create README.md


有附註標籤(annotated tag) 
接著你可以使用 -a 參數為該 tag 加入額外資訊: 
# git tag count_child 27e435b -a -m 'For fun'
fatal: tag 'count_child' already exists

// -m , --message=: Use the given tag message (instead of prompting).
// -f, --force: Replace an existing tag with the given name

# git tag -f count_child 27e435b -a -m 'For fun'
Updated tag 'count_child' (was 27e435b)

# git show count_child
tag count_child
Tagger: root
Date: Thu Jan 24 08:50:52 2019 +0800

For fun

commit 27e435b9ab83433ac7647f5231e0e019fa10a260
Author: johnklee
Date: Sat Oct 20 18:43:40 2018 +0800
...

這是 Git 官方文件對這兩種標籤的說明: 
Annotated tags are meant for release while lightweight tags are meant for private or temporary object labels.

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

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

# git show test
commit b4d43a3a223440a80c758fe4cdfcce6f78e3a89b
Author: johnklee
Date: Fri May 17 21:10:22 2019 +0800

C1

diff --git a/test.txt b/test.txt
index 1c9ae74..d7b7b73 100644
--- a/test.txt
+++ b/test.txt
@@ -18,3 +18,5 @@ This line is added in master branch for rebase testin

@Update in master branch (9)
@Update in master branch (10)
+
+Test for demo

只有標籤指向的那個 Commit 的訊息。而這是有附註的標籤: 
# git tag 'test' -a -m 'Annotated tag' b4d43a3

# git show test
tag test
Tagger: johnklee
Date: Sat Jul 6 14:57:00 2019 +0800

Annotated tag


commit b4d43a3a223440a80c758fe4cdfcce6f78e3a89b
Author: johnklee
Date: Fri May 17 21:10:22 2019 +0800

C1

diff --git a/test.txt b/test.txt
index 1c9ae74..d7b7b73 100644
--- a/test.txt
+++ b/test.txt
@@ -18,3 +18,5 @@ This line is added in master branch for rebase testin

@Update in master branch (9)
@Update in master branch (10)
+
+Test for demo

有附註的標籤比一般的輕量標籤多了一些資訊,可以清楚的看得出來是誰在什麼時候打了這張標籤。不管是哪種標籤,跟分支一樣都是以檔案方式存在 .git/refs/tags 目錄下: 
# ls .git/refs/tags/
test

# cat .git/refs/tags/test
d41b6ea497fa1435cf9dac0d73335a385d7bb5a7

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

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


Supplement 
How to list all Git tags? 
Git 基礎 - tag

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...