[Git] tag 操作

一個專案如果 commit 了 N 次,就算 commit message 寫得很完整,如果要很快的找到特定版本也是有點困難。

利用 git tag 幫 commit 加入標籤,操作上就更方便迅速。

 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
# 列出所有標籤
git tag

# 新增一個標籤,名稱為 my-tag
git tag my-tag

# 如果要自訂註解,可以利用參數 -m,沒有加 -m 的話預設會以 HEAD (當前版本) commit message 為標籤的 message
git tag my-tag -m "My tag message."

# 如果要寫多行註解,可以利用參數 -a 開啟編輯器編寫
git tag -a my-tag

# 從指定標籤開一個新 branch
git branch new-branch my-tag

# 查看標籤詳細資料
git show my-tag

# 針對指定 commit 做標籤
git tag my-tag d3a0dcb

# push 指定標籤 (多個標籤以空白隔開)
git push origin my-tag

# push 所有 tag
git push --tags

# 刪除本機端指定標籤 (多個標籤以空白隔開)
git tag -d my-tag

# 刪除本機端所有標籤
git tag | xargs git tag -d

# 刪除遠端指定標籤 (多個標籤以空白隔開,但是每個標籤前面都要加上 :refs/tags/)
git push origin :refs/tags/my-tag

 

有關 Tag update:

在更新本機標籤時需要使用 git fetch,而不是 git pull

git remote update 雖然會把新的標籤拉下來

但是若兩端皆存在相同名稱的標籤,且遠端版本較新時

git remote update 並不會更新本機標籤

由於標籤和 branch 性質不相同,如果要更新標籤,需要在強制模式 (參數 --force) 下執行 (除了 fetch)

以下為更新標籤的操作方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 覆寫標籤 (以當前 branch 最後一次的 commit 寫入)
git tag -f my-tag

# 覆寫遠端指定標籤 (多個標籤以空白隔開)
git push -f --follow-tags origin my-tag

# 覆寫遠端所有標籤 (本機端不存在的標籤不會覆寫上去)
git push -f --tags

# 從遠端覆寫本機端所有標籤 (遠端不存在的標籤不會被覆寫)
git fetch --tags

 

為標籤重新命名:

Git 本身並沒有辦法讓標籤直接重新命名

因此需要用建立新標籤 + 移除舊標籤的方式達成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 使用 old-tag 的 commit 建立新標籤 new-tag
git tag new-tag old-tag

# 刪除本機端舊標籤
git tag -d old-tag

# 刪除遠端舊標籤
git push origin :refs/tags/old-tag

# 上傳新標籤
git push origin new-tag

 

如果專案有多人協作

請通知你的夥伴們執行 git pull --prune --tags

否則舊標籤仍然會存在於他們的電腦上

且他們在 push 時就很有可能又把舊標籤 push 上去


Reference: git tag - How do you rename a Git tag? - Stack Overflow

Licensed under CC BY-NC-SA 3.0 TW
comments powered by Disqus