面向工资编程,面向面试学习!

Git 标签

像其他版本控制系统(VCS)一样,Git 可以给历史中的某一个提交打上标签。 比较有代表性的是人们会使用这个功能来标记发布版本(v1.0 等等)。 在本节中,你将会学习如何列出已有的标签、如何创建新标签、以及不同类型的标签分别是什么。

列出标签

git tag 命令可以列出仓库下所有的标签,我们克隆下 git 源码仓库,然后运行下这个命令:

git clone https://github.com/git/git
cd git
git tag
gitgui-0.10.0
gitgui-0.10.1
gitgui-0.10.2
...

git tag 命令以字母顺序列出标签。

你也可以使用特定的模式查找标签。 例如,我们查找下 Git 源代码仓库下标签 v1.2 系列感兴趣,可以运行:

git tag -l 'v1.2*'
v1.2.0
v1.2.1
v1.2.2
v1.2.3
v1.2.4
v1.2.5
v1.2.6

创建标签

Git 有两种类型的标签:轻量标签(lightweight)与附注标签(annotated)。
一个轻量标签很像一个不会改变的分支——它只是一个特定提交的引用。
然而,附注标签是存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。 通常建议创建附注标签,这样你可以拥有以上所有信息;但是如果你只是想用一个临时的标签,或者因为某些原因不想要保存那些信息,轻量标签也是可用的。

附注标签

使用 git tag -a 命令就可以创建一个附注标签,我们在 git_tutorial 仓库中创建一个附注标签:

git tag -a v1.0 -m "version 1.0"
git tag
v1.0

-m 选项指定了一条将会存储在标签中的信息。 如果没有为附注标签指定一条信息,Git 会运行编辑器要求你输入信息。

通过 git show 命令可以看到标签信息与对应的提交信息:

git show v1.0
tag v1.0
Tagger: moon 
Date:   Sat Dec 14 16:15:06 2019 +0800

version 1.0

commit a5c4e044f3c577f0d9e6815d7296823436a05ce5 (HEAD -> master, tag: v1.0, origin/master, origin/HEAD)
Author: foxchenxi <58800545+foxchenxi@users.noreply.github.com>
Date:   Sat Dec 14 11:40:08 2019 +0800

    Update and rename README to README.md

diff --git a/README b/README.md
similarity index 64%
rename from README
rename to README.md
index b3611bb..b9bb6ce 100644
--- a/README
+++ b/README.md
@@ -3,4 +3,7 @@
 git init 初始化 git 仓库  
 git clone 克隆仓库  
 git status 查看文件状态信息  
-git add 可以用它来跟踪新文件,或者把已修改状态的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等  
\ No newline at end of file
+git add 可以用它来跟踪新文件,或者把已修改状态的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等  
+git commit 提交暂存区的数据到本地仓库  
+git fetch 拉取远程仓库中的数据  
+git merge 合并分支  

输出显示了打标签者的信息、打标签的日期时间、附注信息,然后显示具体的提交信息。

轻量标签

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

git tag v1.1-1qw
git tag
v1.0
v1.1-1qw

如果在轻量标签上运行 git show,你不会看到额外的标签信息。 命令只会显示出提交信息:

git show v1.1-1qw
commit a5c4e044f3c577f0d9e6815d7296823436a05ce5 (HEAD -> master, tag: v1.1-1qw, tag: v1.0, origin/master, origin/HEAD)
Author: foxchenxi <58800545+foxchenxi@users.noreply.github.com>
Date:   Sat Dec 14 11:40:08 2019 +0800

    Update and rename README to README.md

diff --git a/README b/README.md
similarity index 64%
rename from README
rename to README.md
index b3611bb..b9bb6ce 100644
--- a/README
+++ b/README.md
@@ -3,4 +3,7 @@
 git init 初始化 git 仓库  
 git clone 克隆仓库  
 git status 查看文件状态信息  
-git add 可以用它来跟踪新文件,或者把已修改状态的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等  
\ No newline at end of file
+git add 可以用它来跟踪新文件,或者把已修改状态的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等  
+git commit 提交暂存区的数据到本地仓库  
+git fetch 拉取远程仓库中的数据  
+git merge 合并分支  

后期打标签

你也可以对过去的提交打标签,在 git_tutorial 仓库中运行 git log 查看提交历史:

git log --pretty=oneline
a5c4e044f3c577f0d9e6815d7296823436a05ce5 (HEAD -> master, tag: v1.1-1qw, tag: v1.0, origin/master, origin/HEAD) Update and rename README to README.md
4eb29c7ec886eb933e0f991a39eaaf33196f5906 git log
c96425a7f71eba7c6d0d773d34000908b5ed3c78 git commit
8d82f8a765753484e1f52a097b3ff3aa76ebc499 chang file name
42857554ede87f2cbd42f5204f4a894b00d8f516 delete delete_file.txt
91aa8f98ff965e8c8e12f354ab1d5887232b49f2 add delete_file.txt
8fb8a5d87567ffe294a02c054827eeb6f052b742 git clone, git init
8df7953d64d70794793a8ec07048231aa867bad0 git init , git clone
dbca6fc78045cdc4c01fbceebc43b4314e667971 .gitignore, git add, git status
323a07a2cea931e9e99594a78b1f5bc06ce6e170 first commit

我们给 “add delete_file.txt” 的提交打上标签。 要在哪个个提交上打标签,你需要在命令的末尾指定提交的校验和(或部分校验和):

git tag -a v0.5 428575 -m "version 0.5"
git tag
v0.5
v1.0
v1.1-1qw

共享标签

默认情况下,git push 命令并不会推送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到远程服务器上。 这个过程就像推送远程分支一样——你可以运行 git push origin [tagname]。

git push origin v0.5
Counting objects: 1, done.
Writing objects: 100% (1/1), 158 bytes | 158.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To my.github.com:foxchenxi/git_tutorial_cn.git
 * [new tag]         v0.5 -> v0.5

如果想批量推送很多标签,也可以使用带有 --tags 选项的 git push 命令。 这将会把所有不在远程仓库服务器上的标签全部传送到那里。

git push origin --tags

删除标签

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

git tag -d v1.1-1qw
Deleted tag 'v1.1-1qw' (was a5c4e04)

上面的命令并不会从远程仓库中移除这个标签,你必须使用 git push :refs/tags/ 来删除远程仓库中的标签:

git push origin :refs/tags/v1.1-1qw
To github.com:foxchenxi/git_tutorial_cn.git
 - [deleted]         v1.1-1qw

检出标签

如果你想查看某个标签所指向的文件版本,可以使用 git checkout 命令,这会使你的仓库处于“分离头指针(detacthed HEAD)”状态——这个状态有些不好的副作用:

git checkout v0.5
Note: checking out 'v0.5'.

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 

HEAD is now at 4285755 delete delete_file.txt

提示信息告诉我们当前处于“分离头”状态,进行实验更改并提交,您可以放弃在此所做的任何提交状态,而不会通过执行另一个提交来影响任何分支。 如果您想保留您的提交,可以创建一个新分支来保留您创建的提交,则可以(现在或以后)通过将-b与checkout命令结合使用。

git checkout -b version05 v0.5
Switched to a new branch 'version05'