【Git】rebaseとmergeの違いと使い分け完全ガイド|判断フローと5軸比較・PR統合3戦略・チーム運用ポリシーまで

Git

git mergegit rebase、どっちを使えばいいの?」——Git入門者が最初にぶつかる壁であり、ベテランですらチーム内で議論が分かれる永遠のテーマです。

ネット上には「rebaseは危険」「mergeは履歴が汚れる」など断片的な主張があふれていますが、実際は「誰が」「いつ」「何のために」使うかで答えは明確に決まります。感覚や好みではなく、判断基準を持って使い分けることが重要です。

この記事では、rebaseとmergeの本質的な違いをコミットグラフで視覚的に理解し、5軸比較表判断フローチャートで迷わず選べる状態を作ります。さらにGitHub/GitLabのPR統合3戦略(Merge/Squash/Rebase)、チーム運用ポリシーのテンプレート、ff/--no-ff/--ff-onlyの違い、やってはいけないアンチパターンまで、2026年の現場で通用する意思決定ガイドとしてまとめました。

この記事で学べること

  • 30秒で分かる結論:どちらを選ぶかの黄金律
  • コミットグラフで見るmergeとrebaseの本質的な違い
  • ff--no-ff--ff-onlyの挙動差
  • 5軸比較(履歴形状/コンフリクト/共有安全性/巻き戻し/再現性)
  • 判断フローチャート:今の状況でどちらを使うか一発判定
  • GitHub PR統合3戦略(Merge commit/Squash and merge/Rebase and merge)の選び方
  • pull時のmergerebaseff-only設定
  • チーム運用ポリシーのテンプレートとアンチパターン集
スポンサーリンク

30秒で分かる結論

迷ったらこの一覧だけ覚えておけば実務の9割はカバーできます。理由や詳細は後半で解説します。

シーン 推奨 理由
作業ブランチをmainに追随 rebase 未公開の個人ブランチなら安全、履歴が直線化
featureをmainにマージ(PR統合) merge--no-ff PR単位を1コミットにまとめ、ブランチ履歴を残す
小さなPRをmainに統合 Squash merge 中間コミットを1つに圧縮、mainを読みやすく
git pullで取り込む pull --rebaseff-only 無用なmerge commit増殖を防ぐ
リリースブランチの統合 merge --no-ff リリース境界をmerge commitで明示
他人も触る共有ブランチ merge一択 rebaseは歴史書き換え=他人の履歴破壊

黄金律:共有された履歴は絶対にrebaseしない自分の未公開ブランチは積極的にrebaseして整える。この2つだけ守れば事故は起きません。

mergeの正体:履歴を「繋げる」

git mergeは、2つの枝分かれした履歴を1つに統合する操作です。デフォルトではマージコミットと呼ばれる特別なコミット(親が2つ)を作り、分岐が再合流したことを記録します。

merge操作の流れ
# 現在の状況を確認(featureがmainから分岐)
git checkout main
git merge feature

# mainブランチにマージコミットが追加される
# featureブランチはそのまま残る

マージ前後のコミットグラフ

merge前(分岐した状態)
main     A---B---C---D
                  \
feature            E---F
merge後(マージコミットMで合流)
main     A---B---C---D-------M
                  \         /
feature            E---F---/

# Mはparentが2つ(DとF)のマージコミット

ff(fast-forward)/–no-ff/–ff-onlyの違い

mergeには3つの動作モードがあり、履歴の見え方が大きく変わります。この違いを知らずにmergeを使うのは危険です。

モード マージコミット 挙動 推奨シーン
ff(デフォルト) 作らない 可能ならpointerを進めるだけ 単純な追随/個人作業
--no-ff 必ず作る 分岐履歴を明示的に残す PRをmainへ統合/feature統合
--ff-only 作らない ff不可なら失敗で中止 pull時の保護/意図しないmerge防止
3モードの使い分け例
# 個人ブランチの取り込み(ffで直線)
git merge feature

