【學了就忘】Git操作 — 53.標籤tag(二)

5、共享標籤

默認情況下,git push 命令並不會傳送標籤到遠程倉庫服務器上。

在創建完標籤後,你必須顯式地(手動)推送標籤到遠程服務器上。

需要將標籤推送到遠程版本庫作爲一個發行版本,可以通過以下兩種方式:

(1)推送本地的指定標籤

這個過程就像共享遠程分支一樣,你可以執行命令: git push origin <tagname>

$ git push origin v1.5
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To [email protected]:schacon/simplegit.git
 * [new tag]         v1.5 -> v1.5

(2)推送本地所有爲推送的標籤

如果想要一次性推送很多標籤,也可以使用帶有 --tags 選項的 git push 命令。

這將會把所有不在遠程倉庫服務器上的標籤全部推送過去。

$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To [email protected]:schacon/simplegit.git
 * [new tag]         v1.4 -> v1.4
 * [new tag]         v1.4-lw -> v1.4-lw

當然其他人從倉庫中克隆或拉取,他們也能得到你的那些標籤。

說明:

  • git push 推送兩種標籤使用 git push <remote> --tags 命令(remote:遠程倉庫)。
  • 推送標籤並不會區分輕量標籤和附註標籤, 沒有選項能夠讓你只選擇一種標籤進行推送。

(3)查看結果

登錄GitHub並打開遠程版本庫頁面,在release中可以查看推送到遠程庫中的標籤,即發行版本。

其他用戶在更新本地版本庫時,同時會將標籤一併更新,然後可以在本地指定標籤版本上,作一個新的分支進行開發,開發完成後再合併到主要分支上,最後將該分支刪除。

6、刪除標籤

(1)刪除本地標籤

要刪除掉本地倉庫上的標籤,可以使用命令 git tag -d <tagname>

例如,可以使用以下命令刪除一個輕量標籤:

$ git tag -d v1.4-lw
Deleted tag 'v1.4-lw' (was e7d5add)

注意上述命令並不會從任何遠程倉庫中移除這個標籤。

(2)刪除遠程標籤

你必須用命令: git push <remote> :refs/tags/<tagname> 來更新你的遠程倉庫。

提示:若要刪除遠程庫中的標籤,首先要刪除本地庫中的該標籤,然後再運行上面的命令。

第一種方式是 git push <remote遠程庫> :refs/tags/<tagname>

$ git push origin :refs/tags/v1.4-lw
To /[email protected]:schacon/simplegit.git
 - [deleted]         v1.4-lw

上面這種操作的含義是,將冒號前面的空值推送到遠程標籤名,從而高效地刪除它。

第二種更直觀的刪除遠程標籤的方式是:

$ git push origin遠程庫 --delete <tagname>

7、修改標籤指定提交的代碼

軟件版本一旦被指定,即標籤一旦與某一commit-id綁定,那麼這個版本(提交)的代碼還能修改嗎?

  • 若將master分支回退到該commit-id,然後再修改代碼,修改完成後再提交,我們會發現該提交代碼修改過了,但該標籤綁定的commit-id並沒有發生變化,即該軟件版本(標籤)指向的代碼仍未修改。(也就是標籤指向的提交沒有改變)

  • 當然,此時我們可以將該標籤刪除,然後再定義一個同名標籤,與修改過代碼的提交進行綁定,這樣也是可以的。

但是如上操作存在一個巨大的風險,我們修改過的代碼是master主分支上的,一旦修改過的代碼出現問題,將可以導致整個代碼出問題。所以,我們一般不會修改master主分支上的代碼。

那應該怎麼辦?

  • Git將標籤定義爲與分支同級別的概念,它不僅是一個提交的別名。
  • Git允許程序員使用分支切換命令git checkout ,將代碼轉向標籤所指定的版本。

小示例:

# 1.查看當前版本庫分支
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git tag
v1.0
v2.0

