本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はGitの「コミット」に対する「タグ」の一覧を表示したり、作成や削除、変更を実行したりする「git tag」コマンドです。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はGitの「コミット」に対する「タグ」の一覧を表示したり、作成や削除、変更を実行したりする「git tag」コマンドです。
「git」は「Git」という分散型バージョン管理システム用のコマンドです。Gitは元々Linuxカーネルのソースコードを管理するために作られた「バージョン管理システム」で、現在は多くのソフトウェアやWebサイトのソースコード、ドキュメントの管理などに用いられています。
ソースコードを管理する際、最新版だけを保存するやり方はうまくいきません。開発中のさまざまなタイミングで状態を管理し、必要に応じて比較、参照したり、元に戻したりできるようにする仕組みが「バージョン管理システム」です。
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 [オプション] [パターン]
※ 「対象」にはファイル名やブランチ、タグ、コミットのハッシュ値などが指定可能。[ ]は省略可能な引数を示しています。
短いオプション | 長いオプション | 意味 |
---|---|---|
-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ファイルのパスを表示する | |
コマンド | 実行内容 |
---|---|
clone | リポジトリのクローンを作成する |
init | リポジトリを新規作成する、または既存のリポジトリを初期化する |
remote | リモートリポジトリを関連付けする |
fetch | リモートリポジトリの内容を取得する |
pull | リモートリポジトリの内容を取得し、現在のブランチに取り込む(「fetch」と「merge」を行う) |
push | ローカルリポジトリの変更内容をリモートリポジトリに送信する |
add | ファイルをインデックスに追加する(コミットの対象にする) |
rm | ファイルをインデックスから削除する |
mv | ファイルやディレクトリの名前を変更する |
reset | ファイルをインデックスから削除し、特定のコミットの状態まで戻す |
status | ワークツリーにあるファイルの状態を表示する |
show | ファイルの内容やコミットの差分などを表示する |
diff | コミット同士やコミットとワークツリーの内容を比較する |
commit | インデックスに追加した変更をリポジトリに記録する |
tag | コミットにタグを付ける、削除する、一覧表示する |
log | コミット時のログを表示する |
grep | リポジトリで管理されているファイルをパターン検索する |
branch | ブランチを作成、削除、一覧表示する |
checkout | ワークツリーを異なるブランチに切り替える |
merge | 他のブランチやコミットの内容を現在のブランチに取り込む |
rebase | コミットを再適用する(ブランチの分岐点を変更したり、コミットの順番を入れ替えたりできる) |
config | 現在の設定を取得、変更する |
短いオプション | 長いオプション | 意味 |
---|---|---|
-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」で作成する。
短いオプション | 長いオプション | 意味 |
---|---|---|
-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つのコミットに複数のタグを付けることも可能です。
コミットを指定してタグを付けたい場合は「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」という名前がある。
タグを付けるときにメッセージ(注釈メッセージ、「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 タグ名」でコミットを表示すると、まずタグの情報を表示し、続いてコミットの情報を表示します。軽量版のタグの場合はコミットの情報だけを表示します。
「git tag -d タグ名」で指定したタグを削除します(画面3)。
「git clone」や「git pull」でリモートリポジトリからローカルリポジトリに取り込んだタグも、同じく「git tag -d タグ名」で削除できますが、「git push」を実行してもタグの削除はリモートリポジトリには反映されません(解説を参照)。
リモートリポジトリへ反映させる操作を試したい場合は、自分用のリモートリポジトリを作成しましょう。「git push」やリモートリポジトリの作成方法については、今後の連載で取り上げる予定です。
git -d タグ名
(指定したタグを削除する)
git -d mytag1
(タグ「mytag1」を削除する)
タグ名を変更するオプションはありません。「git tag 新タグ名 旧タグ名」で新しいタグを作成し、「git tag -d 旧タグ名」で元のタグを削除するとよいでしょう(画面4)。
タグの注釈を変更したい場合や、軽量版のタグに注釈を付けたい場合は「-f」オプションを付けて「git tag -f -a タグ名 -m "注釈" タグ名」のように実行するという方法があります(画面5)。「-f」は同名のタグが既に存在していた場合、上書きするからです。
タグは、基本的に「自分用」に使う機能です。保存先はローカルリポジトリに限られます。「git push」コマンドを使用してローカルリポジトリの内容をリモートリポジトリにアップロードする際、合わせてタグをリモートリポジトリに反映したい場合は「git push --tags」のように明示する必要があります。
削除の場合は「git push origin :タグ名」のように実行します。「git push」については今後の連載で取り上げる予定です。なお、「progit2-ja」に対して「git push」を実行しないよう、十分に注意してください。
チームで進めているプロジェクトの場合、タグをリモートリポジトリに反映しようとして「git push」を試みる際は、タグの付け方がプロジェクトのポリシーに合っているかどうかを事前に確認しましょう。分からない場合は「git push」を実行してはいけません。「git push」を試してみたいという場合は、自分用のリモートリポジトリを作成しましょう。リモートリポジトリの作成方法についても今後の連載で取り上げる予定です。
タグは、ローカルリポジトリ(.gitディレクトリ)のrefs/tags/ディレクトリに保存されています。ファイル名は「タグ名」で、内容はコミットのハッシュ値です。注釈付きタグの場合はタグのハッシュ値になります(画面6)。
西村 めぐみ(にしむら めぐみ)
元々はDOSユーザー。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『[新版 zsh&bash対応] macOSコマンド入門』『Accessではじめるデータベース超入門[改訂2版]』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社等の"PCヘルパー"やピンポイント研修なども行っている。
Copyright © ITmedia, Inc. All Rights Reserved.