# PR統合を明示(必ずmerge commit)
git merge --no-ff feature -m "Merge PR #123: 新機能追加"

# pullで勝手にmergeされないよう保険
git pull --ff-only

なぜ–no-ffが実務で好まれるか

ff mergeだとブランチの境界が履歴から消え、”どのPRでこの機能が入ったか”が追えなくなります。--no-ff「ここでPR #123が統合された」という印を残すため、あとからrevertやcherry-pickする単位が明確になります。GitHubの”Create a merge commit”オプションは内部で--no-ff相当の動作をします。

rebaseの正体:履歴を「付け替える」

git rebaseは、ブランチの根っこ(base)を別のコミットに付け替える操作です。既存のコミットを削除し、同じ変更内容で新しいコミットを作り直すため、コミットハッシュが変わります。

rebase操作の流れ
# featureをmainの最新にrebase
git checkout feature
git rebase main

# featureのコミットが作り直され、mainの先端に積み上がる

rebase前後のコミットグラフ

rebase前(mainが進んでいる)
main     A---B---C---D
                  \
feature            E---F

# featureはCから分岐したまま、
# mainのD(最新の改善)を知らない
rebase後(mainの先端に付け替わる)
main     A---B---C---D
                      \
feature                E'---F'

# E/FはE'/F'に作り直される(ハッシュが変わる)
# mergeコミットは作られない、履歴は一直線

rebaseが危険なシーン

rebaseは「過去を書き換える」操作です。すでにpushして他人が参照しているブランチをrebaseすると、相手のローカルと履歴が食い違い、pull時に大量のコンフリクトや重複コミットが発生します。共有ブランチでrebaseする際は必ずチームに合意を取ること。

共有ブランチでrebaseした際の事故例
# 開発者A(自分): featureをrebaseしてforce push
git checkout feature
git rebase main
git push --force-with-lease origin feature

# 開発者B: 何も知らずにpullすると...
$ git pull origin feature
# → 大量のコンフリクト
# → Bのローカルの履歴が孤児化
# → Bの作業中コミットが消える可能性

interactive rebaseで履歴を整形する

-iオプション付きrebaseは、コミットの順序入れ替え・結合・分割・メッセージ書き換えなどができる強力なツールです。PR提出前に履歴をきれいにする用途で使います。

interactive rebaseでよく使うコマンド
git rebase -i main

# エディタで開かれるtodoリスト
pick a1b2c3 feat: 新機能追加
pick d4e5f6 fix: typo修正              # ← squashでまとめる
pick g7h8i9 feat: テスト追加           # ← rewordでメッセージ変更

# 編集後
pick   a1b2c3 feat: 新機能追加
squash d4e5f6 fix: typo修正            # a1b2c3に統合
reword g7h8i9 test: 単体テスト追加     # メッセージ変更

interactive rebaseでコンフリクトが起きた際の復旧は【Git】rebase中のエラー完全復旧ガイドで詳しく解説しています。--continue--skip--abortの使い分けを押さえればほとんどのトラブルは解決できます。

5軸でrebaseとmergeを比較

違いを「履歴形状・コンフリクト・共有安全性・巻き戻し・再現性」の5軸で整理すると、どちらを選ぶべきかが一瞬で判断できます。

比較軸 merge rebase
履歴の形状 分岐と合流が残る(DAG) 一直線(linear history)
コンフリクト処理 最終結果で1回解消 コミットごとに何度も発生しうる
コミットハッシュ 変わらない(追加のみ) 変わる(作り直される)
共有ブランチでの安全性 ◎ 安全 ✗ 他人の履歴を破壊する恐れ
巻き戻し方法 revert -m 1reset reflogからresetで復元
レビューしやすさ PR全体の変更が見やすい コミット単位で論理的な差分
bisectのしやすさ merge commitでスキップが必要 一直線なので高精度で追える
push後の扱い そのままpushできる --force-with-leaseが必要

