はじめに

チーム開発で「新機能を開発しながら、同時にバグ修正も進めたい」という場面に遭遇したことはありませんか。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推奨

前提条件として、以下の知識があることを想定しています。

  • コマンドライン操作の基礎知識(cdls/dirmkdir等)
  • テキストエディタの基本操作
  • Gitの基本コマンド(git initgit addgit commitgit status)の理解

Gitのバージョンは以下のコマンドで確認できます。

1
git --version

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/ディレクトリ内のファイルとして保存されています。

1
2
# ブランチファイルの内容を確認
cat .git/refs/heads/main

実行結果の例:

1
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0

この40文字の文字列がコミットのハッシュ値であり、ブランチが指しているコミットを表しています。

HEADの役割と動作

HEADとは何か

HEADは、現在チェックアウトしているブランチを指す特別なポインタです。「自分が今どのブランチで作業しているか」を示す目印と考えてください。

flowchart LR
    C1 --> C2 --> C3 --> C4
    C4 -.-> main["↑<br>main"]
    main -.-> HEAD["↑<br>HEAD (現在の作業ブランチ)"]

HEADは通常、ブランチを指しており、そのブランチが指すコミットが現在の作業状態となります。

HEADの確認方法

現在のHEADの状態は、以下のコマンドで確認できます。

1
2
# HEADの参照先を確認
cat .git/HEAD

実行結果の例:

1
ref: refs/heads/main

この出力は、HEADがmainブランチを指していることを示しています。

また、git logコマンドでもHEADの位置を確認できます。

1
2
# HEADとブランチの位置を確認
git log --oneline --decorate -5

実行結果の例:

1
2
3
4
5
a1b2c3d (HEAD -> main) 最新のコミットメッセージ
e5f6g7h 2番目のコミット
i9j0k1l 3番目のコミット
m3n4o5p 4番目のコミット
q7r8s9t 5番目のコミット

HEAD -> mainという表記は、HEADがmainブランチを指していることを示しています。

git branchコマンドによるブランチ操作

ブランチの一覧表示

現在のリポジトリに存在するブランチを確認するには、git branchコマンドを使用します。

1
2
# ローカルブランチの一覧表示
git branch

実行結果の例:

1
2
3
* main
  feature-login
  bugfix-header

アスタリスク(*)が付いているブランチが、現在チェックアウトしているブランチです。

リモートブランチも含めて表示する場合は、-aオプションを使用します。

1
2
# すべてのブランチを表示(ローカル + リモート)
git branch -a

実行結果の例:

1
2
3
4
5
* main
  feature-login
  bugfix-header
  remotes/origin/main
  remotes/origin/feature-login

ブランチの作成

新しいブランチを作成するには、git branchコマンドにブランチ名を指定します。

1
2
# 新しいブランチを作成
git branch feature-signup

このコマンドは、現在のHEADが指すコミットを起点として新しいブランチを作成します。ただし、ブランチの切り替えは行われません。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[ブランチ作成後の状態]

コミット履歴:
  C1 <-- C2 <-- C3 <-- C4
                        ^
                        |
                      main
                      feature-signup (新規作成)
                        ^
                        |
                      HEAD (まだmainを指している)

作成されたブランチを確認します。

1
git branch

実行結果:

1
2
  feature-signup
* main

mainにアスタリスクが付いていることから、まだmainブランチにいることがわかります。

特定のコミットからブランチを作成

過去のコミットを起点としてブランチを作成することもできます。

1
2
3
4
5
# 特定のコミットからブランチを作成
git branch hotfix-security a1b2c3d

# 2つ前のコミットからブランチを作成
git branch experiment HEAD~2

ブランチの削除

不要になったブランチを削除するには、-dオプションを使用します。

1
2
# マージ済みのブランチを削除
git branch -d feature-signup

実行結果の例:

1
Deleted branch feature-signup (was a1b2c3d).

マージされていないブランチを削除しようとすると、エラーが発生します。

1
git branch -d unmerged-feature

実行結果:

1
2
error: The branch 'unmerged-feature' is not fully merged.
If you are sure you want to delete it, run 'git branch -D unmerged-feature'.

マージされていないブランチを強制的に削除する場合は、-Dオプション(大文字)を使用します。

1
2
# 強制削除(変更が失われる可能性あり)
git branch -D unmerged-feature

ブランチ名の変更

ブランチ名を変更するには、-mオプションを使用します。

1
2
3
4
5
# 現在のブランチ名を変更
git branch -m new-branch-name

# 指定したブランチ名を変更
git branch -m old-name new-name

git switchによるブランチの切り替え

git switchコマンドの基本

Git 2.23で導入されたgit switchコマンドは、ブランチの切り替えに特化したコマンドです。従来のgit checkoutよりも直感的で、誤操作のリスクが低くなっています。

1
2
# ブランチを切り替え
git switch feature-login

実行結果の例:

1
Switched to branch 'feature-login'

ブランチを切り替えると、HEADが新しいブランチを指すように移動し、作業ディレクトリのファイルがそのブランチの状態に更新されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[ブランチ切り替え後の状態]

コミット履歴:
  C1 <-- C2 <-- C3 <-- C4
                        ^
                        |
                      main
                      feature-login
                        ^
                        |
                      HEAD (feature-loginに移動)

