Gitにはコミットにタグ(tag)付けする機能が備わっています。使わなくてもプロジェクトを進めることはできますが、タグを使うとことで管理しやすくなるといったメリットがあります。
ここでは、git tagコマンドでタグを使うメリットや実際の使い方、注意点について実例を踏まえて解説しています。
リモートレポジトリとローカルレポジトリのタグのやりとりについてもまとめています。
タグ付けとは何か?
そもそもGitにおけるタグ付けとは何かというと、特定のコミットに対して、目印となる好きな名前を付けられることです。
よく使われるのはバージョン管理などです。このコミットがv1.0の始まり、このコミットがv2.0の始まりといった節目のコミットにタグ付けをすることで、対象のコミットをとても簡単に見つけ出せるようになります。
もちろんバージョン情報以外にも好きなタグ名をセットできます。
タグを使うメリット&メリットの実例
Gitを使うメリットは特定のコミットを参照するのに非常に役立ちます。
特定のコミットが目立つ
git logでコミット履歴を参照したときに、タグ付けしてある場合、対象のコミットが非常にわかりやすくなります。
実例
$ git log --oneline
0701d9d (HEAD -> aa, tag: v3.0.1) [U]docker-compose add webpack port 3035
a90d4ef [U]content-security-policy(CSP) enable webpack-dev-server
6adca49 (origin/aa) [A]destroyメソッド & Modal追加
61d3b4b (tag: v3.0) [A]ClientEdit.vue
00093d1 [F]ClientNewからClientForm.vueを切り出し
a84cfc5 (tag: v2.1) [A]ClientNew.vue
718eea7 (tag: v2.0) [A]Client.vue
ca60d8a [A]Clients.vue & Top.vue
9861efe (tag: v1.2) [A]vue-router
タグが付いているものは「tag: タグ名」として表示されます。
どのコミットが、v1.2, v2.0, v2.1, v.3.0なのかが一瞬でわかります。
タグの一覧を参照できる
プロジェクトの中でどのようなタグが設定されているか一覧を表示することができます。
$ git tag
v1.2
v2.0
v2.1
v3.0
v3.0.1
コミットメッセージや注釈(設定したある場合のみ)も合わせて一覧表示することもできます。
$ git tag -n
v1.2 [A]vue-router
v2.0 [A]Client.vue
v2.1 [A]ClientNew.vue
v3.0 [A]ClientEdit.vue
v3.0.1 [U]docker-compose add webpack port 3035
このプロジェクトは大きな変化がこれだけあったんだな。というのが一目でわかります。
タグでコミットを参照できる
タグは指定したコミットの別名(エイリアス)のようなものなので、対象のコミットを指定するときにタグ名で指定することができます。
$ git show v1.2
commit 9861efec5cd2eef323667df0dd9f16d261ff4913 (tag: v1.2)
Author: author <example@test.com>
Date: Sat Aug 7 10:30:18 2021 +0900
[A]vue-router
過去のコミットを参照したい場合、git logでコミット番号(ハッシュ値)を探し出し、それを指定して、、、といっためんどくさい作業をしなくてすむようになります。これは便利です。
Githubでタグを簡単に参照できる
複数人で実施しているプロジェクトでタグを設定すると、Github上で各タグを簡単に参照することができます。
Githubのレポジトリを開き「Code」タブを選択すると、上部に「〇tags」という表示があります。
これをクリックすると、タグの一覧を表示することができます。
タグの横の「…」をクリックすると、コミットメッセージが表示されます。
さらに、その下のハッシュ値(上記の例だと「0701d9d」)をクリックすると、コードの詳細を確認することができます。
更にその横の「zip」や「tar.gip」をクリックすると、その時点でのファイルをまとめてダウンロードすることができます。
リモートとローカルレポジトリでタグを使い分けられる
通常の git pushコマンドでは、作成したタグは送信されません。このため、自分のローカル用としてだけのタグを設定することができます。
もちろん、送りたいタグだけをリモートレポジトリにプッシュすることも、リモートレポジトリ送ってしまった間違ったタグを削除することもできます。
1つのコミットに複数のタグを設定できる
コミットに対して設定できるタグは1つだけではありません。複数のタグを設定することができます。
自分が使うためのローカル用のタグと、リモートレポジトリ用のタグを使い分けることもできます。
$ git log --oneline
9861efe (tag: v1.2, tag: MyOriginalTag) [A]vue-router
タグを使う上でのデメリットと注意点
git tagは便利で色々できる反面、理解が浅いとややこしさがあり、それが注意点やデメリットに直結します。
git pushだけではタグが送信されない
タグはローカルレポジトリとリモートレポジトリで使い分けらるようになているため、通常のgit pushではタグは送信されません。
対処法
タグを送信する場合は別途、タグ用のgit pushをする必要があります。その際、全てのタグをプッシュするコマンドと、指定したタグだけを送るコマンドがあります。
git push <リモートレポジトリ名> --tag
git push <リモートレポジトリ名> <タグ名>
タグ名に使えない文字がある
タグを指定するときに、スペースや「:(コロン)」を使うことはできません。
タグ名を直接変更(編集)するコマンドはない
タグ名を変えたいというときに、エディタを立ち上げてタグ名を編集するコマンドはありません。
対処法
タグ名を変更したいときは、元のタグを削除して、新たにタグをつけます。
コミット番号で指定するよりもタグ名でコミットを指定した方がわかりやすいので、先に新しタグ名を割り振ってから、古いタグ名を削除するのがお勧めです。
#タグの作成
git tag <新しいタグ名> <古いタグ名>
#タグの削除
git tag -d <古いタグ名>
タグ名の変更方法の実例
例えば、次のように「v3.0」というタグを「v4.0」に書き換える場合は次のようにします。
$ git log --oneline
61d3b4b (tag: v3.0) [A]ClientEdit.vue
▼タグ名の変更処理
#タグv3.0のコミットに、v4.0を付け加える
$ git tag v4.0 v3.0
この状態ではタグは以下のようになっています。
$ git log --oneline
61d3b4b (tag: v4.0, tag: v3.0) [A]ClientEdit.vue
この状態から、古いタグ「v3.0」を削除します。
$ git tag -d v3.0
Deleted tag 'v3.0' (was 61d3b4b)
最後にタグを確認します。
$ git log --oneline
61d3b4b (tag: v4.0) [A]ClientEdit.vue
タグ3.0が、4.0に切り替わりました。
同じタグ名は使えない
タグ名はユニークである必要があります。既に使用しているタグ名を使おうとすると「fatal: tag ‘タグ名’ already exists」というエラーが出ます。
$ git tag v4.0
fatal: tag 'v4.0' already exists
対処法
既存のタグ名他のタグに新たに付け直したい場合は、タグ名を移動することができます。
以下のようにgit tagコマンドに「-f」オプションをつけます。-fはforceの略で強制的にタグを指定したコミットに付け直すという意味です。
git tag -f <タグ名> <コミット>
実例
#通常コマンドではエラーになる
$ git tag v4.0
fatal: tag 'v4.0' already exists
#-fオプションをつける
$ git tag -f v4.0
Updated tag 'v4.0' (was 61d3b4b)
なお、git tagコマンドの第2引数でコミットを指定しない場合は、現在のブランチの最新のコミットにタグ付けを行います。
タグ名の設定方法
git tagコマンドを使ってタグ名を設定する、どのコミットにタグを付けたいかによって引数で指定する内容が変わります。
#現在のブランチの最新のコミットにタグをつける
git tag <タグ名>
#指定したコミットにタグをつける
git tag <タグ名> <コミット>
#指定したブランチの最新のコミットにタグをつける
git tag <タグ名> <ブランチ名>
下記で実例を紹介します。
現在のブランチの最新のコミットにタグをつける方法
現在のブランチの最新のコミットにタグをつけるには、git tagコマンドでタグ名のみを記載します(第2引数を省略します)
git tag <タグ名>
実例
#現在のブランチの最新のコミットに「v3.0.1」をつける
$ git tag v3.0.1
#タグが設定されたか確認
$ git log --oneline
0701d9d (HEAD -> aa, tag: v3.0.1, origin/aa) [U]docker-compose add webpack port 3035
現在のブランチ(上記例では「aa」)の最新のコミット「0701d9d」に「tag: v3.0.1」が設定されていることがわかります。
指定したコミットにタグをつける方法
指定したコミットにタグをつける場合は、git tagの第2引数でコミットを指定します。
git tag <タグ名> <コミット>
実例1:コミット番号で指定する
例えば以下のようなコミット履歴でコミット番号「61d3b4b」にタグ名「v1.0」を割り当ててみます。
$ git log --oneline
0701d9d (HEAD -> aa, origin/aa) [U]docker-compose add webpack port 3035
a90d4ef [U]content-security-policy(CSP) enable webpack-dev-server
6adca49 [A]destroyメソッド & Modal追加
61d3b4b [A]ClientEdit.vue
git tagでタグ名とコミットを指定します。
$ git tag v1.0 61d3b4b
実行しても何も表示されませんが、正しく実行できています。
念のため確認します。
$ git log --oneline
0701d9d (HEAD -> aa, origin/aa) [U]docker-compose add webpack port 3035
a90d4ef [U]content-security-policy(CSP) enable webpack-dev-server
6adca49 [A]destroyメソッド & Modal追加
61d3b4b (tag: v1.0) [A]ClientEdit.vue
指定したコミット「61d3b4b」にタグ名「v1.0」を割り当てられていることがわかります。
実例2:タグ名で指定する
既に設定してあるタグ名でどのコミットかを指定することもできます。
以下のタグ名「v1.0」に「マイtag」という名前のタグを設定してみます。
$ git log --oneline
0701d9d (HEAD -> aa, origin/aa) [U]docker-compose add webpack port 3035
a90d4ef [U]content-security-policy(CSP) enable webpack-dev-server
6adca49 [A]destroyメソッド & Modal追加
61d3b4b (tag: v1.0) [A]ClientEdit.vue
git tagで「v1.0」を指定してタグ名を割り当てます。
$ git tag "マイtag" v1.0
確認すると次のようになります。
$ git log --oneline
0701d9d (HEAD -> aa, origin/aa) [U]docker-compose add webpack port 3035
a90d4ef [U]content-security-policy(CSP) enable webpack-dev-server
6adca49 [A]destroyメソッド & Modal追加
61d3b4b (tag: マイtag, tag: v1.0) [A]ClientEdit.vue
「tag: マイtag, tag: v1.0」となり、タグが正しく設定されていることがわかります。
実例3:@やHEADで指定する
コミットを指定するときに、現在のコミットからいくつ遡るかを@やHEADで指定することもできます。
以下のコミット履歴で現在から数えて2個前の「6adca49 [A]destroyメソッド & Modal追加」にタグ「v2.0」をつけてみます。
$ git log --oneline
0701d9d (HEAD -> aa, origin/aa) [U]docker-compose add webpack port 3035
a90d4ef [U]content-security-policy(CSP) enable webpack-dev-server
6adca49 [A]destroyメソッド & Modal追加
61d3b4b (tag: マイtag, tag: v1.0) [A]ClientEdit.vue
2個前のタグに「v2.0」を設定。
$ git tag v2.0 @^^
タグが付いたかを確認
$ git log --oneline
0701d9d (HEAD -> aa, origin/aa) [U]docker-compose add webpack port 3035
a90d4ef [U]content-security-policy(CSP) enable webpack-dev-server
6adca49 (tag: v2.0) [A]destroyメソッド & Modal追加
61d3b4b (tag: マイtag, tag: v1.0) [A]ClientEdit.vue
現在のコミットから2つ前のコミット「6adca49」にタグ「v2.0」がついていることがわかります。
HEADや@によるコミットの指定はGitで非常によく使います。これらの詳細については下記をご参考ください。
【Git】HEAD~~, HEAD^^, アットマーク@~(チルダ), @^(キャレット)とは何か?意味や違いについて実例で解説
指定したブランチの最新のコミットにタグをつける方法
指定したブランチの最新のコミットにタグをつけるには、第2引数でブランチ名を指定します。
git tag <タグ名> <ブランチ名>
実例
例えば以下のように、過去の「b4cd08a」にtestブランチがあります。
$ git log --oneline
cf294ce (HEAD -> main, origin/main, origin/HEAD) [F]AA page customize
d9807e0 [A]Client Project model connected AA
b283ee8 [A]fix db host_name
b4cd08a (test) [F]database.yml
このtestブランチがあるコミットにタグ「v1.1」をつけます。
$ git tag v1.1 test
タグが正しく設定されたか確認します。
$ git log --oneline
cf294ce (HEAD -> main, origin/main, origin/HEAD) [F]AA page customize
d9807e0 [A]Client Project model connected AA
b283ee8 [A]fix db host_name
b4cd08a (tag: v1.1, test) [F]database.yml
testブランチがあるコミット「b4cd08a」にタグ「v1.1」が設定されていることがわかります。
設定したタグの一覧を参照する
現在のレポジトリにどんなタグが設定されているかを一覧で表示することもできます。
表示方法はいくつかあります。まとめると以下のようになってます。
オプション | コマンド例 | 内容 |
---|---|---|
なし | git tag | タグ名の一覧を表示する |
--column | git tag --column | 設定してあるタグ一覧を1行で表示する |
-n | git tag -n | 注釈(注釈がない場合はコミットメッセージ)も合わせて表示する |
-l “パターン” | git tag -l "v*" | パターンマッチングで該当するタグの一覧のみを表示する(*と?) |
-n “パターン” | git tag -n "v*" | パターンマッチングで該当するタグ名とその注釈(注釈がない場合はコミットメッセージ)も合わせて表示する |
注釈はコミットメッセージとは別にタグに設定できる専用のメッセージです。注釈の設定方法については後述します。
git tag(引数なし)
引数なしのgit tag
は現在設定されているタグの一覧を表示するコマンドです。
git tag
実例
$ git tag
v1.0
v1.2
v2.0
v2.1
v3.0
マイtag
マイtag2
git tag –column
git tag --column
はタグを1行で表示するコマンドです。
git tag --column
実例
$ git tag --column
v1.0 v1.2 v2.0 v2.1 v3.0 マイtag マイtag2
git tag -l “パターン”
git tag -l "パターン"
は指定したパターンに合致するタグのみを表示するコマンドです。
git tag -l "パターン"
実例
冒頭が「v」で始まるタグ名を表示する場合は以下のようになります。
$ git tag -l "v*"
v1.0
v1.2
v2.0
v2.1
v3.0
任意の1文字を指定する場合は以下のようになります。
$ git tag -l "v?.0"
v1.0
v2.0
v3.0
~を含むとしたい場合は「*文字列*」とします。
$ git tag -l "*マイ*"
マイtag
マイtag2
なお --column
オプションと組み合わせることもできます。
$ git tag -l "v*" --column
v1.0 v1.2 v2.0 v2.1 v3.0
パターンを指定しない場合(git tag -l)はgit tagと同じになります。
$ git tag -l
v1.0
v1.2
v2.0
v2.1
v3.0
マイtag
マイtag2
git tag -n
git tag -n
はタグ名と合わせて注釈も表示します。注釈が設定されていない場合は、コミットメッセージを表示します。(※注釈の設定方法については後述しています)
git tag -n
実例
$ git tag -n
v1.0 XX注釈XX
v1.2 [A]vue-router
v2.0 [A]destroyメソッド & Modal追加
v2.1 [A]ClientNew.vue
v3.0 [U]content-security-policy(CSP) enable webpack-dev-server
マイtag [A]ClientEdit.vue
マイtag2 [U]content-security-policy(CSP) enable webpack-dev-server
なお--column
オプションとの併用はできません。
$ git tag -n --column
fatal: --column and -n are incompatible
「incompatible」とは互換性がないという意味です。「--column and -n are incompatible
」は--column
と-nは同時に使えないよという内容です。
git tag -n "パターン"
git tag -n "パターン"
のように-nオプションの後ろで、パターンを指定すると、合致するタグ名と注釈を(注釈が無い場合はコミットメッセージ)表示します。
実例
冒頭が「v」で始まるタグ名を表示する場合は以下のようになります。
$ git tag -n "v*"
v1.0 XX注釈XX
v1.2 [A]vue-router
v2.0 [A]destroyメソッド & Modal追加
v2.1 [A]ClientNew.vue
v3.0 [U]content-security-policy(CSP) enable webpack-dev-server
任意の1文字を指定する場合は以下のようになります。
$ git tag -n "v?.0"
v1.0 XX注釈XX
v2.0 [A]destroyメソッド & Modal追加
v3.0 [U]content-security-policy(CSP) enable webpack-dev-server
~を含むとしたい場合は「*文字列*」とします。
$ git tag -n "*マイ*"
マイtag [A]ClientEdit.vue
マイtag2 [U]content-security-policy(CSP) enable webpack-dev-server
注釈をつけたタグを設定する方法
git tagで生成するタグにはコミットメッセージ以外にタグ専用の注釈(メッセージ)を作成することができます。
注釈の設定方法は、注釈なしでタグ名を指定するコードに「-a」オプションをつけるだけです。
(「-a」または「--annotate
」オプションでも注釈をつけることができます。)
-aオプションの意味
-aは--annotate
の省略形です。annotateは「注釈をつける」の意味です。
注釈を設定する方法
注釈を設定する方法は以下の3つがあります。
以下でそれぞれの方法を実例で解説します。
エディタを起動する場合
エディタを起動する場合は-aオプションを付けて、タグ名を指定します。
git tag -a <タグ名> <コミット>
実例
例えば、現在のブランチの最新のコミットに「v1.0」というタグ名をつけて、注釈をエディタで設定する場合は以下のようになります。
$ git tag v1.0 -a
VSCodeを使う場合は以下のようなエディタが起動します。
セーブして、閉じれば処理は完了です。
以下のようなメッセージが表示されますが、問題なく作業できます。
hint: Waiting for your editor to close the file... [0126/111345.264:ERROR:registration_protocol_win.cc(102)] CreateFile: 指定されたファイルが見つかりません。 (0x2)
コマンドライン上で直接注釈を入力する。「-a」と「-m」オプションを使う
注釈を設定する2つ目の方法は、「-a」と「-m」オプションを使って、コマンドライン上で直接注釈を入力するものです。
git tag -a <タグ名> -m "注釈の内容" <コミット>
-mオプションは--message
のショートオプションで、注釈の内容(メッセージ)を指定できます。
実例
コミット番号「00093d1」にタグ名「v0.1」で注釈「注釈の内容」というメッセージを付ける場合は以下のようになります。
$ git tag v0.1 -a -m "注釈の内容" 00093d1
確認すると、正しく注釈が設定されていることがわかります。
$ git tag -n "v0.1"
v0.1 注釈の内容
またはgit logで履歴を参照
$ git log --oneline
00093d1 (tag: v0.1) [F]ClientNewからClientForm.vueを切り出し
コマンドライン上で直接注釈を入力する。「-am」オプションを使う
注釈を設定する3つ目の方法は、「-am」オプションを使って、コマンドライン上で直接注釈を入力するものです。
ハイフン一つのショートオプションでは複数のショートオプションをつなげることができます。
「-am」は「-a」「-m」と同じです。
git tag <タグ名> -am "注釈の内容" <コミット>
実例
コミット番号「00093d1」にタグ名「v0.2」で注釈「注釈の内容2」というメッセージを付ける場合は以下のようになります。
$ git tag v0.2 -am "注釈の内容2" 00093d1
確認すると、正しく注釈が設定されていることがわかります。
$ git tag -n "v0.2"
v0.2 注釈の内容2
またはgit logで履歴を参照
$ git log --oneline
00093d1 (tag: v0.2, tag: v0.1) [F]ClientNewからClientForm.vueを切り出し
注釈を変更する方法
既にある注釈の内容を変更したい場合は、注釈をつけたタグを強制的に上書きします。
git tag -f <タグ名> -am "注釈の内容" <コミット>
-fオプションはタグを強制的に上書きするオプションです。
実例
以下のようにtag名「v0.2」注釈の内容「注釈の内容2」となっている注釈を「注釈の内容を変更しました」に変えます。
$ git log --oneline
00093d1 (tag: v0.2) [F]ClientNewからClientForm.vueを切り出し
$ git tag -n "v0.2"
v0.2 注釈の内容2
コミット番号を指定してタグを上書きします。
$ git tag -f v0.2 -am "注釈の内容を変更しました" 00093d1
Updated tag 'v0.2' (was 187cd03)
注釈の内容を確認すると、正しく変更されていることがわかります。
$ git tag -n "v0.2"
v0.2 注釈の内容を変更しました
タグの削除(ローカルレポジトリのタグの場合)
タグを削除するときは-dオプションを使います。dはdeleteの略です。
git tag -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 <タグ名>
色々な記述
タグを削除するときは、-dオプション以外にも「:タグ名」や「:refs/tags/タグ名」でも同じ処理になります。
$ git push <リモートレポジトリ名> -d <タグ名>
↑↓ 同じ
$ git push <リモートレポジトリ名> :<タグ名>
↑↓ 同じ
$ git push <リモートレポジトリ名> :refs/tags/<タグ名>
「:」というのは「ローカルレポジトリのブランチ:リモートレポジトリのブランチ」のようにローカルとリモートを指定するときに使うものです。ローカルレポジトリを指定しない=空の内容を送る、つまり、削除となります。
refs/tags/タグ名というのはタグ名のフルネームのようなものです。タグ名やブランチ名などを参照名といい通常はrefsなどの接頭語が省略されています。これをフルで記載すると、タグの場合は「refs/tags/タグ名」となります。
実例
例えばリモートレポジトリに以下のようにタグがあるとします。
ここから、タグ「v4.0」を削除する場合は以下のようにします。
$ git push origin -d v4.0
To https://github.com/xxxxx/yyyyy.git
- [deleted] v4.0
Githubで確認するとタグが削除されていることがわかります。
なお、「:」を使って指定する方法の場合は以下のようになります。
$ 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で確認するとタグが削除されていることがわかります。
複数のタグをまとて削除する
リモートレポジトリにあるタグを複数まとめて削除したい場合は、-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]と表示され、指定したタグがまとめて削除されたのがわかります。
リモートレポジトリのタグを確認すると削除が正しく反映されています。
タグ名の変更
Gitのタグを使っていると既にあるタグ名を変更したい場合があります。ですが、git tagにはタグ名を直接編集するコマンドは用意されていません。
ここでは、タグ名の変更が発生しうる、以下の2つのパターン別に対処法を紹介します。
- タグ名を別の名前に変える。
- 既にあるタグ名を他のコミットに付け替える。
タグ名を別の名前に変える
既存のタグ名を変更したいときは、元のタグを削除して、新たにタグをつけます。
コミット番号で指定するよりもタグ名でコミットを指定した方がわかりやすいので、先に新しタグ名を割り振ってから、古いタグ名を削除するのがお勧めです。
#タグの作成
git tag <新しいタグ名> <古いタグ名>
#タグの削除
git tag -d <古いタグ名>
タグ名の変更方法の実例
例えば、次のように「v3.0」というタグを「v4.0」に書き換える場合は次のようにします。
$ git log --oneline
61d3b4b (tag: v3.0) [A]ClientEdit.vue
▼タグ名の変更処理
#タグv3.0のコミットに、v4.0を付け加える
$ git tag v4.0 v3.0
この状態ではタグは以下のようになっています。
$ git log --oneline
61d3b4b (tag: v4.0, tag: v3.0) [A]ClientEdit.vue
この状態から、古いタグ「v3.0」を削除します。
$ git tag -d v3.0
Deleted tag 'v3.0' (was 61d3b4b)
最後にタグを確認します。
$ git log --oneline
61d3b4b (tag: v4.0) [A]ClientEdit.vue
タグ3.0が、4.0に切り替わりました。
既にあるタグ名を他のコミットに付け替える
タグ名はユニークである必要があるため、同じタグ名を複数設定することはできません。
例えば、既存のタグ名を他のコミットに付け替えたい場合は以下のコマンドでタグの強制上書きを行います。
git tag -f <タグ名> <新しくタグを付けるコミット>
-fは–forceのショートオプションで強制実行を意味しています。
実例
例えば、以下のようなコミットログがあるとします。
$ git log --oneline
0701d9d (HEAD -> aa, origin/aa) [U]docker-compose add webpack port 3035
a90d4ef [U]content-security-policy(CSP) enable webpack-dev-server
6adca49 (tag: v2.0) [A]destroyメソッド & Modal追加
コミット番号「6adca49」についているタグ「v2.0」を、一つ上の「a90d4ef」に付け替えます。
-fオプションをつけて、タグ名とコミットを指定し、実行します。
$ git tag -f v2.0 a90d4ef
Updated tag 'v2.0' (was 6adca49)
以上でタグの付け替えは完了です。
git logで確認すると以下のようになっています。
$ git log --oneline
0701d9d (HEAD -> aa, origin/aa) [U]docker-compose add webpack port 3035
a90d4ef (tag: v2.0) [U]content-security-policy(CSP) enable webpack-dev-server
6adca49 [A]destroyメソッド & Modal追加
コミット番号「6adca49」についていたタグ「v2.0」が、指定した「a90d4ef」に付け替わっていることがわかります。
リモートレポジトリにタグをプッシュ(反映)する方法
リモートレポジトリ(Github)でタグを使う場合は注意が必要です。
通常の git push
コマンドでは、タグは送信されません。(個人用の目印の全体共有を防ぐため)
リモートレポジトリにタグを送る場合は以下の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
これは、送信しようとしているタグがリモートレポジトリ上の他のコミットで既に使われている場合に発生するエラーです。
このときの主な対処法は3つあります。
ローカルレポジトリの重複しているタグを削除する
以下のコマンドを実行します。
git tag -d <タグ名>
ローカルレポジトリの重複しているタグ名を変更する
既存のタグ名を変更したいときは、元のタグを削除して、新たにタグをつけます。
コミット番号で指定するよりもタグ名でコミットを指定した方がわかりやすいので、先に新しタグ名を割り振ってから、古いタグ名を削除するのがお勧めです。
#タグの作成
git tag <新しいタグ名> <古いタグ名>
#タグの削除
git tag -d <古いタグ名>
リモートレポジトリのタグを削除する
以下のコマンドを実行します。
$ git push <リモートレポジトリ名> -d <タグ名>