"春風得意馬蹄疾,一日看盡長安花",對於項目也是如此,最值得期待的恐怕就要數新版本發布的時刻了吧?每當發布新版本時要么是版本號命名(比如v0.0.1
)或者代號命名(比如Chelsea
),不管怎么說這種里程碑階段總是要留下些許紀念意義.
既然想要紀念這種特殊的歷史時刻,自然是希望它能夠固定下來,不要發生隨意移動,產生不可預期后果.
這種需求其實和我們前面說的分支概念很相似,均是源於特殊的版本號,逐漸收集起一系列版本,最終形成一條相對獨立的歷史線,但分支並不是實現里程碑概念的最佳選擇,為什么?
分支適合多人協作開發時互不影響,適當時機主動合並他人工作成果這種模式,而這種模式是由不同的功能模塊進行驅動的,正所謂"天下大勢分久必合,合久必分",當功能模塊開發完畢后自然也就沒有分支存在的必要性,更何況分支在收集版本的過程中會一直移動,並沒有特殊的固定版本,顯然分支不是最佳選擇!
但是,分支確定一定程度上和里程碑概念很相似,源於特定版本,自主命名,收集版本等,那么何必重頭再來,為何不復用已有概念呢?
實際上,git
中的標簽(tag
) 就是實現里程碑概念的方式,它可以永久性指向特定的提交並將命名,然后就可以將其理解成分支一樣引用了!
但標簽(tag
)不是分支(branch
),標簽是一個點的話,分支就是若干點連接而成的線,標簽是靜態的,分支是動態的,標簽是只讀的,分只是可讀可寫的.
創建標簽 git tag <tag>
# 方式一: 默認 `HEAD` 指向的版本
git tag v0.0.1
# 方式二: 指定 `commit_id` 表示的版本
git tag v0.0.2 f971647
# 方式三: 指定 `commit_id` 表示的版本,同時創建標簽說明信息
git tag -a v0.0.3 -m "v0.0.3" f971647
列出標簽 git tag
git tag
顯示標簽 git show <tag>
git show v0.0.1
刪除標簽 git tag -d <tag>
git tag -d v0.0.1
推送標簽 git push origin <tag>
git push origin v0.0.1
推送全部標簽 git push origin --tags
git push origin --tags
刪除遠程標簽 git tag -d <tag>
git push origin :refs/tags/<tag>
# 刪除本地標簽
git tag -d v0.0.1
# 推送刪除標簽(刪除也是推送)
git push origin :refs/tags/v0.0.1