軸の読み方:「履歴の正確さを優先 → merge」「履歴の読みやすさを優先 → rebase」。ただし共有ブランチでは安全性が最優先で、rebaseは実質的に選べません。

判断フローチャート:今すぐどちらを選ぶか

迷ったときはこのフローを上から辿ってください。4つの質問で必ず結論が出ます。

3秒判定フロー
Q1: そのブランチはpushして他人も触っていますか?
   YES → merge(rebaseは絶対禁止)
   NO  → Q2へ

Q2: そのブランチはまだPR提出前の個人作業ですか?
   YES → rebase推奨(履歴を整えてPRへ)
   NO  → Q3へ

Q3: PRをmainへ統合するタイミングですか?
   YES → Q4へ
   NO  → pull時ならrebase、それ以外はmerge

Q4: PRの中間コミットを残したい?
   残したい   → Merge commit(--no-ff)
   1つにまとめたい → Squash and merge
   直線にしたい → Rebase and merge

実務でよくある4シナリオ

  • mainの最新を取り込みたい(個人ブランチ)git pull --rebase origin main(Q2=YES)
  • featureが完成してmainに統合 → GitHubでSquash and merge(Q4=まとめたい)
  • リリースブランチを統合git merge --no-ff release/v1.2(Q4=残したい)
  • 他人がpushしたtopicブランチ → merge以外選択肢なし(Q1=YES)

GitHub/GitLab PR統合3戦略の選び方

GitHubのPull Requestには3つのマージ方式があり、リポジトリ単位で設定できます。どれを選ぶかでmainブランチの見え方がまったく変わります。

① Create a merge commit

PRブランチの全コミットをそのまま保持し、マージコミットを追加する方式(merge --no-ff相当)。

Merge commitによる結果
main  A---B---C-----------M
                \       /
feature          D---E-/

# 中間コミットDとEがmainの履歴に残る
# PRの分岐構造が明示される

向いているケース:リリースブランチ統合/monorepoの大規模PR/あとから特定機能だけrevertしたい場合。

② Squash and merge

PRの全コミットを1つのコミットに圧縮してmainに追加する方式。PR本文がコミットメッセージになります。

Squash and mergeによる結果
main  A---B---C---S

# Sは"feat: 新機能追加 (#123)"のような1コミット
# featureブランチの中間コミットは履歴に残らない

向いているケース:小〜中規模のfeatureブランチ/中間コミットのメッセージが雑(”wip”、”fix typo”など)/mainを読みやすく保ちたいチーム。GitHubのデフォルト推奨設定として人気。

③ Rebase and merge

PRのコミットをmainの先端にrebaseしてから、fast-forwardマージする方式。中間コミットは残るがマージコミットは作られません。

Rebase and mergeによる結果
main  A---B---C---D---E

# 中間コミット(D, E)は残るが、mainは一直線のまま
# マージコミットは作られない

向いているケース:コミット1つ1つが論理的に独立した意味を持つPR/履歴を完全に直線に保ちたい/bisectを多用する開発体制。

3戦略の使い分け指針

  • 個人ブログ/小規模チーム:Squash and merge一択で十分
  • OSS/大規模チーム:Rebase and merge(コミット単位を重視)
  • リリースブランチ・monorepo:Create a merge commit(PR境界を残す)
  • 混在は危険:チームでどれか1つに統一しリポジトリ設定で他を無効化するのが推奨

git pullでのmerge/rebase/ff-only設定

git pullは内部でfetchmerge(またはrebase)を実行する複合操作です。デフォルト動作は設定で変えられ、これを理解していないと不要なマージコミットが量産されます。

設定値 pull動作 推奨度
pull.rebase=false(デフォルト) fetch+merge。マージコミットが増える △ 履歴が汚れがち
pull.rebase=true fetch+rebase。直線的に追随 ◎ 個人開発におすすめ
pull.ff=only ff不可なら失敗。安全サイド ◎ 事故防止の保険
pull.rebase=interactive fetch+rebase -iで対話的 ○ 熟練者向け
推奨設定(2026年版)
# 個人開発の基本設定
git config --global pull.rebase true
git config --global pull.ff only  # rebase失敗時の保険

