バージョン管理システムは、ソフトウェアプロジェクトに対する変更を追跡、管理できる有益なツールです。ソフトウェアコードの変更内容をすべて記録し、プロジェクトの履歴をすべてデータベースに保存します。このシステムのおかげで、開発者は共同作業をしたり、新機能を実験したり、必要に応じて変更をロールバックしたりできます。現在最も広く使用されているバージョン管理システムが Git です。Git を継続的インテグレーション & 継続的デリバリー (CI/CD) パイプラインと組み合わせると、ソフトウェアをデプロイ可能な安定状態に保ちながら、新機能の迅速なイテレーションとリリースを行えます。

Git の 2 つの重要なコンセプトが、タグとブランチです。これらを活用することで、1 つのプロジェクトについて、異なるバージョンの作業を同時に進めることができます。どちらも、開発作業の整理に重要な役割を果たします。変更の追跡、管理を容易にする点は共通していますが、開発プロセスで果たす役割はそれぞれ異なります。タグは、プロジェクトタイムラインの重要な時点を示すマーカーとして使います。一方、ブランチは、開発中のコードを分離して、後からメインのアプリケーションコードにマージするためのものです。

この記事では、開発を整然と効率的に進めるのに役立つ Git のタグとブランチの相違点を説明します。

Git tag とは?

Git タグとは、本のしおりのように、プロジェクト履歴内の特定のコミットを参照するオブジェクトです。新しいバージョンのリリースやコードベースの大幅変更など、今後開発で参照する可能性のあるイベントのタイミングでタグを作成します。セマンティックバージョニングを使用して、あるタグから次のタグの間に行われた変更の種類を示すのが一般的です。

タグは、一度作成すると以降のコミットで変更することはできません。しかし、特定のタグをタグ名で簡単に参照できるというメリットがあります。タグを使用すれば、コードベースのバージョンをタグ付きのものに切り替え、そのタグが作成された時点のコードがどのようなものだったのかを確認できるようになります。必要に応じて、特定のバージョンのコードベースに戻すという使い方も可能です。

git tag コマンドの使い方

git tag コマンドを使って、タグの作成、一覧表示、削除、確認ができます。例として、git tag コマンドを使って新しいバージョンのアプリケーションコードを指定する方法を紹介します。

まず、リポジトリの最新のコミットに v1.0.0 という新しいタグを付けます。次のコマンドを実行します。

git tag v1.0.0

リポジトリ内のすべてのタグを一覧表示するには、次のコマンドを実行します。

git tag

git tag コマンドでは、特定のタグを確認することもできます。次のコマンドは、v1.0.0 タグが存在することを確認し、タグ付けツール、作成日、メッセージなどの詳細を表示します。

git tag -v v1.0.0

最後に、 git tagコマンドを使ってタグを削除します。 v1.0.0タグを削除するには、次のコマンドを実行します。

git tag -d v1.0.0

タグを削除しても、リポジトリ内のコードに影響はありません。タグラベルが削除されるだけです。

Git branch とは?

Git ブランチとは、コード内の最新のコミットを参照するポインター (ブランチヘッド) を含む独立した開発コード行のことです。1 つの Git リポジトリで複数のブランチを追跡できますが、ワークツリーにチェックアウトできるのは 1 つのブランチだけです。ヘッドはブランチの先頭 (最新のコミット) を参照します。

コードのリポジトリを作成すると、ブランチが 1 つ自動的に生成されます。これがデフォルトのブランチで、main (メイン) ブランチとも呼ばれます。コードを記述してコミットすると、そのコミットは自動的に作業ブランチに記録されます。

git branch コマンドの使い方

git branch コマンドを使って、ブランチの作成、一覧表示、名前変更、削除ができます。このコマンドでブランチを切り替えることはできません。 以下に、git branch の使い方の例を示します。 まず、dev という名前の新しいブランチを作成するには、以下のコマンドを実行します。

git branch dev

次は、この dev ブランチに切り替えます。以下のコマンドを実行します。

git switch dev

