正文開始以前,我想咱們須要弄明白幾個問題:git
1.tag 是什麼?
2.使用tag 的好處?
3.tag 和 branch 的區別以及使用場景?ruby
tag 是什麼?
tag , 翻譯過來是標籤的意思,顧名思義,標籤是爲了標記某種事物。
tag 是 Git 版本庫的一個快照,指向某個 commit 的指針。ui
使用tag 的好處?
tag 的存在,是由於咱們須要這種標記的功能。目前的項目開發中,當發佈版本時 tag 就派上用場了。例如 v1.0.1,v1.0.2…
另外,git 提供了 tag 的增刪改查一系列操做,在 tag 的使用上,可謂很是之方便。spa
tag 和 branch 的區別以及使用場景?
想到這裏,你可能以爲 tag 和 branch 有點類似。沒錯,的確是有點像,可是它們的職責分工和本質都是不一樣的。
tag 對應某次 commit, 是一個點,是不可移動的。
branch 對應一系列 commit,是不少點連成的一根線,有一個HEAD 指針,是能夠依靠 HEAD 指針移動的。.net
因此,二者的區別決定了使用方式,改動代碼用 branch ,不改動只查看用 tag。翻譯
tag 和 branch 的相互配合使用,有時候起到很是方便的效果,例如 已經發布了 v1.0 v2.0 v3.0 三個版本,這個時候,我忽然想不改現有代碼的前提下,在 v2.0 的基礎上加個新功能,做爲 v4.0 發佈。就能夠 檢出 v2.0 的代碼做爲一個 branch ,而後做爲開發分支。指針
如下命令都是我使用 tag 過程當中通常會使用到的,能夠說都是經常使用命令。code
須要說明的是,建立 tag 是基於本地分支的 commit,並且與分支的推送是兩回事,就是說分支已經推送到遠程了,可是你的 tag 並無,若是把 tag 推送到遠程分支上,須要另外執行 tag 的推送命令。regexp
git tag <tagName> //建立本地tag git push origin <tagName> //推送到遠程倉庫
若存在不少未推送的本地標籤,你想一次所有推送的話,可使用一下的命令:xml
git push origin --tags
以上是基於本地當前分支的最後的一個 commit 建立的 tag ,可是若是不想以最後一個,只想以某一個特定的提交爲 tag ,也是能夠的,只要你知道 commit 的 id。
git log --pretty=oneline //查看當前分支的提交歷史,裏面包含 commit id git tag -a <tagName> <commitId>
查看本地某個 tag 的詳細信息:
git show <tagName>
查看本地全部 tag :
//下面兩個命令均可以 git tag git tag -l
查看遠程全部 tag:
git ls-remote --tags origin
本地 tag 的刪除:
git tag -d <tagName>
遠程 tag 的刪除:
git push origin :<tagName>
這個本質上是刪除掉舊名字 tag ,而後再新建新名字 tag ,而後實現重命名的做用。
若是 tag 只存在本地,那麼只須要刪除本地的舊名字 tag ,而後新建新名字 tag:
git tag -d <oldTagName> git tag <newTagName> git push origin <newTagName> //推送到遠程倉庫
若已經推送到遠程了,那麼不只要刪除本地的,還要刪除遠程的,再從新建立和推送:
git tag -d <oldTagName>
git push origin :<oldTagName> git tag <newTagName> git push origin <newTagName> //推送到遠程倉庫
命令以下:
git checkout -b <branchName> <tagName>
由於 tag 自己指向的就是一個 commit,因此和根據 commit id 檢出分支是一個道理。 可是須要特別說明的是,若是咱們想要修改 tag 檢出代碼分支,那麼雖然分支中的代碼改變了,可是 tag 標記的 commit 仍是同一個,標記的代碼是不會變的,這個要格外的注意。