はじめに
チーム開発で「新機能を開発しながら、同時にバグ修正も進めたい」という場面に遭遇したことはありませんか。Gitのブランチ機能を使えば、メインの開発ラインに影響を与えることなく、複数の作業を並行して進めることができます。
本記事では、Gitブランチの概念と基本操作を図解とともに解説します。ブランチがどのように動作するのか、なぜ軽量で高速なのかを理解することで、日々の開発作業を効率化できるようになります。この記事を読み終えると、以下のことができるようになります。
- ブランチの概念(ポインタとしての仕組み)を理解できる
git branchでブランチを作成・一覧表示・削除できるgit switch(またはgit checkout)でブランチを切り替えられる- HEADの役割と動作を理解できる
- 並行開発のワークフローを実践できる
実行環境と前提条件
本記事の内容は、以下の環境で動作確認を行っています。
| 項目 | 要件 |
|---|---|
| Git | 2.40以上 |
| OS | Windows 10/11、macOS 12以上、Ubuntu 22.04以上 |
| ターミナル | コマンドプロンプト、PowerShell、Terminal.app、bash等 |
| エディタ | VS Code推奨 |
前提条件として、以下の知識があることを想定しています。
- コマンドライン操作の基礎知識(
cd、ls/dir、mkdir等) - テキストエディタの基本操作
- Gitの基本コマンド(
git init、git add、git commit、git status)の理解
Gitのバージョンは以下のコマンドで確認できます。
|
|
Git 2.23以降ではgit switchコマンドが利用可能です。本記事ではgit switchを主に使用しますが、従来のgit checkoutについても解説します。
Gitブランチとは何か
ブランチはコミットへのポインタ
Gitにおけるブランチとは、特定のコミットを指し示す軽量なポインタ(参照)です。多くのバージョン管理システムでは、ブランチを作成する際にプロジェクト全体のファイルをコピーしますが、Gitではコミットのハッシュ値(40文字)を記録した小さなファイルを作成するだけです。
このため、Gitのブランチ作成は非常に高速で、プロジェクトのサイズに関係なく瞬時に完了します。
gitGraph commit id: "C1" commit id: "C2" commit id: "C3" commit id: "C4" tag: "main (ブランチ = ポインタ)"
上の図では、mainブランチはコミットC4を指しています。新しいコミットを作成すると、ブランチポインタは自動的に最新のコミットに移動します。
ブランチの内部構造
Gitの内部では、ブランチは.git/refs/heads/ディレクトリ内のファイルとして保存されています。
|
|
実行結果の例:
|
|
この40文字の文字列がコミットのハッシュ値であり、ブランチが指しているコミットを表しています。
HEADの役割と動作
HEADとは何か
HEADは、現在チェックアウトしているブランチを指す特別なポインタです。「自分が今どのブランチで作業しているか」を示す目印と考えてください。
flowchart LR
C1 --> C2 --> C3 --> C4
C4 -.-> main["↑<br>main"]
main -.-> HEAD["↑<br>HEAD (現在の作業ブランチ)"]HEADは通常、ブランチを指しており、そのブランチが指すコミットが現在の作業状態となります。
HEADの確認方法
現在のHEADの状態は、以下のコマンドで確認できます。
|
|
実行結果の例:
|
|
この出力は、HEADがmainブランチを指していることを示しています。
また、git logコマンドでもHEADの位置を確認できます。
|
|
実行結果の例:
|
|
HEAD -> mainという表記は、HEADがmainブランチを指していることを示しています。
git branchコマンドによるブランチ操作
ブランチの一覧表示
現在のリポジトリに存在するブランチを確認するには、git branchコマンドを使用します。
|
|
実行結果の例:
|
|
アスタリスク(*)が付いているブランチが、現在チェックアウトしているブランチです。
リモートブランチも含めて表示する場合は、-aオプションを使用します。
|
|
実行結果の例:
|
|
ブランチの作成
新しいブランチを作成するには、git branchコマンドにブランチ名を指定します。
|
|
このコマンドは、現在のHEADが指すコミットを起点として新しいブランチを作成します。ただし、ブランチの切り替えは行われません。
|
|
作成されたブランチを確認します。
|
|
実行結果:
|
|
mainにアスタリスクが付いていることから、まだmainブランチにいることがわかります。
特定のコミットからブランチを作成
過去のコミットを起点としてブランチを作成することもできます。
|
|
ブランチの削除
不要になったブランチを削除するには、-dオプションを使用します。
|
|
実行結果の例:
|
|
マージされていないブランチを削除しようとすると、エラーが発生します。
|
|
実行結果:
|
|
マージされていないブランチを強制的に削除する場合は、-Dオプション(大文字)を使用します。
|
|
ブランチ名の変更
ブランチ名を変更するには、-mオプションを使用します。
|
|
git switchによるブランチの切り替え
git switchコマンドの基本
Git 2.23で導入されたgit switchコマンドは、ブランチの切り替えに特化したコマンドです。従来のgit checkoutよりも直感的で、誤操作のリスクが低くなっています。
|
|
実行結果の例:
|
|
ブランチを切り替えると、HEADが新しいブランチを指すように移動し、作業ディレクトリのファイルがそのブランチの状態に更新されます。
|
|
ブランチの作成と切り替えを同時に行う
新しいブランチを作成して、すぐにそのブランチに切り替えたい場合は、-cオプションを使用します。
|
|
実行結果の例:
|
|
これは以下の2つのコマンドを実行するのと同じです。
|
|
直前のブランチに戻る
直前に作業していたブランチに戻るには、-を使用します。
|
|
実行結果の例:
|
|
この機能は、2つのブランチを頻繁に行き来する場合に便利です。
作業中の変更がある場合
未コミットの変更がある状態でブランチを切り替えようとすると、変更が失われる可能性がある場合はエラーになります。
|
|
実行結果の例:
|
|
この場合、以下のいずれかの対処が必要です。
- 変更をコミットする
- 変更をスタッシュする(
git stash) - 変更を破棄する(
git switch --discard-changes)
|
|
git checkoutとの比較
git checkoutの問題点
従来のgit checkoutコマンドは、多くの機能を1つのコマンドに詰め込んでいました。
- ブランチの切り替え
- 新しいブランチの作成と切り替え
- ファイルの復元
- 特定のコミットのチェックアウト
このため、初心者にとっては混乱しやすく、誤操作のリスクがありました。
git switchとgit restoreの役割分担
Git 2.23以降では、git checkoutの機能が2つのコマンドに分割されました。
| コマンド | 役割 |
|---|---|
git switch |
ブランチの切り替え |
git restore |
ファイルの復元 |
この分割により、各コマンドの目的が明確になり、誤操作を防ぎやすくなっています。
git checkoutの使用例
git checkoutは引き続き使用可能です。既存のスクリプトやドキュメントとの互換性のため、使い方を知っておくことは重要です。
|
|
ブランチを使った並行開発の実践
機能開発のワークフロー
実際の開発では、以下のようなワークフローでブランチを活用します。
|
|
|
|
この図では、mainブランチのC2コミットからfeature-user-profileブランチを作成し、独立して開発を進めています。mainブランチも別の作業(C3、C4)が進んでいます。
ブランチの状態確認
複数のブランチがある場合、各ブランチの状態を確認する方法を紹介します。
|
|
実行結果の例:
|
|
ブランチの分岐をグラフで確認
ブランチの分岐状況を視覚的に確認するには、git logコマンドに--graphオプションを使用します。
|
|
実行結果の例:
|
|
Detached HEAD状態について
Detached HEADとは
通常、HEADはブランチを指していますが、特定のコミットを直接チェックアウトすると、HEADがブランチではなくコミットを直接指す状態になります。これを「Detached HEAD」状態と呼びます。
|
|
実行結果の例:
|
|
|
|
Detached HEAD状態での注意点
Detached HEAD状態でコミットを作成すると、そのコミットはどのブランチにも属さない「孤立したコミット」になります。別のブランチに切り替えると、これらのコミットは参照できなくなり、最終的にガベージコレクションで削除されます。
Detached HEAD状態で行った作業を保存したい場合は、新しいブランチを作成します。
|
|
通常のブランチに戻る
Detached HEAD状態から抜け出すには、既存のブランチに切り替えます。
|
|
ブランチ命名のベストプラクティス
効果的なブランチ名は、チームのコミュニケーションを円滑にします。
推奨されるブランチ命名規則
| プレフィックス | 用途 | 例 |
|---|---|---|
feature/ |
新機能開発 | feature/user-authentication |
bugfix/ |
バグ修正 | bugfix/login-error |
hotfix/ |
緊急修正 | hotfix/security-patch |
release/ |
リリース準備 | release/v1.2.0 |
docs/ |
ドキュメント更新 | docs/api-reference |
ブランチ名のルール
- 英数字とハイフン(
-)、スラッシュ(/)を使用する - スペースや日本語は避ける
- 短くわかりやすい名前にする
- チケット番号を含めると追跡しやすい(例:
feature/PROJ-123-user-login)
ブランチ操作コマンドまとめ
git branchコマンド一覧
| コマンド | 説明 |
|---|---|
git branch |
ブランチ一覧を表示 |
git branch -a |
リモートブランチも含めて表示 |
git branch -v |
各ブランチの最新コミットを表示 |
git branch <name> |
ブランチを作成 |
git branch -d <name> |
マージ済みブランチを削除 |
git branch -D <name> |
ブランチを強制削除 |
git branch -m <new> |
現在のブランチ名を変更 |
git branch -m <old> <new> |
指定したブランチ名を変更 |
git switchコマンド一覧
| コマンド | 説明 |
|---|---|
git switch <branch> |
ブランチを切り替え |
git switch -c <name> |
ブランチを作成して切り替え |
git switch - |
直前のブランチに切り替え |
git switch --detach <commit> |
特定のコミットをチェックアウト |
git switch --discard-changes <branch> |
変更を破棄して切り替え |
git checkoutコマンドとの対応
| git checkout | git switch/restore |
|---|---|
git checkout <branch> |
git switch <branch> |
git checkout -b <name> |
git switch -c <name> |
git checkout - |
git switch - |
git checkout -- <file> |
git restore <file> |
まとめ
本記事では、Gitブランチの概念と基本操作について解説しました。重要なポイントを振り返ります。
- ブランチはポインタ:Gitのブランチはコミットを指す軽量なポインタであり、作成・削除が高速
- HEADは現在地:HEADは現在チェックアウトしているブランチを指す特別なポインタ
- git branchで管理:ブランチの作成、一覧表示、削除、名前変更を行う
- git switchで切り替え:Git 2.23以降で推奨される、ブランチ切り替え専用コマンド
- 並行開発が可能:ブランチを活用することで、複数の作業を独立して進められる
ブランチ操作を習得することで、チーム開発における並行作業が効率的に行えるようになります。次のステップとして、ブランチのマージやコンフリクト解消について学ぶことで、より実践的なGit運用スキルを身につけることができます。