次に、コードに変更を加えて、いつもの git add コマンドと git commit コマンドを使用して dev ブランチにコミットします。

dev ブランチの変更を main ブランチにマージするには、以下のコマンドを実行します。

git merge dev

git branch コマンドを使用すると、リポジトリに含まれるすべてのブランチを一覧表示できます。現在作業しているブランチには、アスタリスク (*) が示されます。

git branch

git branch コマンドを使用して、ブランチの名前を変更することもできます。dev ブランチの名前を development に変更するには、以下のコマンドを実行します。

git branch -m dev development

最後に、git branch コマンドでブランチを削除します。development ブランチを削除するには、以下のコマンドを実行します。

git branch -d development

現在作業しているブランチを削除することはできません。先に、別のブランチに切り替える必要があります。

Git のタグとブランチの相違点

タグとブランチはどちらも、コードベースのバージョンを管理するためのものです。二者択一というわけではなく、一緒に使用します。

ブランチは通常、新機能開発やバグ修正に使います。ブランチを使うと、メインのコードベースに影響を与えることなく作業できます。作業が完了したら、ブランチをメインコードベースにマージして、変更をアプリケーションに統合します。このしくみのおかげで、複数人がプロジェクトの異なる部分に同時に取り組むことができるほか、メインコードベースの安定性を損なうことなく新しいアイデアを試すこともできます。

タグは、ブランチとは異なり、進行中の開発用ではありません。リポジトリの履歴の特定時点をマークし、開発タイムラインの重要なマイルストーンを簡単に参照できるようにするものです。

ブランチを使うべき場面

ソフトウェアプロジェクトのコードベースに新機能を追加すると想像してみてください。新機能が期待どおり動作するかわからないので、メインのコードベースに影響を与えない形で実験したいところです。

このようなシナリオでは、Git ブランチを使用して、新機能用に分離した開発ラインを作成しましょう。こうすれば、メインコードベースに影響が及ぶのを回避できます。機能が完成してテストも終わったら、ブランチをメインコードベースにマージします。組織のプロセスによっては、整理のためにブランチを削除してもよいでしょう。

タグを使うべき場面

今度は、新機能が完成してテストも終わった状況を考えてください。新しいソフトウェアバージョンをユーザーにリリースするタイミングです。この場合は、Git タグを使って、現在の状態のコードベースを新バージョンのリリースとしてマークしましょう。

タグの名前はバージョン番号を反映したもの (v1.2.3 など) にし、リリースの変更点の簡単な説明を含めることをおすすめします。こうすれば、リリース済みの特定バージョンのコードベースを簡単に参照できるようになります。必要に応じて、以前のバージョンへのロールバックも簡単に行えます。

CI/CD パイプラインで Git のタグとブランチを使用する

タグとブランチは、開発プロセスを整理して効率化するうえで重要なツールです。タグとブランチを使うと、開発の進捗を手作業で調整およびレビューしやすくなるだけでなく、継続的インテグレーション & 継続的デリバリー (CI/CD) パイプラインで開発プロセスを自動化、オーケストレーション、監視する際にも役立ちます。

たとえば、CircleCI などの CI/CD ツールを使うと、新機能のブランチのコードを自動的にビルド、テストし、そのコードがメインのコードベースに統合可能な状態であるかどうかを確認できます。このようにすることで、本番ブランチを安定状態に保ったまま、既存の機能を損なうことなく、新機能を迅速かつ安全に開発し追加できます。

CI/CD パイプラインにはさまざまな種類があります。開発に適したブランチ戦略としては、以下のようなものがあります。

  • Git フローモデル: 2 つの主要ブランチ (開発とメイン) と、開発ステージごとにいくつかの補助ブランチを使う
  • 機能ブランチモデル: 開発する新機能ごとに個別のブランチを使う
  • トランクベースモデル: すべての開発に 1 つのメインブランチを使う。一時ブランチを使って、小さな単位でコードを頻繁にメインブランチにチェックインする

