Gitブランチ管理のすべて:基本操作からチーム戦略まで

Gitの最重要機能であるブランチの包括的なガイド。基本的な操作から、マージ、リベース、コンフリクト解決、そしてGit FlowやGitHub Flowといったチームでのブランチ戦略まで、実用的なコマンド例と共に解説します。

git Gitbranchversion controlGit FlowGitHub Flow

ブランチ管理

Gitブランチの作成、切り替え、マージ、削除などの包括的な管理ガイド

ブランチとは

ブランチは、開発の分岐点を作成し、並行して複数の機能開発やバグ修正を行うためのGitの核心機能です。メインの開発ラインに影響を与えることなく、独立した作業環境を提供します。

基本的なブランチ操作

ブランチの確認

git branch                    # ローカルブランチ一覧
git branch -r                 # リモートブランチ一覧
git branch -a                 # 全ブランチ一覧
git branch -v                 # 各ブランチの最新コミット情報も表示

ブランチの作成

git branch <ブランチ>        # ブランチ作成(切り替えなし)
git checkout -b <ブランチ>   # ブランチ作成と切り替え
git switch -c <ブランチ>     # 新しい記法(Git 2.23以降)

# 特定のコミットからブランチ作成
git branch <ブランチ> <コミットハッシ>
git checkout -b <ブランチ> <コミットハッシ>

ブランチの切り替え

git checkout <ブランチ>      # 従来の記法
git switch <ブランチ>        # 新しい記法(推奨)

# 直前のブランチに戻る
git checkout -
git switch -

ブランチの削除

git branch -d <ブランチ>     # マージ済みブランチの削除
git branch -D <ブランチ>     # 強制削除(未マージでも削除)

# リモートブランチの削除
git push origin --delete <ブランチ>
git push origin :<ブランチ>   # 短縮形

ブランチのマージ

Fast-forwardマージ

# mainブランチに切り替え
git checkout main

# feature-branchをマージ
git merge feature-branch

# Fast-forwardを強制的に無効化(マージコミットを作成)
git merge --no-ff feature-branch

3-wayマージ

# 複数の親を持つマージコミットが自動作成される
git merge feature-branch

# マージコミットにメッセージを指定
git merge feature-branch -m "Feature: 新機能を追加"

Squash マージ

# 複数のコミットを1つにまとめてマージ
git merge --squash feature-branch
git commit -m "Feature: 新機能を追加(複数コミットをsquash)"

リベース(Rebase)

基本的なリベース

# feature-branchでの作業をmainの最新状態に再適用
git checkout feature-branch
git rebase main

# または
git rebase main feature-branch

インタラクティブリベース

# 過去3つのコミットを編集
git rebase -i HEAD~3

# リベース中のオプション
# pick: コミットをそのまま使用
# reword: コミットメッセージを編集
# edit: コミットを編集(ファイルも変更可能)
# squash: 前のコミットと結合
# drop: コミットを削除

リベース vs マージの使い分け

# マージ: 履歴を保持したい場合
git merge feature-branch

# リベース: 線形な履歴を保ちたい場合
git rebase main

ブランチ戦略

Git Flow

# 開発ブランチから機能ブランチを作成
git checkout develop
git checkout -b feature/new-feature

# 開発完了後、developにマージ
git checkout develop
git merge --no-ff feature/new-feature
git branch -d feature/new-feature

# リリース準備
git checkout -b release/v1.0.0 develop

# リリース後
git checkout main
git merge --no-ff release/v1.0.0
git tag v1.0.0
git checkout develop
git merge --no-ff release/v1.0.0

GitHub Flow

# mainから機能ブランチを作成
git checkout main
git pull origin main
git checkout -b feature/new-feature

# 開発とプッシュ
git add .
git commit -m "feat: 新機能を追加"
git push origin feature/new-feature

# プルリクエスト作成・レビュー・マージ後
git checkout main
git pull origin main
git branch -d feature/new-feature

Feature Branch Workflow

# 各機能を独立したブランチで開発
git checkout -b feature/user-authentication
git checkout -b feature/payment-system
git checkout -b bugfix/login-issue

# 開発完了後にmainにマージ

リモートブランチとの連携

リモートブランチの取得

git fetch origin               # 全てのリモートブランチ情報を取得
git fetch origin <ブランチ>  # 特定ブランチのみ取得

