# Git Tag 与 Describe

Git tag 常用于发布版本的标注，可以理解为 tag 是对某一次 commit hash 的别名设置。需要注意的是，git tag 的同步与删除，需要显式地指定其名称。

## 1、查看 tag 列表

```
# 列出所有本地 tag
git tag
​
# 过滤出 v2. 开头的 tag
git tag -l 'v2.*'
​
# 使用管道输出 tag 列表，避免进入 visual 模式
git tag | sort -V # gtv
```

## 2、新增 tag

Tag 包含两种，一种是轻量 tag，只设置别名，另外一种为附注 tag，能包含这个 tag 的作者和额外的备注信息。

```
# 创建一个名为 v0.0.1 的轻量 tag
git tag v0.0.1
​
# 创建一个名为 v1.0.0 的附注 tag
git tag -a v1.0.0 -m 'tag description'
​
# 将 tag 推送至远程
git push origin v1.0.0 # ggp v1.0.0
```

## 3、删除 tag

```
# 删除本地 tag
git tag -d v1.0.0
​
# 删除远程 tag
git push origin -d v1.0.0 # gp origin :v1.0.0
```

## 4、语义化版本与 git describe

清晰的 tag 版本信息，不但有助于发布版本的选择和回滚，同时能十分方便的查看到分支的版本提交进度。

```
git describe master --tags
```

假如以上命令输出为：v1.1.0-kaiye-gitbook-2-g51e992f

它表明，本地 master 分支当前 commit hash 为 `51e992f`，距离上一次的 tag 版本 `v1.1.0-kaiye-gitbook` 之间已有 `2` 次提交。

如果需要知道本地与远程最近发布的一次 tag 版本是什么，直接运行 `gdct` 即可。

```
alias gdct='git describe --tags `git rev-list --tags --max-count=1`'
```
