【Git】git pushでリモートレポジトリにタグがプッシュ(同期・反映)されないときの対処法|エラー対処法:Updates were rejected because the tag already exists in the remote

github-prograshi(プロぐらし)-kv git/github
記事内に広告が含まれていることがあります。

Gitにはコミット履歴に目印となるタグをつけることができます。

しかし、ローカル環境でタグを設定したのに、git pushしてもリモートレポジトリにタグが反映されないということが発生します。

ここではその理由(原因)と対処法についてまとめています。

また「Updates were rejected because the tag already exists in the remote」というエラーが発生したときの対処法についてもまとめています。


git pushでタグがプッシュされない理由(原因)

タグは便利なようにローカルレポジトリとリモートレポジトリで使い分けられるようになっています

ローカルレポジトリだけで使うタグや、リモートレポジトリに適用するタグを使い分けられるということです。

このため、通常のgit pushでローカルレポジトリ専用のタグが他の人と共同でつかうリモートレポジトリに反映されないようになっています

リモートレポジトリにタグを反映するためには専用のオプションをつけたり、専用の記述をする必要があります。


リモートレポジトリにタグをプッシュ(反映)する方法

リモートレポジトリ(Github)でタグを使う場合は注意が必要です。

通常の git pushコマンドでは、タグは送信されません。(個人用の目印の全体共有を防ぐため)

リモートレポジトリにタグを送る場合は以下の2つの方法があります。

リモートレポジトリにタグをプッシュする方法
  1. すべてのタグをプッシュする。(–tagオプション)
  2. 指定したタグのみをプッシュする。
git push <リモートレポジトリ名> --tag
git push <リモートレポジトリ名> <タグ名>

以下で実例を交えて解説しています。

すべてのタグをプッシュする方法

ローカルレポジトリにある全てのタグをリモートレポジトリにプッシュするには–tagオプションを使います。

git push <リモートレポジトリ名> --tag


実例

git push --tagを実行すると、以下のようにタグがまとめてリモートレポジトリにプッシュされます。

$ git push --tag
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/xxxxx/yyyyy.git
 * [new tag]         MyOriginalTag -> MyOriginalTag
 * [new tag]         NewTag -> NewTag
 * [new tag]         v4.0 -> v4.0


指定したタグのみをプッシュする方法

ローカルレポジトリにあるタグのうち、指定したタグのみをリモートレポジトリにプッシュするにはタグ名を指定します。

git push <リモートレポジトリ名> <タグ名>

複数指定する場合は、タグ名の後ろにスペースを開けて他のタグ名を指定します。

git push <リモートレポジトリ名> <タグ名1> <タグ名2> <タグ名3>,,,,,

実例

例えば以下のようなタグ状態のリモートレポジトリがあるとします。

ここに、新しいタグとして「v2.0」「v2.1」「v3.0」の3つだけをプッシュする場合は以下のようにします。

$ git push origin v2.0 v2.1 v3.0
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/shizen-shin/rails-aa.git
 * [new tag]         v2.0 -> v2.0
 * [new tag]         v2.1 -> v2.1
 * [new tag]         v3.0 -> v3.0

Githubのリモートレポジトリを確認するとプッシュしたタグのみが反映されていることがわかります。


エラー対処法:Updates were rejected because the tag already exists in the remote

リモートレポジトリにタグをプッシュしたときに次のようなエラーが発生することがあります。

Updates were rejected because the tag already exists in the remote

これは、送信しようとしているタグがリモートレポジトリ上の他のコミットで既に使われている場合に発生するエラーです。

このときの主な対処法は3つあります。

対処法
  1. ローカルレポジトリの重複しているタグを削除する。
  2. ローカルレポジトリの重複しているタグ名を変更する。
  3. リモートレポジトリのタグを削除する。


ローカルレポジトリの重複しているタグを削除する

以下のコマンドを実行します。

git tag -d <タグ名>


ローカルレポジトリの重複しているタグ名を変更する

既存のタグ名を変更したいときは、元のタグを削除して、新たにタグをつけます

コミット番号で指定するよりもタグ名でコミットを指定した方がわかりやすいので、先に新しタグ名を割り振ってから、古いタグ名を削除するのがお勧めです。

#タグの作成
git tag <新しいタグ名> <古いタグ名>
#タグの削除
git tag -d <古いタグ名>


リモートレポジトリのタグを削除する

以下のコマンドを実行します。

$ git push <リモートレポジトリ名> -d <タグ名>

参考としてリモートレポジトリのタグを削除する方法についても下記にまとめておきます。


リモートレポジトリのタグを削除する方法

ローカルのタグを削除しただけではリモートレポジトリのタグは削除されません。

リモートレポジトリに存在するタグを削除したい場合は、削除する内容をプッシュする必要があります。

$ 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 log –decorateとは何か?参照名(ref name)とは何かについて実例で解説


実例

例えばリモートレポジトリに以下のようにタグがあるとします。

「:」を使って指定する方法の場合は以下のようになります。

$ 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で確認するとタグが削除されていることがわかります。


タイトルとURLをコピーしました