ブランチの作成と切り替えを同時に行う

新しいブランチを作成して、すぐにそのブランチに切り替えたい場合は、-cオプションを使用します。

1
2
# ブランチを作成して切り替え
git switch -c feature-payment

実行結果の例:

1
Switched to a new branch 'feature-payment'

これは以下の2つのコマンドを実行するのと同じです。

1
2
git branch feature-payment
git switch feature-payment

直前のブランチに戻る

直前に作業していたブランチに戻るには、-を使用します。

1
2
# 直前のブランチに切り替え
git switch -

実行結果の例:

1
Switched to branch 'main'

この機能は、2つのブランチを頻繁に行き来する場合に便利です。

作業中の変更がある場合

未コミットの変更がある状態でブランチを切り替えようとすると、変更が失われる可能性がある場合はエラーになります。

1
git switch feature-login

実行結果の例:

1
2
3
4
error: Your local changes to the following files would be overwritten by checkout:
        src/app.js
Please commit your changes or stash them before you switch branches.
Aborting

この場合、以下のいずれかの対処が必要です。

  1. 変更をコミットする
  2. 変更をスタッシュする(git stash
  3. 変更を破棄する(git switch --discard-changes
1
2
# 変更を破棄してブランチを切り替え(注意:変更が失われます)
git switch --discard-changes feature-login

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は引き続き使用可能です。既存のスクリプトやドキュメントとの互換性のため、使い方を知っておくことは重要です。

1
2
3
4
5
6
7
8
# ブランチを切り替え(git switch と同等)
git checkout feature-login

# ブランチを作成して切り替え(git switch -c と同等)
git checkout -b feature-payment

# 直前のブランチに切り替え(git switch - と同等)
git checkout -

ブランチを使った並行開発の実践

機能開発のワークフロー

実際の開発では、以下のようなワークフローでブランチを活用します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 1. mainブランチを最新の状態にする
git switch main
git pull origin main

# 2. 機能開発用のブランチを作成して切り替え
git switch -c feature-user-profile

# 3. 機能を開発(ファイルの編集、コミット)
# ... ファイルを編集 ...
git add .
git commit -m "ユーザープロフィール画面の追加"

# ... さらに編集 ...
git add .
git commit -m "プロフィール編集機能の実装"

# 4. 開発完了後、mainブランチに切り替え
git switch main
1
2
3
4
5
6
7
8
9
[並行開発の履歴イメージ]

                feature-user-profile
                       |
          C5 <-- C6 <-- C7
         /
C1 <-- C2 <-- C3 <-- C4
                      |
                    main

この図では、mainブランチのC2コミットからfeature-user-profileブランチを作成し、独立して開発を進めています。mainブランチも別の作業(C3、C4)が進んでいます。

ブランチの状態確認

複数のブランチがある場合、各ブランチの状態を確認する方法を紹介します。

1
2
# 各ブランチの最新コミットを表示
git branch -v

実行結果の例:

1
2
3
  feature-user-profile a1b2c3d プロフィール編集機能の実装
* main                 e5f6g7h Merge pull request #42
  bugfix-header        i9j0k1l ヘッダーのレイアウト修正

ブランチの分岐をグラフで確認

ブランチの分岐状況を視覚的に確認するには、git logコマンドに--graphオプションを使用します。

1
2
# グラフ形式でブランチの分岐を表示
git log --oneline --graph --all

実行結果の例:

1
2
3
4
5
6
* e5f6g7h (HEAD -> main) Merge pull request #42
|\
| * a1b2c3d (feature-user-profile) プロフィール編集機能の実装
| * m3n4o5p ユーザープロフィール画面の追加
|/
* q7r8s9t 初期セットアップ

Detached HEAD状態について

Detached HEADとは

通常、HEADはブランチを指していますが、特定のコミットを直接チェックアウトすると、HEADがブランチではなくコミットを直接指す状態になります。これを「Detached HEAD」状態と呼びます。

1
2
# 特定のコミットをチェックアウト
git switch --detach a1b2c3d

実行結果の例:

1
HEAD is now at a1b2c3d プロフィール編集機能の実装
1
2
3
4
5
6
7
8
9
[Detached HEAD状態]

コミット履歴:
  C1 <-- C2 <-- C3 <-- C4
                ^
                |
              HEAD (ブランチではなくコミットを直接指す)
                |
              main (C4を指したまま)

Detached HEAD状態での注意点

Detached HEAD状態でコミットを作成すると、そのコミットはどのブランチにも属さない「孤立したコミット」になります。別のブランチに切り替えると、これらのコミットは参照できなくなり、最終的にガベージコレクションで削除されます。

Detached HEAD状態で行った作業を保存したい場合は、新しいブランチを作成します。

1
2
# 現在の状態から新しいブランチを作成
git switch -c save-my-work

通常のブランチに戻る

Detached HEAD状態から抜け出すには、既存のブランチに切り替えます。

1
git switch main

ブランチ命名のベストプラクティス

効果的なブランチ名は、チームのコミュニケーションを円滑にします。

推奨されるブランチ命名規則

プレフィックス 用途
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運用スキルを身につけることができます。

参考リンク