連載
» 2020年05月07日 05時00分 公開

Linux基本コマンドTips(394):【 git tag 】コマンド(応用編)――タグを作成、削除、変更する

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はGitの「コミット」に対する「タグ」の一覧を表示したり、作成や削除、変更を実行したりする「git tag」コマンドです。

[西村めぐみ,@IT]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はGitの「コミット」に対する「タグ」の一覧を表示したり、作成や削除、変更を実行したりする「git tag」コマンドです。

git/git tagコマンドとは?

 「git」は「Git」という分散型バージョン管理システム用のコマンドです。Gitは元々Linuxカーネルのソースコードを管理するために作られた「バージョン管理システム」で、現在は多くのソフトウェアやWebサイトのソースコード、ドキュメントの管理などに用いられています。

 ソースコードを管理する際、最新版だけを保存するやり方はうまくいきません。開発中のさまざまなタイミングで状態を管理し、必要に応じて比較、参照したり、元に戻したりできるようにする仕組みが「バージョン管理システム」です。

 Gitでは、テスト版など複数に枝分かれした状態も管理できます。複数のメンバーによる開発を前提としており、開発中の各時点におけるコメントや、コメントへの返信なども管理できるようになっています。

gitのサブコマンドとGitの仕組み

 gitコマンドはほとんどの場合、「サブコマンド」と組み合わせて利用します(本連載ではgitとサブコマンドの組み合わせをコマンドとして紹介します)。

 gitコマンドでは「リポジトリ(repository)」を使ってバージョンを管理します。リポジトリにはソースコードや変更履歴、コメントなどを一括して保管します。リポジトリには、自分のPC上に作る「ローカルリポジトリ」と、「GitHub」などのWebサービス上に作る「リモートリポジトリ」があり、両者を連携させることで複数の開発者による開発を1本にまとめることができます。

 既存のリポジトリ(リモートリポジトリ)にあるソースコードなどを入手したい場合は、まず、「git clone」(連載第381回)でリポジトリを自分の環境に複製します(※1)。リモートリポジトリの内容がバージョンアップされたら「git pull」(連載第382回)コマンドで最新版を取得します。開発に参加するのではなく、単に最新版を取得したいという場合は、「git clone」と「git pull」を利用すればよいでしょう。

※1 特定のファイルだけが欲しい場合、例えばGitHub(github.com)にあるリポジトリであれば「Raw」というボタンで表示されるURLを使い、「wget」コマンドなどを使ってダウンロードできる。この他、プロジェクト全体をダウンロードするためのリンクも用意されている([Clone or download]ボタン→「Download ZIP」)。



 保管場所であるリポジトリに対し、ファイルの編集などを行う場所を「ワークツリー」「ワーキングエリア」「作業ツリー」などと呼びます。「git clone」や「git pull」で取得した最新版のファイルはワークツリーに配置されます。つまり「作業ディレクトリ」です。

 ワークツリーで編集した結果をリポジトリに反映する操作を「コミット」と呼びます。「git add」(連載第384回)コマンドでコミットしたいファイルを「インデックス」あるいは「ステージングエリア」と呼ばれる領域に追加します。インデックスにはファイルの変更箇所などが記録されます。

 インデックスの内容は「git commit」コマンドでローカルリポジトリにコミットされ、「git push」コマンドでローカルリポジトリの内容をリモートリポジトリに反映します。従って、「git add」や「git commit」などを行わなければ、自分の環境で編集した内容がリポジトリに影響を与えることはありません。自由に編集し、テストできます。なお、ワークツリーのファイルを過去の任意のコミット状態に戻すことも可能です。

 Gitには、この他、開発中のソースコードやドキュメントを、「テスト版」「○○版」……のように枝分かれさせたり、それらを合流させたりする機能もあります。枝分かれしたそれぞれのバージョンを「ブランチ」(branch)と呼び、ブランチを合流させることを「マージ」(merge)と呼びます。

 コミットには「タグ」と呼ばれる名前を付けることができます。今回紹介する「git tag」はタグの表示や作成、削除を行うコマンドです。連載第393回はタグの表示について扱いました。今回はタグの作成と削除、変更などの方法を紹介します。



コマンドの書式

git [オプション] サブコマンド [サブコマンドごとのオプションや引数]

git tag [オプション] タグ名 [対象]

git tag [-dまたは-vオプション] タグ名

git tag [オプション] [パターン]

※ 「対象」にはファイル名やブランチ、タグ、コミットのハッシュ値などが指定可能。[ ]は省略可能な引数を示しています。




gitの主なオプション

短いオプション 長いオプション 意味
-C パス カレントディレクトリではなく指定したディレクトリで実行したものとする
--bare リポジトリを「bareリポジトリ」(ワーキングツリーが存在しない、管理だけを目的としたリポジトリ)として扱う
-c 設定=値 設定値を指定する(設定は「git config」で確認可能)
-p --paginate 全ての出力を「less」コマンドまたは環境変数PAGERで指定されたコマンドで表示する
-P --no-pager 「less」コマンドで表示しない(「-p」の指定を打ち消す)
--exec-path=パス gitの実行ファイルのパスを指定する(「--exec-path」のみの場合、実行ファイルのパスを表示する)
--html-path gitのHTML形式のドキュメントがインストールされたパスを表示する
--man-path gitのmanファイルのパスを表示する
--info-path gitのinfoファイルのパスを表示する

