プログラミング ソフトウェア 公開日 2026.07.03 更新日 2026.07.03

git mergeとrebaseの違いは?使い分けと黄金ルールを実務目線で

git mergeとgit rebaseの違いを実務目線で整理します。どちらもブランチを統合しますが、mergeは分岐と合流をマージコミットとして履歴に残し、rebaseは自分のコミットを最新の先端へ積み直して履歴を直線的にします。挙動の違い、履歴の見え方、コミットのハッシュが作り直される点、公開済みコミットはrebaseしないという黄金ルール、使い分け、interactive rebaseまでまとめます。

先に要点

  • どちらも ブランチを統合する操作ですが、履歴の残り方が違います。merge は分岐と合流をそのまま残し、rebase は履歴を直線に作り直します
  • git mergeは、2つのブランチを合流させる マージコミットを作ります(fast-forwardできる場合を除く)。履歴は正確だが、枝分かれが残る
  • git rebaseは、自分のコミットを 最新の先端へ積み直す履歴は直線的で読みやすいが、コミットのハッシュは作り直される(=別物になる)。
  • 黄金ルール: すでに push して共有したコミットは rebase しない。履歴が作り直されて他人の作業とズレ、事故になります。rebase手元の未共有コミットに使うのが基本です。
  • ざっくり使い分けると、フィーチャーブランチを最新に追従・整える → rebase完成した機能を共有ブランチへ取り込む → merge。チームの方針に合わせます。

git merge と git rebase、どっちで取り込めばいいの? ── Git に慣れてくると必ずぶつかる分かれ道です。どちらも「別のブランチの変更を自分の作業に取り込む」操作ですが、できあがる履歴の形がまったく違います。ここを理解しないまま rebase を使うと、共有済みの履歴を壊して周りを巻き込む事故につながります。

この記事では、両者の違いを 統合という共通点 → それぞれの挙動 → 履歴の見え方 → 黄金ルール → 使い分けの順で整理します。挙動はGit公式ドキュメントの git-merge / git-rebase を確認しながらまとめています。取得と取り込みの関係が曖昧ならgit pullとgit fetchの違いも先に読むと土台が固まります。

前提: どちらも「ブランチを統合する」

まず共通点です。merge も rebase も、あるブランチの変更を別のブランチに取り込む(統合する)ための操作です。たとえば「main の最新を、自分の作業ブランチに取り込みたい」「完成した機能ブランチを main に入れたい」といった場面で、どちらを使うか選ぶことになります。

違うのは 取り込んだ結果、履歴がどう記録されるかです。ここを軸に見ていきます。

git merge は何をするか(合流を履歴に残す)

git merge は、2つのブランチを 合流させる操作です。両方のブランチにそれぞれコミットがある場合、Git は両者を1つにまとめた マージコミットを新しく作ります。このマージコミットは「ここで2つの流れが合流した」という記録として履歴に残ります。

一方、取り込む側にコミットが無く、相手が先に進んでいるだけなら、マージコミットを作らずに単に先端を進めるだけ(fast-forward)で済みます。

merge の性質

merge は既存のコミットを書き換えません(非破壊的)。分岐して合流した事実がそのまま残るため、履歴は正確ですが、開発が活発だとマージコミットが増えて枝分かれが複雑に見えることがあります。

git rebase は何をするか(履歴を積み直す)

git rebase は、自分のコミットを、別のブランチの最新の先端へ移動(積み直し)する操作です。「自分の作業を、いったん外して、新しい土台の上に順番に載せ直す」とイメージすると分かりやすいです。結果として、分岐していた履歴が一本の直線になり、マージコミットは作られません。

ただし重要な副作用があります。rebase はコミットを"作り直す"ため、元のコミットとは別のハッシュ(ID)を持つ新しいコミットに置き換わります。中身が同じでも、Git 的には別のコミットです。これが後述の黄金ルールにつながります。

git merge と git rebase の比較

観点git mergegit rebase
履歴の形分岐と合流が残る(非直線)直線的になる
マージコミット作られる(fast-forward時を除く)作られない
コミットのハッシュ変わらない作り直される(別物になる)
履歴の正確さ分岐した事実がそのまま残る整うが、実際の経緯は消える
読みやすさ枝分かれが増えると追いにくい一本で追いやすい
共有済みブランチ安全原則NG(黄金ルール)

図で見る違い

読み込み中...

黄金ルール: 公開済みコミットは rebase しない

rebase でいちばん大事なのはこれです。すでに push して他の人と共有したコミットは、rebase してはいけませんGit 公式ドキュメントも「自分のリポジトリの外に存在し、他人がそれを土台に作業している可能性のあるコミットは rebase するな」と明記しています。