プロジェクトに最適な戦略は、チームそれぞれのニーズと目標によって変わります。しかし、効率に優れた DevOps チームであれば、小さな変更をメインコードベースに直接かつ頻繁に行うことを重視して、フィードバックループを高速化することで、チームのスピードを高めています。したがって、継続的インテグレーション パイプラインの価値を最大限に引き出したいのであれば、トランクベース開発が最適です。

CircleCI で Git のタグとブランチを使用する

CircleCI パイプラインで機能を管理、テスト、デプロイ、リリースする場合、さまざまな方法でブランチとタグを活用できます。

CircleCI では、タグをパイプラインのトリガーとして使用できます。特定のタグを指定すると、そのタグがコミットに追加されたときにパイプラインを自動的にトリガーして実行できます。このようにすると、自動テストや、本番環境へのコードのデプロイなどに役立ちます。

また、タグを使用して、パイプライン実行の進捗状況を追跡することもできます。タグを使って、パイプラインの特定のステップが完了したことを示すのです。このようにすると、パイプラインの全体的な進捗状況を追跡して、潜在的な問題を特定するのに役立ちます。タグは他にも、Insights ダッシュボードで特定のワークフローをフィルター処理するのにも使えます。こうすれば、ビルド速度やパフォーマンスなど、チームのデリバリープロセスの最適化に役立つ実用的なメトリックを把握できます。

ブランチフィルターとタグフィルター

CircleCI のブランチフィルターとタグフィルターでは、パイプラインに含めるブランチとタグを指定できます。ブランチフィルターを使うと、特定のブランチに加えられた変更に対してのみワークフロー (またはワークフロー内の特定のジョブ) を実行できます。このようにすると、特定のジョブ (テストのサブセットを実行する、コードを本番環境にデプロイするなど) の対象をそのアクティビティ専用のブランチに制限できるので便利です。

同様に、Git タグで、CircleCI でのワークフローを自動的に実行することもできます。CircleCI のコンフィグファイルで filters キーを使い、ワークフローのトリガーとなるタグを指定します。

CircleCI のワークフローでブランチフィルターとタグフィルターを使用するには、CircleCI コンフィグファイルの workflows セクションでフィルターを指定します。CircleCI のブランチフィルターとタグフィルターを使用すると、パイプラインを細かく調整して、変更のビルド、テスト、デプロイのタイミングと方法を制御できます。

タグを利用したワークフローの監視

CircleCI インサイトのダッシュボードを使うと、ワークフローを監視し、ビルドのパフォーマンスを追跡できます。

このダッシュボードを利用するには、CircleCI Web アプリを開いて [Insights (インサイト)] タブをクリックします。これで、重要なメトリクスを示すダッシュボードが表示されます。パイプラインのパフォーマンスの推移や、リソースやクレジット消費量に関するデータも確認できるので、コストの予想や制御に役立ちます。

Insights ダッシュボード

フィルターを使うと、表示するデータを特定のタグでトリガーされたパイプラインだけに絞り込むことができます。

Git tag によってフィルターされたパイプライン

このようにすると、成功率やワークフローの実行時間などの情報を追跡したり、所定のタグで行われた最近のワークフロー実行を確認したりできます。

Summary metrics

おわりに

Git を使っている多くの開発チームが、Git ブランチと Git タグの両方を頻繁に活用しています。ブランチを使うと、メインコードブランチに影響を与えることなく機能のコーディングやバグの修正ができます。また、タグは、コード内の特定の時点 (アプリケーションの新リリースなど) をマーキングするのに不可欠です。

ブランチとタグを組み合わせることで、ワークフローを最適化できます。さらに CircleCI も一緒に使うと、CI/CD プロセスがより柔軟かつ機能的なものになります。ビルド、テスト、デプロイのオーケストレーションと効率化に便利なうえ、優先度の高いビルドのパフォーマンス監視に役立ちます。

効果的なブランチ/タグ戦略と業界トップレベルの CI/CD を組み合わせれば、ソフトウェアデリバリーを大きく効率化できます。ぜひ、無料の CircleCI アカウントでお試しください。