iT邦幫忙

2021 iThome 鐵人賽

DAY 24
2
Modern Web

【Git】從零開始學習 Git - 30 天的學習筆記系列 第 24

Day24|【Git】認識 git tag 標籤常用指令、標籤與分支的差異

介紹完分支後,這篇來講解「標籤」吧!

標籤在日常生活中可以解釋成標示簡單訊息的小牌子,而在學習階段,應該也有使用過標籤來做筆記,幫助我們快速找到我們想看的那一頁吧?

在 Git 的世界也一樣,「標籤(tag)」會幫助我們指向某個 Commit 物件唷!

這句話是不是好像在分支那裡也有聽過,兩個是相同的東西嗎?以下就來慢慢說明標籤是什麼吧!


標籤(tag)是什麼呢?

跟分支一樣標籤也會指向某個 Commit ,但是並不會像分支一樣隨著 Commit 移動。因此,兩者之間最大的差異在於:分支會隨著 Commit 移動,而標籤則是固定留在某個 Commit 上。

常用時機:標記某個版本號碼,例如:v1.0v2.0v1.0.1v3.7.0-beta.3

因為標籤不會隨著 Commit 推新而移動,因此在開發軟體時常利用這個特質來標記某次的 Commit 賦予它一個版本註解。


兩種類型的標籤:輕量標籤(lightweight tag)附註標籤(annotated tag)

  • 輕量標籤(lightweight tag)

    $ git tag [標籤名稱] [指定 Commit 的 SHA-1 值]
    
    • 可以看作是一個不會移動的分支,只會指向一個特定的 Commit 物件。

    • 不會額外紀錄資訊。

    • 使用時機|只想要一個暫時的標籤的時候

  • 附註標籤 (annotated tag)—> -a 參數

    $ git tag [標籤名稱] [指定 Commit 的 SHA-1 值] -a -m[輸入訊息參數]
    

    顧名思義就是會帶著註解的標籤。

    在 Git 的資料庫會儲存成完整的物件,物件會被計算效驗碼(checksummed)。

    包含:

    • 建立標籤的人的名字、電子郵件和建立日期

    • 紀錄一個標籤訊息(tagging message)

    • 可以簽署及透過 GNU Privacy Guard (GPG) 驗證。

    • 使用時機|附註軟體版號時、紀錄這張標籤的資訊時。

    👉 因此通常建議使用附註標籤,如此一來可以保留跟這個標籤有關的所有資訊

共同點

  • 都是一個 40 字元的 SHA-1 值,指向某個地方。

  • 皆以檔案方式存在 .git/refs/tags 目錄下。

相異點

  • 訊息量的不同。
  • 附註標籤是先指向某個 Tag 物件,再由這個 Tag 物件指向 Commit。(輕量標籤則直接指向 Commit)