理由は、rebase がコミットを作り直すからです。共有済みのコミットを rebase すると、あなたの履歴と、それを取り込んでいる同僚の履歴が食い違い、強制 push(--force)や、同僚側の面倒な修復が必要になる事故が起きます。

rebase は「手元の未共有コミット」に使う

まだ push していない自分だけのコミットを整える・最新に追従させるのは安全。すでに共有した(push済みの)コミットには rebase を使わず、merge で取り込むのが原則です。

使い分け(実務の考え方)

読み込み中...

よくある実務パターンは、「作業中は rebase で main に追従して手元を綺麗に保ち、完成したら merge で main に取り込む」という組み合わせです。どちらか一方だけが正解ではなく、チームの履歴ポリシー(直線的にするか、経緯を残すか)に合わせるのが基本です。

interactive rebase(コミットの整理)

rebase には、コミットを対話的に編集できる interactive rebase(git rebase -i)があります。これは統合というより 自分のコミットを綺麗にする用途で、レビュー前によく使います。

  • squash / fixup ── 複数の細かいコミットを1つにまとめる。
  • reword ── コミットメッセージを直す。
  • reorder / drop ── 順番を入れ替える・不要なコミットを消す。

これも「コミットを作り直す」操作なので、push前の手元のコミットにだけ使うのが安全です。

よくある誤解・失敗

共有済みブランチを rebase

いちばんの事故。履歴が作り直されて同僚とズレる。push済みは merge、rebaseは手元だけ

rebase なら履歴が消えて安全?

逆です。rebaseは履歴を書き換える破壊的操作。mergeの方が非破壊的で安全側です。

コンフリクトはrebaseだと出ない?

出ます。merge/rebaseどちらでも起き得ます。rebaseはコミットごとに順に解決する点が違います。

どちらかが常に正しい?

いいえ。チームの履歴ポリシー次第。直線を好むなら rebase 寄り、経緯重視なら merge 寄り。

git mergeとgit rebaseに関するよくある質問

git merge と git rebase の一番の違いは何ですか?

履歴の残り方です。merge は分岐と合流を マージコミットとして履歴に残します。rebase は自分のコミットを最新の先端へ 積み直して履歴を直線的にしますが、その際コミットは作り直されて別のハッシュになります。

どちらを使えばいいですか?

目安として、push前のフィーチャーブランチを最新に追従・整えるなら rebase完成した機能を共有ブランチ(main)へ取り込むなら mergeです。迷ったら、非破壊的で安全な merge を選べば大きな事故にはなりません。

なぜ共有済みのコミットを rebase してはいけないのですか?

rebase はコミットを作り直すため、共有済み(push済み)のコミットを rebase すると、あなたの履歴とそれを取り込んだ同僚の履歴が食い違います。結果として強制 push や同僚側の修復が必要になり、事故になります。だから rebase は手元の未共有コミットに使うのが原則です。

git pull --rebase は merge と何が違いますか?

git pull はリモートを取り込むときに 既定では mergeで統合しますが、--rebase を付けると rebase で統合します。手元のコミットをリモートの最新の上に載せ直すため、履歴が直線的になります。詳しくはgit pullとgit fetchの違いで扱っています。

rebase でコンフリクトが出たらどうしますか?

rebase は コミットを1つずつ順に載せ直すため、コンフリクトもコミット単位で出ます。該当ファイルを直して git add し、git rebase --continue で次へ進みます。途中でやめたい場合は git rebase --abort で元に戻せます。

squash はどうやりますか?

git rebase -i(interactive rebase)で、まとめたいコミットを squash または fixup に指定します。複数の細かいコミットを1つにまとめられ、レビュー前の整理に便利です。これも push 前の手元のコミットに使います。

まとめ

git merge と git rebase の違いは、統合した結果の履歴の形に集約されます。merge は分岐と合流をマージコミットとして残す非破壊的な統合rebase は自分のコミットを最新の先端へ積み直して履歴を直線的にする(コミットは作り直される)統合です。最重要は黄金ルール、共有済み(push済み)のコミットは rebase しないこと。使い分けは「push前の手元を整えるなら rebase、共有ブランチへ取り込むなら merge」を出発点に、チームの履歴ポリシーに合わせれば迷いません。関連して、複製の話はGitのforkとcloneの違いも参考になります。

参考リンク

あとで見返すならここで保存

読み終わったあとに残しておきたい記事は、お気に入りからまとめて辿れます。