Gitのタグについて（初心者向け）

## はじめに
本記事は駆け出しのiOSエンジニア（初学者）が書いているものになりますので、温かい目で見ていただけると幸いです。
先日、先輩エンジニアから「リモートのタグを整理したからローカルのタグを削除しといて」と言われ、タグって聞いたことあるけどそれって美味しいの？となってしまったので、タグについて調べてみました。その内容を本記事に備忘録として書いています。

## 目次
1. タグを使うと何ができるのか
1. タグの作成
1. タグの削除
1. タグの編集
1. タグをチェックアウトしてブランチを作成
1. タグまでresetして過去の状態へ
1. タグのコマンドまとめ
1. 参考記事

## タグを使うと何ができるのか
特定のコミットにタグをつけることができる。
タグをつけておくことで、タグにチェックアウトできたり、タグまでresetして簡単に過去の状態に戻ることができる。
あと、GitHubだとタグまでのコミットの履歴を確認したり、タグまでのコードをzipでダウンロードできる。
### タグとは
後で確認しやすくするために、コミットに名前を付けるもの
例えば、リリースをした際にタグをつけておくことで、簡単にコミットを遡れるようになる。

タグには2種類あって計量タグと注釈付きタグがある
- 計量タグ
    - 名前を付けれる
- 注釈付きタグ
    - 名前を付けれる
    - コメントを付けれる
    - 署名を付けられる

## タグの作成
### 計量タグの作成
計量タグの作成は以下のコマンドを実行します。
```
$ git tag {tagname}
```
今自分がチェックアウトしているブランチのHEADにtestTag1というタグを付けるには以下のコマンドを実行します。
```
$ git tag testTag1
```
以下のコマンドを実行することでローカルで作成したタグを確認することができます。
先ほど作成したtestTag1というタグが確認できると思います。
```
$ git tag
testTag1
```
作成したタグをリモートに反映するには以下のいずれかのコマンドを実行します。
```
$ git push origin {tagname}
```
or
```
$ git push origin --tags
```
リモートのタグを取得するには以下のコマンドを実行します。
```
git pull --tags
```

### 注釈付きタグの作成
注釈付きタグの作成は以下のコマンドを実行します。
実行後にエディタが起動するので、タグに設定するコメントを入力します。
```
$ git tag -a {tagname}
```
-mオプションを付けることでエディタを起動せずにコメントを入力することもできます。
``` 
$ git tag -am "コメント入力"　{tagName}
```
-nオプションを付けることで、ローカルのタグとコメントを確認することができます。
```
$ git tag -am "コメント" testTag1
$ git tag -n
testTag      コメント
```
作成したタグをリモートに反映するには以下のいずれかのコマンドを実行します。
```
$ git push origin {tagname}
```
or
```
$ git push origin --tags
```
リモートのタグを取得するには以下のコマンドを実行します。
```
git pull --tags
```

## タグの削除
ローカルのタグの削除は以下のコマンドを実行します。
```
$ git tag -d {tagname}
```
リモートのタグの削除は以下のコマンドを実行します。
```
$ git push origin --delete {tagname}
```
リモートで削除されたタグをローカルから削除するためには以下のコマンドを実行します。
※タグは誰かのローカルに残っているとpushされた時に復活する可能性があるので、ローカルのタグを修正した際は周知して消してもらう必要があります。
```
$ git fetch origin --prune 'refs/tags/*:refs/tags/*'
```

## タグの編集
タグの編集は以下の手順でできます。
1. 編集したいタグをコピーして新しいタグを作成
1. 編集前のタグが残ったままなので削除
1. 編集後のタグをリモートに反映
1. 編集前のタグをリモートから削除
```
$ git tag {編集後のタグの名前} {編集前のタグの名前}
$ git tag -d {編集前のタグの名前}
$ git push origin {編集後のタグの名前}
$ git push origin --delete {編集前のタグの名前}
```

## タグをチェックアウトしてブランチを作成
タグの位置でブランチを作成してチェックアウトするには以下のコマンドを実行します。
```
$ git checkout -b {branchname} {tagname}
```

## タグまでresetして過去の状態へ
タグまで状態を戻す場合は以下のコマンドを実行します。
今回はgit resetについての説明はしていませんので、git resetについて分からない方は別で調べてみてください。
```
git reset --hard {tagname}
```

## タグのコマンドまとめ
今自分がチェックアウトしているブランチのHEADに計量タグを付ける
```
$ git tag {tagname}
```

ローカルにあるタグを確認する
```
$ git tag
```

一つのタグをリモートに共有する
```
$ git push origin {tagname}
```

複数のタグをリモートに共有する
```
$ git push origin --tags
```

リモートにあるタグを取得する
```
$ git pull --tags
```

エディタを起動して注釈付きタグを付ける
```
$ git tag -a {tagname}
```

-mオプションで注釈付きタグを付ける
```
$ git tag -am "コメント"　{tagname}
```

ローカルのタグとコメントを確認する
```
$ git tag -n
```

ローカルのタグの削除
```
git tag -d {tagname}
```

リモートのタグを削除
```
git push origin --delete {tagname}
```

リモートで削除されたタグをローカルでまとめて削除
```
$ git fetch origin --prune 'refs/tags/*:refs/tags/*'
```

タグをチェックアウトしてブランチを作成
```
$ git checkout -b {branchname} {tagname}
```

タグまでresetする
```
git reset --hard {tagname}
```

## 参考記事
- https://backlog.com/ja/git-tutorial/stepup/18/
- https://qiita.com/lni_T/items/e5eefbff90de8fdf802b
- https://www.r-staffing.co.jp/engineer/entry/20201120_1
- http://blog.nambo.jp/2014/06/24/git-tag-rename/
- https://qiita.com/y_arakawa/items/3cefb482205f51b16912#%E3%82%BF%E3%82%B0%E6%93%8D%E4%BD%9C