gitのサブコマンド

コマンド 実行内容
clone リポジトリのクローンを作成する
init リポジトリを新規作成する、または既存のリポジトリを初期化する
remote リモートリポジトリを関連付けする
fetch リモートリポジトリの内容を取得する
pull リモートリポジトリの内容を取得し、現在のブランチに取り込む(「fetch」と「merge」を行う)
push ローカルリポジトリの変更内容をリモートリポジトリに送信する
add ファイルをインデックスに追加する(コミットの対象にする)
rm ファイルをインデックスから削除する
mv ファイルやディレクトリの名前を変更する
reset ファイルをインデックスから削除し、特定のコミットの状態まで戻す
status ワークツリーにあるファイルの状態を表示する
show ファイルの内容やコミットの差分などを表示する
diff コミット同士やコミットとワークツリーの内容を比較する
commit インデックスに追加した変更をリポジトリに記録する
tag コミットにタグを付ける、削除する、一覧表示する
log コミット時のログを表示する
grep リポジトリで管理されているファイルをパターン検索する
branch ブランチを作成、削除、一覧表示する
checkout ワークツリーを異なるブランチに切り替える
merge 他のブランチやコミットの内容を現在のブランチに取り込む
rebase コミットを再適用する(ブランチの分岐点を変更したり、コミットの順番を入れ替えたりできる)
config 現在の設定を取得、変更する

git tagの主なオプション(タグの作成と削除、署名の確認)

短いオプション 長いオプション 意味
-f --force 同じ名前のタグがあった場合は上書きする
-a --annotate 注釈付きタグを生成する(※2)
-s --sign GPG(GNU Privacy Guard)署名付きのタグを生成する(※2、※3)
-u キーID --local-user=キーID 指定したキーIDを使用してGPG署名付きのタグを生成する(※2)
-m 注釈 --message=注釈 タグに注釈を付ける(「-a」を指定した扱いになる)
-F ファイル --file=ファイル タグの注釈をファイルから読み出す(「-a」を指定した扱いになる)
-e --edit 「-m」や「-F」で指定した注釈を編集する
-d --delete 指定したタグを削除する
-v --verify 指定したタグのGPG署名を確認する

※2 「-a」「-s」「-u」を指定した場合は注釈(メッセージ)の入力が必要になる。「-m」「-F」で注釈を指定していない場合はエディタ(vi)が起動する
※3 事前に「git config --global user.signingkey キーID」で公開鍵を登録しておく。キーIDは「gpg --list-keys」で確認できる。キーがない場合は「gpg --gen-key」で作成する。



git tagの主なオプション(タグの表示)

