「git mergeとgit 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時の
merge/rebase/ff-only設定 - チーム運用ポリシーのテンプレートとアンチパターン集
30秒で分かる結論
迷ったらこの一覧だけ覚えておけば実務の9割はカバーできます。理由や詳細は後半で解説します。
黄金律:共有された履歴は絶対にrebaseしない。自分の未公開ブランチは積極的にrebaseして整える。この2つだけ守れば事故は起きません。
mergeの正体:履歴を「繋げる」
git mergeは、2つの枝分かれした履歴を1つに統合する操作です。デフォルトではマージコミットと呼ばれる特別なコミット(親が2つ)を作り、分岐が再合流したことを記録します。
# 現在の状況を確認(featureがmainから分岐) git checkout main git merge feature # mainブランチにマージコミットが追加される # featureブランチはそのまま残る
マージ前後のコミットグラフ
main A---B---C---D
\
feature E---F
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で直線) 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)を別のコミットに付け替える操作です。既存のコミットを削除し、同じ変更内容で新しいコミットを作り直すため、コミットハッシュが変わります。
# featureをmainの最新にrebase git checkout feature git rebase main # featureのコミットが作り直され、mainの先端に積み上がる
rebase前後のコミットグラフ
main A---B---C---D
\
feature E---F
# featureはCから分岐したまま、
# mainのD(最新の改善)を知らない
main A---B---C---D
\
feature E'---F'
# E/FはE'/F'に作り直される(ハッシュが変わる)
# mergeコミットは作られない、履歴は一直線
rebaseが危険なシーン
rebaseは「過去を書き換える」操作です。すでにpushして他人が参照しているブランチをrebaseすると、相手のローカルと履歴が食い違い、pull時に大量のコンフリクトや重複コミットが発生します。共有ブランチで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提出前に履歴をきれいにする用途で使います。
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」。ただし共有ブランチでは安全性が最優先で、rebaseは実質的に選べません。
判断フローチャート:今すぐどちらを選ぶか
迷ったときはこのフローを上から辿ってください。4つの質問で必ず結論が出ます。
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相当)。
main A---B---C-----------M
\ /
feature D---E-/
# 中間コミットDとEがmainの履歴に残る
# PRの分岐構造が明示される
向いているケース:リリースブランチ統合/monorepoの大規模PR/あとから特定機能だけrevertしたい場合。
② Squash and merge
PRの全コミットを1つのコミットに圧縮してmainに追加する方式。PR本文がコミットメッセージになります。
main A---B---C---S # Sは"feat: 新機能追加 (#123)"のような1コミット # featureブランチの中間コミットは履歴に残らない
向いているケース:小〜中規模のfeatureブランチ/中間コミットのメッセージが雑(”wip”、”fix typo”など)/mainを読みやすく保ちたいチーム。GitHubのデフォルト推奨設定として人気。
③ Rebase and merge
PRのコミットをmainの先端にrebaseしてから、fast-forwardマージする方式。中間コミットは残るがマージコミットは作られません。
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は内部でfetch+merge(またはrebase)を実行する複合操作です。デフォルト動作は設定で変えられ、これを理解していないと不要なマージコミットが量産されます。
# 個人開発の基本設定 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(リモートが自分の認識と一致している時のみ押す)を使う。
# 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基調パターン
## ブランチ戦略 - 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向き)
## 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を禁止にすれば、ルール違反を物理的に防げます。ポリシーは口約束ではなく設定で守るのが鉄則。
よくある質問
git reflog+reset --hardで開始前に戻せます。git pullはmergeとrebaseどちらの設定がよい?pull.rebase=trueが推奨です。不要なマージコミットが作られず履歴が直線的になります。さらにpull.ff=onlyも併用するとrebase失敗時に強制mergeされず事故防止になります。チームで統一するのが重要なので、CONTRIBUTING.mdに記載しましょう。git reset --hard HEAD~1で直前に戻せます。既にpush済みならgit revert -m 1 <マージコミット>で”マージを打ち消すコミット”を追加するのが安全です。詳しい手順は【Git】mergeコミットを取り消す方法を参照してください。git rebase --abortで必ず開始前の状態に戻ります。コンフリクトが毎コミット発生するのはrebase範囲が広すぎるサインなので、mergeに切り替えるのも正しい判断。迷った時は【Git】rebase中のエラー完全復旧ガイドを参照してください。git merge --squashとSquash and mergeは同じ?git merge --squash featureはローカルでindexに変更を取り込むだけで、手動でcommitする必要があります。一方GitHubのSquash and mergeは1ボタンで圧縮+mainへpushまで完了する統合機能です。日常運用ではGitHub側の機能を使う方が圧倒的に便利。git log --format=fullerで両方確認できます。CI/CDでコミット作者情報を使う場合はauthorを参照するのが一般的です。関連記事
- 【Git】rebase中のエラー完全復旧ガイド — 7パターン診断+safety branch運用
- 【Git】pull後にマージコミットが大量発生する原因と履歴整理方法 — rebase・pull戦略の実践
- 【Git】リモートとローカルの履歴が食い違ったときの同期方法 — fetch/pull/rebaseの選び方
- 【Git】コミット履歴が二重化する原因と修正方法 — 履歴の重複を検出・整理
- 【Git】mergeコミットを取り消す方法 — revert -m 1の徹底解説
- 【Git】マージの取り消し方法 — merge –abort/reset/revert -mの使い分け
- 【Git】refusing to merge unrelated historiesエラー — allow-unrelated-historiesの対処
- 【Git】コミットメッセージの変更方法 — amend/rebase -i rewordの使い分け
- 【Git】pushを取り消す方法 — rebase後のforce pushの安全策
- 【Git】間違えて別ブランチで作業したときの復旧方法 — cherry-pickとrebaseの活用
- 【Git】よく使うgitコマンド決定版チートシート — 緊急早見表+推奨設定2026
まとめ
- merge=履歴を繋げる(安全、マージコミット追加)/rebase=履歴を付け替える(直線、ハッシュ書き換え)
- 黄金律:共有ブランチはrebase禁止、未公開ブランチは積極rebase
- ff/
--no-ff/--ff-onlyの違いを理解するとmerge commitの有無をコントロールできる - GitHub PRの3戦略:Merge commit(分岐保持)/Squash(1コミット圧縮)/Rebase(直線維持)
- pullは
pull.rebase=true+pull.ff=onlyが推奨 - アンチパターン:mainのrebase/他人PRの勝手なforce push/戦略の混在/
--force乱用 - チームでは統合戦略を1つに統一し、GitHubのBranch protectionで物理的に強制
rebaseとmergeは対立する概念ではなく、役割の異なる2つのツールです。未公開ブランチはrebaseで磨き、公開・統合はmerge系(PR戦略含む)で安全に合流させる——これが2026年のGit運用のスタンダード。判断フローと5軸比較、GitHub設定による強制を組み合わせれば、履歴はきれいになり、bisectやrevertも速く、チームのレビュー効率も上がります。