リモートブランチのチェックアウト

# リモートブランチをローカルにチェックアウト
git checkout -b <ローカルブランチ> origin/<リモートブランチ>
git checkout --track origin/<ブランチ>  # 同名でトラッキング設定

# 新しい記法
git switch -c <ローカルブランチ> origin/<リモートブランチ>

上流ブランチの設定

# 初回プッシュ時に上流ブランチを設定
git push -u origin feature-branch

# 既存ブランチに上流ブランチを設定
git branch --set-upstream-to=origin/feature-branch

# 上流ブランチの確認
git branch -vv

コンフリクトの解決

マージコンフリクトの発生

git merge feature-branch
# Auto-merging file.txt
# CONFLICT (content): Merge conflict in file.txt
# Automatic merge failed; fix conflicts and then commit the result.

コンフリクトの解決手順

# 1. コンフリクトファイルを確認
git status

# 2. ファイルを編集してコンフリクトマーカーを削除
# <<<<<<< HEAD
# 現在のブランチの内容
# =======
# マージしようとしているブランチの内容
# >>>>>>> feature-branch

# 3. 解決後にステージング
git add <解決したファイ>

# 4. マージコミット
git commit

リベースコンフリクトの解決

# コンフリクト解決後
git add <解決したファイ>
git rebase --continue

# リベースを中止
git rebase --abort

高度なブランチ操作

チェリーピック

# 特定のコミットを現在のブランチに適用
git cherry-pick <コミットハッシ>

# 複数のコミットを適用
git cherry-pick <ハッシュ1> <ハッシュ2>

# 範囲指定でチェリーピック
git cherry-pick <開始ハッシ>..<終了ハッシ>

ブランチの比較

# ブランチ間の差分を表示
git diff main..feature-branch

# ファイル名のみ表示
git diff --name-only main..feature-branch

# 統計情報付きで表示
git diff --stat main..feature-branch

ブランチのリネーム

# 現在のブランチ名を変更
git branch -m <新しいブランチ>

# 他のブランチ名を変更
git branch -m <古いブランチ> <新しいブランチ>

# リモートのブランチ名も変更する場合
git push origin --delete <古いブランチ>
git push origin <新しいブランチ>
git push origin -u <新しいブランチ>

ブランチ管理のベストプラクティス

命名規則

# 機能ブランチ
feature/user-authentication
feature/payment-integration
feat/responsive-design

# バグ修正ブランチ
bugfix/login-error
hotfix/critical-security-issue
fix/responsive-layout

# リリースブランチ
release/v1.2.0
release/2025-q2

# 実験的ブランチ
experiment/new-algorithm
spike/performance-test

ブランチの寿命管理

# 短期間ブランチ(機能開発)
# - 数日から数週間
# - 早期マージを心がける

# 長期間ブランチ(リリース)
# - 数週間から数ヶ月
# - 定期的にメインブランチの変更を取り込む

定期的なメンテナンス

# マージ済みブランチの一覧
git branch --merged

# マージ済みブランチの一括削除
git branch --merged | grep -v main | xargs git branch -d

# リモートで削除されたブランチをローカルからも削除
git remote prune origin

トラブルシューティング

よくある問題と解決法

ブランチ切り替え時の未コミット変更

# 一時保存
git stash
git checkout other-branch
git stash pop

# または強制切り替え(変更は失われる)
git checkout -f other-branch

間違ったブランチでコミット

# 最新コミットを他のブランチに移動
git checkout correct-branch
git cherry-pick wrong-branch
git checkout wrong-branch
git reset --hard HEAD~1

リモートブランチが見つからない

# リモート情報を更新
git fetch origin

# 削除されたリモートブランチの参照を削除
git remote prune origin

パフォーマンス最適化

大量のブランチがある場合

# ブランチ一覧の高速表示
git for-each-ref --format='%(refname:short)' refs/heads/

# リモートブランチのみ高速表示
git for-each-ref --format='%(refname:short)' refs/remotes/

ブランチ履歴の可視化

# グラフィカルなログ表示
git log --graph --oneline --all

# より詳細なブランチ構造
git log --graph --pretty=format:'%C(yellow)%h%C(reset) - %C(blue)%an%C(reset), %C(green)%ar%C(reset) : %s %C(red)%d%C(reset)' --all