# 2.切換到v1.0標籤上
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learning_github (master)
$ git checkout v1.0
Note: switching to 'v1.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 69fc420 第二次提交,添加v2版內容

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learning_github ((v1.0))
$

如上,命令執行完畢,系統給出了很多的提示,該提示的總體意思爲:當前處於“分離頭指針”狀態,在該狀態下用戶的任何修改與提交對任何的分支都沒有影響(言外之意是:其修改將不會被保留)。若想要保留修改,則可以通過git checkout -b命令,創建一個新的分支。

這裏特別要注意一點,就是最後一行命令提示符末尾的((v1.0)),說明此時HEAD指針,指向了v1.0標籤。

繼續執行命令:

# 3.執行git checkout -b 命令,是新的提交有分支指向
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learning_github ((v1.0))
$ git checkout -b newbranch
Switched to a new branch 'newbranch'

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learning_github (newbranch)
$

我們可以看到HEAD指針由(v1.0)標籤指向了newbranch分支上。在該新分支上再進行修改提交,然後再合併到master分支,最後再將該分支刪除,此時創建的分支名稱可以隨意。

newbranch分支合併到master分支後,仍需要刪除原標籤,然後再與新的commit-id綁定。所以,生產環境下,一旦標籤定義完成,就不會對標籤進行刪除再綁定。而是會再定義一個新的標籤與新的提交綁定。

8、標籤在.git目錄中的位置

無論是輕量標籤還是附註標籤,他們都會存在在.git/refs/tags目錄中。

# 1.查看.git/refs/tags目錄
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ ll .git/refs/tags/
total 2
-rw-r--r-- 1 L 197121 41  4月 18 17:12 v1.0
-rw-r--r-- 1 L 197121 41  4月 19 20:46 v2.0

# 2.查看v1.0標籤的內容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git cat-file tag v1.0
object b97ccfd5f3e98c12ab9c0fb4ca4b308e6805f7ed
type commit
tag v1.0
tagger sun_wk <[email protected]> 1618737173 +0800

v1.0 里程碑

# 3.查看v1.0標籤內容中object的類型
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git cat-file -t  b97ccfd5f3e98c12
commit
# 我們可以看到object對象的類型是commit對象,
# 是一個提交,所以索引的是一個提交。

# 4.查看V1.0標籤文件中的內容,可以看到也是一個對象的索引
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ cat .git/refs/tags/v1.0
e086427dfe88d8cd370d2f94eaf8610c169a3333

# 5.查看這個對象的類型
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git cat-file -t e086427
tag
# 我們可以查看該對象是一個標籤對象。

# 6.我們也可以通過tag對象的索引值,查看內容,
# 和上邊git cat-file tag v1.0命令顯示的內容是一樣的。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git cat-file -p e086427
object b97ccfd5f3e98c12ab9c0fb4ca4b308e6805f7ed
type commit
tag v1.0
tagger sun_wk <[email protected]> 1618737173 +0800

v1.0 里程碑

總結來說:

  1. Git中的標籤,都會以文件的形式存儲在.git/refs/tags目錄中。
  2. 文件中記錄的是tag標籤的校驗和(索引值)。
  3. 通過索引值或者標籤名可以查看該tag對象的內容。
  4. tag對象的內容就包括他指向的commit。其實tag對象就是對commit對象的一個封裝。

9、本文中所使用到的命令

  • git tag:查看版本庫中的標籤列表。
  • git tag -l "v1.8.5*":查看版本庫中,可匹配的標籤列表。
  • git tag -a 標籤名 -m '說明信息':當前分支最新一次提交打標籤。
  • git tag -a 標籤名 commit-id -m '說明信息':爲之前的提交打標籤。
  • git tag 標籤名:創建輕量標籤。
  • git push 遠程倉庫名 標籤名:推送標籤到遠程倉庫。
  • git push 遠程倉庫名 --tags:推送所有標籤到遠程倉庫。
  • git tag -d 標籤名 :刪除本地版本庫中的標籤。
  • git show 標籤名:擦看標籤的具體信息。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章