LESSON 25分

マージとリベースを使い分けよう

ストーリー

コードレビューで先輩から質問された。

「このブランチ、マージする前にリベースした方がいいんじゃない?」

「リベース... ですか?マージとどう違うんですか?」

佐藤先輩がホワイトボードの前に立った。

「マージとリベースは、ブランチを統合する2つの方法だ。 どちらも結果は同じだが、履歴の見え方が全然違う。使い分けが重要だ」


マージ(merge)

Fast-Forward マージ

main が変更されていない場合、ポインタを前に進めるだけです。

# マージ前
main:    A -- B
                \
feature:         C -- D

# Fast-Forward マージ後
main:    A -- B -- C -- D
bash
git checkout main
git merge feature
# Fast-forward と表示される

3-Way マージ(通常のマージ)

main にも変更がある場合、マージコミットが作成されます。

# マージ前
main:    A -- B -- E
                \
feature:         C -- D

# 3-Way マージ後
main:    A -- B -- E -- M (マージコミット)
                \      /
feature:         C -- D
bash
git checkout main
git merge feature
# Merge commit が作成される

Squash マージ

フィーチャーブランチの全コミットを1つにまとめてマージします。

# マージ前
main:    A -- B
                \
feature:         C -- D -- E

# Squash マージ後
main:    A -- B -- F (C+D+Eを1つにまとめたコミット)
bash
git checkout main
git merge --squash feature
git commit -m "feat: ユーザー認証機能を追加"

リベース(rebase)

リベースは、ブランチの「根元」を移動させます。

# リベース前
main:    A -- B -- E
                \
feature:         C -- D

# リベース後
main:    A -- B -- E
                    \
feature:             C' -- D' (コミットが再作成される)
bash
git checkout feature
git rebase main

リベースの特徴

  • マージコミットが作成されない
  • 履歴が直線的(きれいな一本線)になる
  • コミットが再作成される(ハッシュが変わる)

マージ vs リベース の比較

項目マージリベース
履歴分岐・合流が残る直線的になる
マージコミット作成される作成されない
コミットハッシュ変わらない変わる
安全性高い(既存履歴を変更しない)注意が必要
可読性分岐が多いと複雑すっきりしている

使い分けの指針

■ マージを使う場面
├── 共有ブランチ(main, develop)への統合
├── 複数人が作業しているブランチ
└── マージの記録を残したい時

■ リベースを使う場面
├── 自分だけのfeatureブランチを最新にする
├── コミット履歴をきれいにしたい時
└── PR作成前に main の変更を取り込む

リベースの黄金ルール

公開済みのブランチをリベースしてはいけない

他の人が参照しているブランチをリベースすると、コミットハッシュが変わるため、 他のメンバーの作業が壊れます。

bash
# やってはいけない例
git checkout main
git rebase feature  # main をリベース → チームが混乱

# 正しい使い方
git checkout feature
git rebase main     # 自分のブランチを最新に更新

実践的なワークフロー

PRを出す前の推奨手順

bash
# 1. main の最新を取得
git checkout main
git pull

# 2. feature ブランチに戻る
git checkout feature/my-feature

# 3. リベースで main の最新変更を取り込む
git rebase main

# 4. (コンフリクトがあれば解決)

# 5. リモートにプッシュ(リベース後はforce pushが必要)
git push --force-with-lease origin feature/my-feature

# 6. PR を作成

--force-with-lease について

リベース後は通常の push が拒否されます(履歴が書き変わっているため)。

bash
# 危険: 他の人の変更を上書きする可能性
git push --force

# 安全: リモートが予期しない変更をされていない場合のみ実行
git push --force-with-lease

推奨: --force ではなく --force-with-lease を必ず使いましょう。


まとめ

ポイント内容
Fast-Forwardmain が進んでいない場合のシンプルなマージ
3-Way マージマージコミットが作成される通常のマージ
Squash マージ複数コミットを1つにまとめてマージ
リベースブランチの根元を移動、履歴が直線的に
黄金ルール公開済みブランチはリベースしない

チェックリスト

  • Fast-Forward マージと3-Way マージの違いを説明できる
  • Squash マージの用途を理解した
  • リベースの仕組みを説明できる
  • マージとリベースの使い分けができる
  • --force-with-lease の意味を理解した

次のステップへ

マージとリベースの使い分けを理解しましたね。

次のセクションでは、避けて通れない「コンフリクト」の解決方法を学びます。 コンフリクトは恐れるものではありません。正しい手順を知れば、冷静に対処できます。


推定読了時間: 25分