關於標籤的各種指令操作

  1. 新增標籤

    1. 新增 輕量標籤(lightweight tag):

      $ git tag [標籤名稱] # 新增一個標籤
      

      如果沒有指定哪個 Commit 時,Git 會自動指向最新的 Commit。

      https://ithelp.ithome.com.tw/upload/images/20211005/20141010E3sP2lMbyk.png

      同時也會在 .git/refs/tags 目錄下以檔案型態儲存。

      https://ithelp.ithome.com.tw/upload/images/20211005/20141010lUDQW9Fb7w.png

      假設今天是要在某個 Commit 上貼上標籤,那麼可以先透過查詢得知 Commit 的版本識別碼後,執行新增標籤指令。

      $ git log --oneline # 查詢紀錄
      $ git tag [標籤名稱] [ Commit 版本識別碼] # 在特定的 Commit 上貼上標籤
      

      https://ithelp.ithome.com.tw/upload/images/20211005/20141010VQrgjHaKCc.png

      https://ithelp.ithome.com.tw/upload/images/20211005/20141010PDYPWnVONl.png

      結果出來我有三個 Commit,其中可以看到最新的 Commit (dba939f) 已經被貼上 first_tag 標籤,是因為剛剛的指令沒有指定特定的 Commit 而自動貼在最新一次的 Commit。

      而現在我想針對 4f18d8b 這個 Commit 貼上標籤,那麼可以執行 git tag [標籤名稱] [ Commit 版本識別碼] 來完成。

      https://ithelp.ithome.com.tw/upload/images/20211005/20141010X0bfVWyFc7.png

      輸入好後可以再次使用 git log --oneline 指令看看是否有成功貼上標籤。

      https://ithelp.ithome.com.tw/upload/images/20211005/20141010MpWIZ6j010.png

      成功貼上啦!同時在資料夾中也可以看到 second_tag 的檔案

      https://ithelp.ithome.com.tw/upload/images/20211005/20141010TgkvyRtjAV.png

    2. 新增 附註標籤(annotated tag):

      $ git tag [標籤名稱] [ Commit 版本識別碼] -a -m"輸入訊息參數" # 新增一個帶有附註資料的標籤
      

      -a 參數 ( annotated 備註 / 註解)- 即是請 GIt 幫你建立一個附註標籤

      -m 參數 - 紀錄訊息(如果沒有加上 -m 參數,可能會跳出 Vim 編輯器)

      假設我要在 e8a31c0 這個 Commit 上加上附註標籤,可透過以下指令執行。

      $ git tag third_tag e8a31c0 -a -m"example_tag" # 在 e8a31c0 這個 Commit 上加上 third_tag 標籤
      

      https://ithelp.ithome.com.tw/upload/images/20211005/20141010b7o5pfEJJ6.png

      使用 git log --oneline 指令查詢後結果如下。

      https://ithelp.ithome.com.tw/upload/images/20211005/20141010v9jZ0RF90z.png

  2. 查詢標籤

    $ git tag # 查詢標籤
    

    https://ithelp.ithome.com.tw/upload/images/20211005/20141010aF4aNIwh55.png

    https://ithelp.ithome.com.tw/upload/images/20211005/20141010boegHUsNjc.png

    輸入指令後就可以知道你目前有哪些標籤囉!

  3. 查看標籤的差別

    $ git show [標籤名稱] # 查看標籤內容
    

    可以使用 git show 指令來查看標籤內的資料,由此我們可以觀察輕量標籤與附註標籤的差異。

    $ git show second_tag third_tag # 查看 second_tag 與 third_tag 這兩支標籤。
    

    https://ithelp.ithome.com.tw/upload/images/20211005/201410100AepTqnWyw.png

    https://ithelp.ithome.com.tw/upload/images/20211005/201410109xmQfitWlQ.png

  4. 刪除標籤

    $ git tag -d [標籤名稱] # 刪除特定標籤
    

    -d 參數即為 delete 的意思。

    如果今天你想移除某個 Commit 上的標籤,那麼就可以透過這個指令達成。假設今天我不想要留下 second_tag 這個標籤,透過以下指令執行看看:

    $ git tag -d second_tag # 刪除 second_tag 標籤
    

    https://ithelp.ithome.com.tw/upload/images/20211005/20141010aKnxox2RlH.png

    輸入指令後按下 Enter 執行,便會回饋訊息告訴說我們已經刪除這隻標籤了。

    也可以使用 git log --oneline 確認是否真的移除掉了。

    https://ithelp.ithome.com.tw/upload/images/20211005/20141010i4bhBLiMLu.png

    可以發現 4f18d8d 這隻 Commit 本來的 second_tag 標籤已不在上面了。


介紹完各種關於標籤的內容與指令後,讓我們再想想分支與標籤:

分支跟標籤有什麼不一樣呢? 🤔

上面有稍微提到,分支與標籤最大的差異就是

⚠️分支會隨著 Commit 移動,而標籤則是固定留在某個 Commit 上。⚠️


【整理】

分支與標籤的

相同點

  1. 皆為一種指標
  2. 都放在 .git/refs 目錄下
  3. 都是 40 個字元的 SHA-1 值
  4. 當被刪除時,不會影響原本被指的物件

相異點

  1. 分支會因為 commit 而往前,標籤則固定不動。
  2. 分支可以修改並作 commit,但標籤不會。
  3. 分支可以合併,但標籤則是獨立的。

上一篇
Day23|【Git】各種合併衝突與分別解決方式
下一篇
Day25|【Git】git stash 暫存檔案
系列文
【Git】從零開始學習 Git - 30 天的學習筆記30

尚未有邦友留言

立即登入留言