Git系列: 轻量标签与附注标签的创建、管理与推送

 


标签标记

像其他版本控制系统(VCS)一样,Git 可以给仓库历史中的某一个提交打上标签,以示重要。

标签标记的的某一次重要的提交。

查看标签

查看已有的标签

$ git tag
v1.0
v2.0

查看标签与对应的提交

git show [tag]

创建标签

Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)。

轻量标签(lightweight)

轻量标签本质上是将提交校验和存储到一个文件中——没有保存任何其他信息。 创建轻量标签,不需要使用 -a-s-m 选项,只需要提供标签名字:

git tag v1.4-lw

附注标签

附注标签是存储在 Git 数据库中的一个完整对象, 它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间, 此外还有一个标签信息,并且可以使用 GNU Privacy Guard (GPG)签名并验证。

git tag -a v1.4 -m "my version 1.4"

给指定的提交打标签

找到指定的标签,找到对应提交的校验和

$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme

指定提交上打标签,你需要在命令的末尾指定提交的校验和(或部分校验和)

git tag -a v1.2 9fceb02
####9fceb02d0ae598e95dc970b74767f19372d61af8 updated 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 [email protected]:schacon/simplegit.git
* [new tag]         v1.5 -> v1.5

推送所有的标签

git push origin --tags

删除标签

要删除掉你本地仓库上的标签,可以使用命令 git tag -d <tagname>。 例如,可以使用以下命令删除一个轻量标签:

$ git tag -d v1.4-lw

注意上述命令并不会从任何远程仓库中移除这个标签

指定标签的检出

切换到指定标签,可以使用 git checkout 命令。会使你的仓库处于“分离头指针(detached HEAD)”的状态——这个状态有些不好的副作用

$ git checkout 2.0.0
Note: checking out '2.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 -b with the checkout command again. Example:

git checkout -b <new-branch>

HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final

$ git check
out 2.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

指定标签的处理方式

工作情形:如果标签出现问题,我们可以在此标签创建新的分支。

注意:不要直接进行检出。

如果我们检出指定标签后,仓库处于“分离头指针(detached HEAD)”的状态——这个状态有些不好的副作用。

因此此方式是错误的。直接检出指定的标签。做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。

正确的标签检出修改处理方式

如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支:

基于指定标签创建一个分支,进行处理并且提交。

$ git checkout -b version2 v2.0.0 ### 根据指定标签创建一个新的分支。如果你作出修改。
Switched to a new branch 'version2'

如果在这之后又进行了一次提交,version2 分支就会因为这个改动向前移动, 此时它就会和 v2.0.0 标签稍微有些不同,这时就要当心了。

解释

[1] “分离头指针”(detached HEAD)是 Git 中的一种状态,表示当前你所检出的不是一个分支(branch),而是一个具体的提交(commit),比如某个提交的哈希值或 tag。

发表评论

后一页 前一页