HOWTO · Git
Git のチェックアウトタグ
このチュートリアルでは、さまざまなコマンドを使用して git で最新のタグをチェックアウトする方法を示します。
このページの内容
Git タグはコミットを指す参照で、リリースの目印として使われることがよくあります。ブランチとは異なり、新しいコミットが作成されてもタグは自動的に先へ進みません。ただし、タグは移動したり削除したりできます。特にリモートリポジトリと連携するときは、参照先が変わる可能性があるものとして扱ってください。
軽量タグはコミットを直接指す参照です。注釈付きタグは独立した Git オブジェクトで、メッセージ、タグ付けした人の名前と日付、任意で署名を保存できます。必要なメタデータや検証方法に応じて選んでください。どちらかが本質的に非公開または公開ということはありません。
Git タグが指すもの
タグはリポジトリの履歴にある特定のコミットを指します。別のコミットを指定せずにタグを作成すると、現在チェックアウトしているコミットを指し、そのコミットは HEAD で確認できます。タグにはブランチの継続的な履歴は含まれません。ブランチに後続のコミットが追加されても、タグがそれに合わせて移動することはありません。
タグをチェックアウトすると、Git は作業ツリーをそのコミットの状態にします。このとき HEAD はブランチではなくコミットを直接指すため、通常は detached-HEAD 状態になります。そのスナップショットを安全に調べたり、ビルドしたりできます。そこで作成したコミットを残したい場合は、前後どちらかのタイミングでブランチを作成してください。
Git でタグを作成する
現在のコミットに軽量タグを作成するには、git tag v1.0 を使います。メッセージとタグ付けした人のメタデータを追加するには、git tag -a v1.0 -m "Release 1.0" を使います。-a オプションは注釈付きタグを作成し、-m はメッセージを指定します。どちらのコマンドでも、末尾にコミット ID を追加すれば、指定したコミットにタグを作成できます。
これらはタグ作成の例であり、既存のタグをチェックアウトするために必要な操作ではありません。重複しない、意味の分かりやすい名前を使ってください。また、タグ参照は更新や削除が可能なため、公開済みタグを変更する場合は共同作業者と調整してください。
リモートからタグを取得する
最後にフェッチしてからリモートにリリースが追加された場合など、クローンしたリポジトリに必要なタグがまだないことがあります。リモートにあるタグをチェックアウトする前に取得してください。git fetch --tags origin は、origin からタグを取得するよう Git に指示します。設定済みのすべてのリモートとそのタグを取得するには、git fetch --all --tags を使います。--all は設定済みのすべてのリモートを意味し、--tags はタグの取得を指定します。これは別々のオプションであり、-all という複合オプションではありません。
フェッチするとリモートからローカルの参照が更新されますが、タグのチェックアウトや現在のブランチの切り替えは行われません。必要なタグがすでにローカルにあると分かっている場合は、この手順を省略できます。
特定のタグをチェックアウトする
v1.0 が指すスナップショットを確認するには、git checkout v1.0 を実行します。Git は作業ツリーをタグのコミットに更新し、通常は HEAD を detached 状態にします。従来の git checkout コマンドはブランチの切り替えにも使えるため、指定する参照が重要です。名前がタグとして解決される場合、このコマンドはそのタグをチェックアウトします。
detached HEAD は、リリースの閲覧、テスト、ビルドに便利です。ブランチを作らずに、後で残したい作業をここで行うのは避けてください。detached 状態で作成したコミットはブランチに紐付かず、切り替えた後に見つけにくくなることがあります。次のセクションでは、タグを起点にブランチを作成する方法を説明します。
タグのコミットをチェックアウトして作業用ブランチを作成する、自己完結したローカルの例を実行します。
このセクションのコードと表示されるラベルや出力は英語のままです。
workdir="$(mktemp -d)"
trap 'rm -rf "$workdir"' EXIT
cd "$workdir"
git init -q
git config user.name "Example User"
git config user.email "example@example.com"
printf 'Release snapshot\n' > README.md
git add README.md
git commit -qm "Add release snapshot"
git tag -a v1.0 -m "Release 1.0"
git checkout -q v1.0
git switch -q -c release-work
printf 'Checked out release-work\n'
Checked out release-work
タグからブランチを作成する
タグを起点にコミットを作成する予定がある場合は、そのタグからブランチを作成してください。たとえば、git switch -c release-work v1.0 は v1.0 から始まる release-work を作成し、チェックアウトします。従来の同等な形式は git checkout -b release-work v1.0 です。新しいブランチはタグが指すコミットから始まり、以降のコミットによってブランチは進みます。一方、誰かが移動しない限り、タグは元の参照先を指し続けます。
すでにタグをチェックアウトしている場合は、git switch -c release-work で現在のコミットからブランチを作成できます。これは detached-HEAD 状態で始めた作業を残すための実用的な方法です。
最新のタグを見つけてチェックアウトする
「最新」は、バージョン番号が最も大きいタグを指す場合も、現在のコミットから到達可能なタグのうち最も新しいものを指す場合もあります。これは別の問いであり、タグ名を辞書順で並べて最後のものを選んでも、どちらの答えも確実には得られません。必要なら先にフェッチし、git tag --list 'v*' --sort=-version:refname でバージョン形式の名前を一覧表示して、意図したリリースを選んでください。書式が統一されたバージョン名ならバージョン順での並べ替えが役立ちますが、現在のコミットの履歴上でどのタグが最も近いかは分かりません。
現在のコミットから到達可能な説明用のタグを調べるには、git describe --tags を使います。Git のコミット履歴上の規則に従ってタグを選び、現在のコミット自体にタグが付いていない場合は、コミットまでの距離や短縮 ID が付くことがあります。必ずしも最大のバージョン番号や最も最近作成されたタグが選ばれるわけではありません。また、タグの作成日順に並べるコマンドでもありません。目的の名前を選んだら、確認には git checkout <tag-name> を、そこから作業を始めるには git switch -c <branch-name> <tag-name> を使います。
チェックアウトしたコミットを確認する
git status --short --branch、git rev-parse HEAD、git show --no-patch --decorate --oneline HEAD を使って、到達したコミットと状態を確認します。git rev-parse HEAD が示すコミット ID は、現在チェックアウトされているコミットです。status の出力から、ブランチ上にいるか detached-HEAD 状態かを確認できます。装飾付きのコミット表示には、そのコミットを指すタグが表示される場合があります。
タグ名だけでは、作業ツリーがそのタグの位置にある証拠にはなりません。特に似た名前のブランチやタグがある場合は、チェックアウト後にコミットを確認してください。タグからブランチを作成した場合は、status にブランチ名が表示され、HEAD は引き続き現在のコミットを示します。