# rebase中の自動stash
git config --global rebase.autoStash true

# autosquashも有効化(fixup/squashコミット自動処理)
git config --global rebase.autoSquash true

pull --rebaseの詳しい使い分けは【Git】pull後にマージコミットが大量発生する原因と履歴整理方法で履歴整理術とあわせて解説しています。

黄金律と必ず避けるべきアンチパターン

覚えておきたい3つの黄金律

黄金律①:pushされた共有ブランチは絶対にrebaseしない。force push必須=事故確定。どうしても必要なら必ず事前合意。

黄金律②:自分のローカル・未pushブランチは遠慮なくrebaseで整える。PR提出前にinteractive rebaseで履歴を美しく。

黄金律③:チームで統合戦略(Squash/Merge/Rebase)を1つに統一する。混在するとbisect・revert・ログ追跡が崩壊する。

絶対にやってはいけない5大アンチパターン

①main/masterをrebaseする。全員の履歴がズレて地獄。mainの保護ブランチ設定で物理的に防ぐのが基本。

②他人のPRブランチを勝手にrebaseしてforce push。相手のローカル履歴を破壊する。どうしても必要ならPR作者に依頼するか--force-with-leaseで安全策。

③mergeとrebaseを混ぜて使う。履歴の見た目がバラバラになり、pullのたびに不要なmerge commitが発生する。

④rebase中にpanicで.git/rebase-merge/を削除する。中断状態を強制破壊するとreflogからも追跡困難に。git rebase --abortで正規ルートに戻す。

--forceを無条件で使う。必ず--force-with-lease(リモートが自分の認識と一致している時のみ押す)を使う。

安全なforce push
# NG:他人の変更を上書きする可能性
git push --force origin feature

# OK:リモートが想定どおりの場合のみ通る
git push --force-with-lease origin feature

# さらに安全:リモート参照の確認付き
git push --force-with-lease=feature:$(git rev-parse origin/feature) origin feature

チーム運用ポリシーのテンプレート

チームで運用ルールを明文化していないと、人によってmerge/rebaseがバラつき、履歴が読めなくなります。最初の1日目に決めて共有すべき指針をまとめました。

推奨ポリシー:Squash基調パターン