短いオプション 長いオプション 意味
-n行数 注釈またはコミットメッセージを表示する行数を指定する(「-n」または「-n1」で1行、本文を参照
-l --list タグを一覧表示する(「--list 'v-*'」のようなパターン指定が可能)
--sort=キー タグを一覧表示する際の表示順を指定する(本文を参照、※4)
-i --ignore-case 並べ替えや絞り込みでアルファベットの大小文字を区別しない
--column タグを1行1列ではなくマルチカラム表示にする
--no-column タグをマルチカラムではなく1行1列で表示する
--contains コミット HEADから指定したコミットまでの間に存在するタグを表示する(コミットを指定しなかった場合はHEADが対象になる)
--no-contains コミット HEADから指定したコミットまでの間に含まれないタグを表示する(コミットを指定しなかった場合はHEADが対象になる)
--merged マージしたときのコミットに付いているタグを表示する
--no-merged マージしたとき以外のコミットに付いているタグを表示する
--points-at 対象 指定した対象(コミットなど)に付いているタグを表示する

※4 使用できるキーは「man git for-each-ref」の「FIELD NAMES」を見て確認できる。





コミットにタグを付ける

 「git tag タグ名」で、現在のコミット(※5)に対してタグを付けることができます。1つのコミットに複数のタグを付けることも可能です。

※5 「git commit」(連載第385回)を実行した直後や、「git checkout」(連載第391回)でブランチを切り替えた直後の場合は最新のコミットを指す。コミットを指定してチェックアウトした場合(連載第392回)は、そのチェックアウトしたコミットが対象となる。



 コミットを指定してタグを付けたい場合は「git tag ハッシュ値」などでコミットを指定します。1つのコミットに複数のタグ名を付けることも可能です。「ハッシュ値」とはgitのコミットに付く固有の値です。

 この他、コミットに「タグ」と呼ばれる別名を付けておくこともできます。例えば、コミットの情報を表示する「git show」コマンドでは、「git show タグ名」(連載第389回)のように、タグを使ってコミットを指定できます。

コマンド実行例

git tag タグ名

(現在のコミットにタグを付ける)

git tag タグ名 コミット

(指定したコミットにタグを付ける)

git tag タグ名 ハッシュ値

(指定したハッシュ値を持つコミットにタグを付ける)

git tag タグ名B タグ名A

(タグ名Aが付いたコミットにさらにタグ名Bを付ける)


 以下のコマンドの実行例では、前回に引き続き「progit2-ja」を使用しています。「git clone https://github.com/progit/progit2-ja」で自分の環境に複製を作り(連載第381回)、ワークツリーであるprogit2-jaディレクトリの中で実行しています。

 画面1では、確認のため「git tag」に先立ち「git log --oneline -10」で直近10件のコミットを一覧表示しています(連載第386回)。

 タグが付いているコミットの場合、ハッシュ値の後に「(tag: タグ名)」のように表示します。直近10回分のコミットでは、「2.1.3」「2.1.2」「2.1.1」というタグがあることが分かります。なお、途中の赤字で表示されている「origin/fix-104」は、そのコミットで新たに「fix-104」というブランチに枝分かれてしていることを示しています(※6)。

※6 originはリポジトリの別名で、通常、デフォルトのリポジトリには「origin」という名前が付いている。同様に、デフォルトのブランチには「master」という名前がある。



画面1 画面1 コミットにタグを付けたところ


注釈付きタグを作成する

 タグを付けるときにメッセージ(注釈メッセージ、「annotation」)を合わせて追加できます。このようなタグを「注釈付きタグ」と呼びます。注釈付きタグには、注釈の他にメッセージの作成者と作成日も保存されます。

 なお、注釈が付いていないタグは、注釈付きタグに対して「軽量版のタグ」と呼ばれることがあります。

 注釈付きタグは「git tag -a タグ名」で作成します(画面2)。実行すると、注釈を入力するためのエディタ(vi)が開きます。エディタを開かずに実行したい場合は「git tag -a タグ名 -m メッセージ」のようにメッセージを指定します。

コマンド実行例

git tag -a タグ名

(現在のコミットに注釈付きタグを付けるためにviが起動する)

git tag -a タグ名 コミット

(指定したコミットに注釈付きタグを付けるためにviが起動する)

git tag -a タグ名 -m 注釈 コミット

(指定したコミットに注釈付きタグを付ける)

git tag -m 注釈 タグ名

(現在のコミットに注釈付きタグを付ける、※7)

git tag -m 注釈 タグ名 コミット

(指定したコミットに注釈付きタグを付ける、※7)

※7 「-m」を指定したため「-a」を指定した扱いになる。




 「git tag -n」(連載第393回)でタグを一覧表示すると、注釈付きタグの場合はタグとタグの注釈を、軽量版のタグの場合はタグとコミットメッセージを表示します。

 注釈付きタグは「git show タグ名」でコミットを表示すると、まずタグの情報を表示し、続いてコミットの情報を表示します。軽量版のタグの場合はコミットの情報だけを表示します。

画面2 画面2 注釈付きタグを作成したところ


タグを削除する

 「git tag -d タグ名」で指定したタグを削除します(画面3)。

 「git clone」や「git pull」でリモートリポジトリからローカルリポジトリに取り込んだタグも、同じく「git tag -d タグ名」で削除できますが、「git push」を実行してもタグの削除はリモートリポジトリには反映されません(解説を参照)。

 リモートリポジトリへ反映させる操作を試したい場合は、自分用のリモートリポジトリを作成しましょう。「git push」やリモートリポジトリの作成方法については、今後の連載で取り上げる予定です。

コマンド実行例

git -d タグ名

(指定したタグを削除する)

git -d mytag1

(タグ「mytag1」を削除する)


画面3 画面3 タグを削除したところ


タグを変更する

 タグ名を変更するオプションはありません。「git tag 新タグ名 旧タグ名」で新しいタグを作成し、「git tag -d 旧タグ名」で元のタグを削除するとよいでしょう(画面4)。

画面4 画面4 タグを変更したところ

 タグの注釈を変更したい場合や、軽量版のタグに注釈を付けたい場合は「-f」オプションを付けて「git tag -f -a タグ名 -m "注釈" タグ名」のように実行するという方法があります(画面5)。「-f」は同名のタグが既に存在していた場合、上書きするからです。

画面5 画面5 タグの注釈を変更したところ


リモートリポジトリにタグを反映させる

 タグは、基本的に「自分用」に使う機能です。保存先はローカルリポジトリに限られます。「git push」コマンドを使用してローカルリポジトリの内容をリモートリポジトリにアップロードする際、合わせてタグをリモートリポジトリに反映したい場合は「git push --tags」のように明示する必要があります。

 削除の場合は「git push origin :タグ名」のように実行します。「git push」については今後の連載で取り上げる予定です。なお、「progit2-ja」に対して「git push」を実行しないよう、十分に注意してください。

 チームで進めているプロジェクトの場合、タグをリモートリポジトリに反映しようとして「git push」を試みる際は、タグの付け方がプロジェクトのポリシーに合っているかどうかを事前に確認しましょう。分からない場合は「git push」を実行してはいけません。「git push」を試してみたいという場合は、自分用のリモートリポジトリを作成しましょう。リモートリポジトリの作成方法についても今後の連載で取り上げる予定です。



タグが格納されたファイルを確認する

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。