現代化 Web 開發技術學習分享

0%

Git 版本控制系統 - 使用標籤為特定版本號做標記

前言

在我們使用某些函式庫或框架進行開發時,途中可能會遇到某些無法理解的內部錯誤,這時最直接的方法就是到官方 GitHub 中的 releases 頁面查找是否有已釋出的修復版本並進行更新;這邊你所看到的版本號其實是由 Git 為特定版本進行標記所形成的標籤,標籤就如同分支一般的存在,但本質上還是有些差異,該如何正確使用標籤標記特定版本以及標籤與分支何謂本質上的差別,本篇都會講到。

筆記重點

  • 新增標籤
  • 刪除標籤
  • 遠端標籤相關操作
  • 標籤與分支差異
  • Git 指令回顧

新增標籤

讓我們先新增一個專案並提交數次 commit 紀錄:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mkdir project

cd project

git init

touch index.html

git add .

git commit -m 'add index.html'

touch all.css

git add .

git commit -m 'add index.html'

touch all.js

git add .

git commit -m 'add all.js'

查看目前日誌:

查看目前 commit 紀錄-1

要在 Git 中使用標籤非常的簡單,先讓我們來執行以下命令:

1
git tag v1.0.0

此時你會發現所在的 commit 節點新增了一個名為 tag: v1.0.0 的狀態:

查看目前 commit 紀錄-2

這就是新增標籤的方法,是不是非常的簡單?標籤名稱你可以隨意命名,但通常我們都是用來標記當前的開發版本,讓我們在試一次:

1
git tag v0.9.0 2755da8

事實上,標籤的語法與分支幾乎差不多,只不過關鍵字一個是 branch 一個是 tag 的差別而已,你也可以在指定 commit 節點貼上標籤,就如同上面所示,讓我們來看目前的狀態:

查看目前 commit 紀錄-3

確實 2755da8 節點也被貼上了標籤,有沒有注意到我都是用 “貼上” 一詞?標籤與分支同樣都屬於貼紙一般的存在,並不是說你刪除了哪一個分支或標籤這一個節點就不見了,頂多只是這個貼紙被撕掉了,你還是可以重貼這張貼紙。

請注意,我們上面使用的標籤形式都是屬於輕量標籤 (lightweight tag),這邊還有另外一種標籤形式為帶註解標籤 (annotated tag),命令如下:

1
git tag v0.8.1 v0.9.0^ -am 'Bug fix'

如同我們前面所提到,標籤與分支都是如同貼紙一般的存在,你也可以使用標籤搭配相對路徑的方式,指定作用的 commit 節點,上面示範了使用 ^ 指定前一個節點,這邊的 -am 參數等同於 -a + -m-a 代表請 Git 幫你建立帶註解的標籤,而後面的 -m 如同 commit 的 -m,即訊息內容,讓我們來看目前的狀態:

查看目前 commit 紀錄-4

這時你會發現 2b7826b 節點也被貼上標籤了,但看起來輕量標籤與帶註解標籤好像沒什麼差別?讓我們使用以下指令將標籤記錄顯示出來:

1
git show v0.9.0

git show 主要用來顯示指定提交版本的異動,你可以在後面指定標籤、分支、SHA-1 等屬性,如果都沒有指定,預設即會顯示 HEAD 的版本內容,讓我們來看此時結果為何:

git show 0.9.0

你會發現輕量標籤真的就只是一張很單純的貼紙,沒有任何的註解內容,顯示的都只是預設就該顯示的內容,這也是官方比較推薦使用帶註解標籤的原因,讓我們來看帶註解標籤有何不同:

git show 0.8.1

帶註解標籤比輕量標籤多了一些資訊,可以很直接看到是誰將這張貼紙貼了上去以及貼紙的內容,我自己是比較常用帶註解標籤,既然你都要貼標籤了,必定是有其原因,這時如果你使用輕量標籤,日後就沒辦法檢視貼這張標籤的原因了,在這邊補充幾個指令:

  • 顯示所有標籤
1
git tag
  • 顯示所有標籤及資訊 (優先顯示帶註解標籤內容,輕量標籤則顯示 commit 訊息內容)
1
git tag -n

這邊比較特別的是 git tag -n 命令,讓我們來執行它並查看結果:

git tag -n

你會發現與單純顯示標籤不同,多了訊息的資訊,這一個訊息有可能為帶註解標籤內容或者 commit 訊息內容,這邊請記住一個原則,此訊息內容優先選擇帶註解標籤內容,如為輕量標籤則顯示 commit 訊息內容。

到這邊已經完成對輕量標籤與帶註解標籤的相關操作了,其實你真的不用想得太複雜,分支的指令與標籤的指令真得幾乎一模一樣,比如說等等會介紹的刪除標籤,其實你應該也猜得出來指令是什麼了,讓我們繼續看下去。

刪除標籤

刪除標籤並沒有分所謂的輕量標籤或帶註解標籤,通通一視同仁,使用以下指令刪除標籤:

