git tagコマンドを使うと各コミットに目印となるタグを設定することができます。
ですが、タグを付け間違えたり、間違えてリモートレポジトリに送信してしまったりということが発生します。
ローカルレポジトリのタグを削除したのに、リモートレポジトリのタグが削除されない。あるいは、ローカルレポジトリのタグを削除したのに、git fetchやgit pullしたらまたタグが同期されてしまったということもあります。
そういった場合に、ローカルレポジトリとリモートレポジトリのそれぞれでタグを削除する方法について実例を交えて解説しています。
ローカルレポジトリのタグを削除する方法
ローカルレポジトリのタグを削除する場合はgit tagコマンドで-dオプションを使います。dはdeleteの略です。
git tag -d <タグ名>
スペースを開けて複数のタグを指定すれば、まとめて削除することができます。
git tag -d <タグ名1> <タグ名2>,,,,
削除したのはローカルレポジトリのタグのみで、リモートレポジトリのタグは残っています。
リモートレポジトリのタグを消す場合は、別途、git push <リモートレポジトリ名> -d <タグ名>
を実行する必要があります。
実例:1つのタグを指定して削除
例えばタグ名「v0.1」を削除する場合は以下のようになります。
$ git tag -d v0.1
Deleted tag 'v0.1' (was 8ca0a7b)
実例:複数のタグを指定して削除
例えばタグ名「v0.2」「マイtag2」という複数のタグを削除する場合は以下のようになります。
$ git tag -d v0.2 マイtag2
Deleted tag 'v0.2' (was 788eae0)
Deleted tag 'マイtag2' (was a90d4ef)
存在しないタグを指定するとエラーになる
既に削除したタグなど、存在しないタグを指定するとエラーになります。
$ git tag -d v0.2
error: tag 'v0.2' not found.
リモートレポジトリのタグを削除する方法
ローカルのタグを削除しただけではリモートレポジトリのタグは削除されません。
リモートレポジトリに存在するタグを削除したい場合は、削除する内容をプッシュする必要があります。
$ git push <リモートレポジトリ名> -d <タグ名>
削除したのはリモートレポジトリのタグのみで、ローカルのタグは残っています。
ローカルのタグを消す場合は、別途、git tag -d <タグ名>
を実行する必要があります。
実例
例えばリモートレポジトリに以下のようにタグがあるとします。

ここから、タグ「v4.0」を削除する場合は以下のようにします。
$ git push origin -d v4.0
To https://github.com/xxxxx/yyyyy.git
- [deleted] v4.0
Githubで確認するとタグが削除されていることがわかります。

リモートレポジトリのタグを複数まとて削除する方法
リモートレポジトリにあるタグを複数まとめて削除したい場合は、-dオプションの後ろでスペースを開けてタグ名を複数記述します。
$ git push <リモートレポジトリ名> -d <タグ名1> <タグ名2>,,,,
実例
以下のようなリモートレポジトリのタグ一覧から「v2.1」と「v2.0」をまとめて削除します。

git push origin -d
でタグ名をまとめて記述します。
$ git push origin -d v2.0 v2.1
To https://github.com/xxxxx/yyyyyy.git
- [deleted] v2.0
- [deleted] v2.1
[deleted]と表示され、指定したタグがまとめて削除されたのがわかります。
リモートレポジトリのタグを確認すると削除が正しく反映されています。

色々な記述(-d, :タグ名, refs/tags/タグ名)の違い
タグを削除するときは、-dオプション以外にも「:タグ名」や「:refs/tags/タグ名」でも同じ処理になります。
$ git push <リモートレポジトリ名> -d <タグ名>
↑↓ 同じ
$ git push <リモートレポジトリ名> :<タグ名>
↑↓ 同じ
$ git push <リモートレポジトリ名> :refs/tags/<タグ名>
「:」というのは「ローカルレポジトリのブランチ:リモートレポジトリのブランチ」のようにローカルとリモートを指定するときに使うものです。ローカルレポジトリを指定しない=空の内容を送る、つまり、削除となります。
refs/tags/タグ名というのはタグ名のフルネームのようなものです。タグ名やブランチ名などを参照名といい通常はrefsなどの接頭語が省略されています。これをフルで記載すると、タグの場合は「refs/tags/タグ名」となります。
参照名やrefsなどの接頭語について詳しく知りたい方は下記をご参考ください。(git log –decorateの説明は飛ばして、参照名と接頭語のところだけ確認ください)
実例
例えばリモートレポジトリに以下のようにタグがあるとします。

「:」を使って指定する方法の場合は以下のようになります。
$ git push origin :v3.0.1
To https://github.com/xxxxx/yyyyy.git
- [deleted] v3.0.1
接頭語も含めたフルネームで指定する場合は以下のようになります。
$ git push origin :refs/tags/v3.0
To https://github.com/xxxxx/yyyyy.git
- [deleted] v3.0
Githubで確認するとタグが削除されていることがわかります。