Squash基調のチーム運用テンプレ(CONTRIBUTING.md)
## ブランチ戦略
- main: 常にデプロイ可能、force push禁止
- feature/*: 個人作業、自由にrebase可
- release/*: リリース前固定、mergeのみ

## pull
- `pull.rebase = true` を全員設定
- `pull.ff = only` で事故防止

## PR統合
- 小〜中PR → Squash and merge(デフォルト)
- リリースPR → Create a merge commit(--no-ff)
- ホットフィックス → Squash and merge

## rebase
- PR提出前の履歴整形は推奨(interactive rebase)
- pushされた共有ブランチのrebaseは禁止
- 必要な場合は必ずチーム合意+--force-with-lease

## コミットメッセージ
- Conventional Commits準拠
- Squash時はPRタイトルをそのまま使用

推奨ポリシー:Linear履歴パターン(OSS向き)

Linear履歴重視のチーム運用テンプレ
## PR統合
- PR統合はRebase and merge一択
- mainは常に一直線(merge commit禁止)

## コミット単位
- 1コミット=1論理変更を徹底
- 雑なWIPコミットはPR提出前にinteractive rebaseで整理

## レビュー
- コミット単位でレビュー可能
- bisect前提の履歴品質を維持

GitHub設定で物理的に強制する

チームポリシーはリポジトリSettings→General→Pull Requestsで強制できます。使わないマージ方式のチェックを外し、さらにBranch protection rulesでmainへの直接pushやforce pushを禁止にすれば、ルール違反を物理的に防げます。ポリシーは口約束ではなく設定で守るのが鉄則。

よくある質問

Qrebaseとmerge、結局どっちがいいんですか?
A両方使います。未公開の個人ブランチはrebaseで整え、共有ブランチへの統合はmerge(またはGitHubのSquash/Rebase and merge)が基本。どちらかだけで運用する必要はなく、役割分担で併用するのが現代のベストプラクティスです。
Qrebaseは危険と聞きましたが、使わない方がいいですか?
A「共有ブランチでrebaseしない」さえ守れば安全です。自分のローカルブランチをrebaseするのはむしろ推奨される操作で、きれいな履歴はレビュアーにも将来の自分にも優しい。万一失敗してもgit reflogreset --hardで開始前に戻せます。
QSquash and mergeは履歴を失うので避けるべき?
A失われるのはPRブランチ内の中間コミットだけで、PR本体(差分、レビュー、議論)はGitHub上に永続的に残ります。多くのチームでは中間コミットの価値は低く、mainを読みやすく保つ方がメリットが大きいのでSquashが選ばれます。1コミット=1論理変更を徹底したいOSSならRebase and mergeの方が適切です。
Qgit pullはmergeとrebaseどちらの設定がよい?
A個人開発ならpull.rebase=trueが推奨です。不要なマージコミットが作られず履歴が直線的になります。さらにpull.ff=onlyも併用するとrebase失敗時に強制mergeされず事故防止になります。チームで統一するのが重要なので、CONTRIBUTING.mdに記載しましょう。
Qmainに間違ってmergeしたコミットを取り消したい
Aまだpushしていなければgit reset --hard HEAD~1で直前に戻せます。既にpush済みならgit revert -m 1 <マージコミット>で”マージを打ち消すコミット”を追加するのが安全です。詳しい手順は【Git】mergeコミットを取り消す方法を参照してください。
Qrebase中にコンフリクトが連発して諦めたい
Agit rebase --abortで必ず開始前の状態に戻ります。コンフリクトが毎コミット発生するのはrebase範囲が広すぎるサインなので、mergeに切り替えるのも正しい判断。迷った時は【Git】rebase中のエラー完全復旧ガイドを参照してください。
Qgit merge --squashSquash and mergeは同じ?
A結果は似ていますが操作の場所が違います。git merge --squash featureはローカルでindexに変更を取り込むだけで、手動でcommitする必要があります。一方GitHubのSquash and mergeは1ボタンで圧縮+mainへpushまで完了する統合機能です。日常運用ではGitHub側の機能を使う方が圧倒的に便利。
Qrebaseしたらコミットのauthor情報も変わる?
Aデフォルトではauthor情報は維持され、committer情報だけがrebase実行者に更新されます。git log --format=fullerで両方確認できます。CI/CDでコミット作者情報を使う場合はauthorを参照するのが一般的です。

関連記事

まとめ

  • merge=履歴を繋げる(安全、マージコミット追加)/rebase=履歴を付け替える(直線、ハッシュ書き換え)
  • 黄金律:共有ブランチはrebase禁止未公開ブランチは積極rebase
  • ff/--no-ff--ff-onlyの違いを理解するとmerge commitの有無をコントロールできる
  • GitHub PRの3戦略:Merge commit(分岐保持)/Squash(1コミット圧縮)/Rebase(直線維持)
  • pullはpull.rebase=truepull.ff=onlyが推奨
  • アンチパターン:mainのrebase/他人PRの勝手なforce push/戦略の混在/--force乱用
  • チームでは統合戦略を1つに統一し、GitHubのBranch protectionで物理的に強制

rebaseとmergeは対立する概念ではなく、役割の異なる2つのツールです。未公開ブランチはrebaseで磨き、公開・統合はmerge系(PR戦略含む)で安全に合流させる——これが2026年のGit運用のスタンダード。判断フローと5軸比較、GitHub設定による強制を組み合わせれば、履歴はきれいになり、bisectやrevertも速く、チームのレビュー効率も上がります。