1
git tag -d 0.9.0

此時會跳出標籤已被刪除的提示:

git tag -d

讓我們來看目前日誌:

查看目前 commit 紀錄-5

確實 v0.9.0 標籤被我們刪除了,在標籤刪除的操作中,並沒有像分支有分所謂的 -d-D,畢竟標籤就只是單純的黏貼作用,隨時都可以取代。

以上就是標籤在本地端的相關操作,接下來進入到重頭戲將標籤推至遠端數據庫的部分。

遠端標籤相關操作

請先至 GitHub 開一個遠端數據庫並將本地內容 Push 上去:

1
2
3
git remote add origin git@github.com:awdr74100/tag-demo.git

git push -u origin --all

此時的狀態為:

查看目前 commit 紀錄-6

讓我們來看 GitHub 中的 releases 頁面是否有本地的 Tag 標籤:

GitHub reslease

放心,沒有是很正常的,git push 預設是不會把標籤連同 Push 上去的,得另外使用以下指令:

  • 指定標籤上傳至遠端數據庫:
1
git push origin v1.0.0
  • 全部標籤上傳至遠端數據庫:
1
git push origin --tags

此時會提示遠端新增了本地 Push 上去的分支:

git push origin --tags

查看 GitHub Releases 頁面是否成功提交:

GitHub Releases

大功告成!事實上,本地標籤是被推至 GitHub 中的 Tag 頁面,Releases 頁面是 GitHub 的高級功能,你可以針對這一個版本寫些內容,如下所示:

Tags > Create release

Create release

是不是很酷?以後你也可以發行自己的版本囉,這邊再補充幾個指令:

  • 刪除遠端標籤
1
git push origin :v0.8.1
  • 刪除遠端標籤 (v1.7 以後版本可使用)
1
git push --delete origin v0.8.1

遠端標籤刪除的命令與分支也是幾乎一樣,Push 一個空的標籤即可,在較新的 Git 版本,你也可以使用 --delete 參數刪除標籤。但這邊要注意,如果存在同名的分支或標籤,Git 會因為不知道選擇哪個而跳錯,解決辦法也很簡單,使用以下命令:

  • 刪除遠端標籤 (明確命令):
1
git push origin :refs/tags/<remote_tag>
  • 刪除遠端分支 (明確命令):
1
git push origin :refs/heads/<remote_branch>

雖然說一般人不太可能把分支名取作 v0.8.1,但這邊還是稍微注意一下比較好。

這邊再做最後一個補充:

1
git clone git@github.com:awdr74100/tag-demo.git tag-demo-copy

標籤不需要像分支得透過 git checkout -t origin/<remote_branch> 才能在本地使用遠端分支,克隆的同時,就已經把全部標籤取回本地了。

標籤與分支差異

跑過一次上面的流程,相信各位差不多了解標籤的使用了,讓我們回到重點,標籤與分支何謂本質上的差異,先讓我們來看目前的日誌:

查看目前 commit 紀錄-7

新增一個分支並提交一次 commit 紀錄:

1
2
3
4
5
6
7
git checkout -b develop

touch db.json

git add .

git commit -m 'add db.json'

查看目前日誌:

查看目前 commit 紀錄-8

發現差別了嗎?分支會隨著 commit 而移動,標籤只會停留在當時黏貼的位置,就是這麼簡單,沒有其他差異了,兩者都是貼紙一般的存在,你想要怎麼撕怎麼貼,隨你開心。

實務上,分支會使用在特定部分的開發,而標籤則是使用在特定版本的標記。

Git 指令回顧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 新增標籤 (輕量標籤)
git tag <tag_name>

# 指定節點新增標籤 (輕量標籤)
git tag <tag_name> <SHA-1>

# 新增標籤 (帶註解標籤)
git tag <tag_name> -am 'message'

# 指定節點新增標籤 (帶註解標籤)
git tag <tag_name> <SHA-1> -am 'message'

# 指定節點新增標籤 (同上)
git tag <tag_name> <SHA-1> -a -m 'message'

# 顯示提交版本異動
git show

# 顯示提交版本異動 (標籤示範)
git show <tag_name>

# 顯示所有標籤
git tag

# 顯示所有標籤及資訊 (優先顯示帶註解標籤內容,輕量標籤則顯示 commit 訊息內容)
git tag -n

# 刪除指定標籤
git tag -d <tag_name>

# 指定標籤上傳至遠端數據庫
git push <repo_name> <tag_name>

# 全部標籤上傳至遠端數據庫
git push <repo_name> --tags

# 刪除遠端標籤
git push <repo_name> :<remote_tag>

# 刪除遠端標籤 (v1.7 以後版本可使用)
git push --delete <repo_name> <remote_tag>

# 刪除遠端標籤 (明確命令)
git push <repo_name> :refs/tags/<remote_tag>

# 刪除遠端分支 (明確命令)
git push <repo_name> :refs/heads/<remote_branch>