-
1. 起步
-
2. Git 基礎
-
3. Git 分支
-
4. 伺服器上的 Git
- 4.1 協議
- 4.2 在伺服器上部署 Git
- 4.3 生成 SSH 公鑰
- 4.4 架設伺服器
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方託管服務
- 4.10 小結
-
5. 分散式 Git
-
A1. 附錄 A: Git 在其他環境
- A1.1 圖形介面
- A1.2 Visual Studio 中的 Git
- A1.3 Visual Studio Code 中的 Git
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的 Git
- A1.5 Sublime Text 中的 Git
- A1.6 Bash 中的 Git
- A1.7 Zsh 中的 Git
- A1.8 PowerShell 中的 Git
- A1.9 小結
-
A2. 附錄 B: 在應用程式中嵌入 Git
-
A3. 附錄 C: Git 命令
2.6 Git 基礎 - 標記
標記
像大多數版本控制系統一樣,Git 能夠將倉庫歷史中的特定點標記為重要。通常,人們使用此功能來標記釋出點 (v1.0, v2.0 等)。在本節中,您將學習如何列出現有標記、如何建立和刪除標記,以及不同型別的標記。
列出您的標記
在 Git 中列出現有標記非常簡單。只需鍵入 git tag (可選 -l 或 --list)
$ git tag
v1.0
v2.0
此命令按字母順序列表標記;顯示的順序沒有實際重要性。
您還可以搜尋與特定模式匹配的標記。例如,Git 原始碼倉庫包含 500 多個標記。如果您只對檢視 1.8.5 系列感興趣,可以執行此命令
$ git tag -l "v1.8.5*"
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5
|
注意
|
列出標記萬用字元需要
-l 或 --list 選項如果您只想獲取完整的標記列表,執行 但是,如果您提供了一個萬用字元模式來匹配標記名稱,則必須使用 |
建立標記
Git 支援兩種型別的標記:輕量級和註釋型。
輕量級標記非常像一個不變的分支 — 它只是一個指向特定提交的指標。
然而,註釋型標記作為完整的物件儲存在 Git 資料庫中。它們經過校驗和處理;包含標記者的姓名、電子郵件和日期;帶有標記訊息;並且可以由 GNU Privacy Guard (GPG) 進行簽名和驗證。通常建議建立註釋型標記,以便您擁有所有這些資訊;但是,如果您想要一個臨時標記,或者由於某些原因不想保留其他資訊,也可以使用輕量級標記。
註釋型標記
在 Git 中建立註釋型標記很簡單。最簡單的方法是在執行 tag 命令時指定 -a
$ git tag -a v1.4 -m "my version 1.4"
$ git tag
v0.1
v1.3
v1.4
-m 指定一個標記訊息,該訊息與標記一起儲存。如果您沒有為註釋型標記指定訊息,Git 會啟動您的編輯器,以便您可以輸入它。
您可以使用 git show 命令檢視標記資料以及被標記的提交
$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date: Sat May 3 20:19:12 2014 -0700
my version 1.4
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
這會顯示標記者的資訊、標記提交的日期以及註釋訊息,然後顯示提交資訊。
輕量級標記
另一種標記提交的方式是使用輕量級標記。這基本上是將提交的校驗和儲存在一個檔案中 — 沒有保留其他資訊。要建立輕量級標記,請不要提供任何 -a、-s 或 -m 選項,只需提供一個標記名稱
$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5
這次,如果您對標記執行 git show,您不會看到額外的標記資訊。該命令只顯示提交
$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number
稍後標記
您也可以在提交之後標記它們。假設您的提交歷史如下所示
$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 Create write support
0d52aaab4479697da7686c15f77a3d64d9165190 One more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc Add commit function
4682c3261057305bdd616e23b64b0857d832627b Add todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a Create write support
9fceb02d0ae598e95dc970b74767f19372d61af8 Update rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc Commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a Update readme
現在,假設您忘記在 v1.2 處標記專案,而 v1.2 位於“更新 rakefile”提交處。您可以在事後新增它。要標記該提交,請在命令末尾指定提交校驗和 (或其一部分)
$ git tag -a v1.2 9fceb02
您可以看到您已經標記了該提交
$ git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5
$ git show v1.2
tag v1.2
Tagger: Scott Chacon <schacon@gee-mail.com>
Date: Mon Feb 9 15:32:16 2009 -0800
version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <mchacon@gee-mail.com>
Date: Sun Apr 27 20:43:35 2008 -0700
Update rakefile
...
共享標記
預設情況下,git push 命令不會將標記傳輸到遠端伺服器。您必須在建立標記後顯式地將它們推送到共享伺服器。這個過程就像共享遠端分支一樣 — 您可以執行 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 git@github.com:schacon/simplegit.git
* [new tag] v1.5 -> v1.5
如果您有很多標記想一次性推送,您也可以使用 git push 命令的 --tags 選項。這將把所有尚未在遠端伺服器上的標記傳輸到遠端伺服器。
$ 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 git@github.com:schacon/simplegit.git
* [new tag] v1.4 -> v1.4
* [new tag] v1.4-lw -> v1.4-lw
現在,當其他人克隆或從您的倉庫拉取時,他們也會獲得您所有的標記。
|
注意
|
git push 推送兩種型別的標記
|
刪除標記
要刪除本地倉庫中的標記,您可以使用 git tag -d <tagname>。例如,我們可以像下面這樣移除我們上面的輕量級標記
$ git tag -d v1.4-lw
Deleted tag 'v1.4-lw' (was e7d5add)
請注意,這並不會從任何遠端伺服器中刪除標記。有兩種常見的刪除遠端伺服器上標記的方法。
第一種方法是 git push <remote> :refs/tags/<tagname>
$ git push origin :refs/tags/v1.4-lw
To /git@github.com:schacon/simplegit.git
- [deleted] v1.4-lw
可以這樣理解上面的命令:將冒號前的空值推送到遠端標記名稱,從而有效地刪除它。
第二種(也更直觀)的刪除遠端標記的方法是使用
$ git push origin --delete <tagname>
檢出標記
如果您想檢視標記指向的檔案版本,您可以檢出該標記,儘管這會將您的倉庫置於“分離 HEAD”狀態,這會帶來一些不良副作用
$ git checkout v2.0.0
Note: switching to 'v2.0.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 performing another checkout.
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 99ada87... Merge pull request #89 from schacon/appendix-final
$ git checkout v2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... Add atlas.json and cover image
在“分離 HEAD”狀態下,如果您進行更改然後建立一個提交,標記將保持不變,但您的新提交將不屬於任何分支,並且除了透過確切的提交雜湊之外將無法訪問。因此,如果您需要進行更改 — 例如,假設您正在修復舊版本上的錯誤 — 您通常會想要建立一個分支
$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'
如果您這樣做並進行提交,您的 version2 分支將與您的 v2.0.0 標記略有不同,因為它會隨著您的新更改而向前推進,所以請小心。