最終更新:

Git mergeとrebaseの違いは?履歴・競合・使い分けを図解


merge・fast-forward・rebase fast-forward 分岐が不要な場合 ブランチの先端を進める 新規マージコミットなし 通常のmerge 分岐した履歴を合流 既存コミットを維持 複数の親を持つコミット rebase 変更を別の土台へ再適用 適用し直した履歴を作成 共有相手への影響を確認 統合後は差分とテストを確認 merge・fast-forward・rebase fast-forward 分岐が不要な場合 ブランチの先端を進める 新規マージコミットなし 通常のmerge 分岐した履歴を合流 既存コミットを維持 複数の親を持つコミット rebase 変更を別の土台へ再適用 適用し直した履歴を作成 共有相手への影響を確認 統合後は差分とテストを確認
統合後は差分とテストを確認
ひよこ ひよこ
mergeとrebaseは何が違うの?
ペンギン先生 ペンギン先生
どちらも別のブランチの変更を取り込む方法だけれど、履歴の扱いが違うよ。mergeは既存の履歴をつなぎ、rebaseは対象コミットの変更を別の土台へ順に適用し直すんだ。
ひよこ ひよこ
mergeすると必ずマージコミットができる?
ペンギン先生 ペンギン先生
必ずではないよ。現在の先端が取り込む先の祖先なら、ポインターを進めるfast-forwardが可能。この場合は新しいマージコミットを作らない。分岐した履歴を通常のmergeで合流させると、複数の親を持つコミットができるんだ。
ひよこ ひよこ
rebaseすると全部のハッシュが変わる?
ペンギン先生 ペンギン先生
適用し直して親などが変わるコミットは新しいIDになるよ。リポジトリの全コミットが変わるわけではないし、変更が不要なら何もしない場合もある。元のコミットがその場で書き換わるというより、新しい履歴を作ってブランチを向け直すイメージだね。
ひよこ ひよこ
pushした後は絶対に使えないの?
ペンギン先生 ペンギン先生
共有相手がその履歴を基に作業しているなら、無断で作り直さないのが基本だよ。チームで合意した個人用ブランチなどでは扱うこともあるけれど、初心者は未共有の作業で練習しよう。force pushを通常の解決策にはしないことだね。
ひよこ ひよこ
mainの変更を作業ブランチへ入れるなら?
ペンギン先生 ペンギン先生
作業ブランチにいることと、未コミット変更がないことを確認するよ。履歴を維持するならmerge、未共有のコミットを新しい土台に整理するならrebaseが候補。まずmainがどの状態を指しているかも確認しよう。
ひよこ ひよこ
競合の直し方は違うの?
ペンギン先生 ペンギン先生
どちらも競合した内容を確認して修正し、解決したファイルをgit addする。mergeは統合時にまとめて競合する一方、rebaseは適用するコミットごとに止まることがあるよ。続行と中止のコマンドも操作ごとに違うんだ。
ひよこ ひよこ
途中で分からなくなったら?
ペンギン先生 ペンギン先生
まずgit statusで現在の状態を確認しよう。処理中ならgit merge --abortやgit rebase --abortで中止できる。操作前に未コミット変更を整理しておくことが大事で、完了後にいつでもabortできるわけではないよ。
ひよこ ひよこ
一直線なら品質も高いのかな?
ペンギン先生 ペンギン先生
履歴の形だけでは決まらないよ。マージの経緯を残したいか、まとまった変更単位を見たいかはチームの方針次第。統合後はテストと差分確認を行い、競合を消しただけで正しいと判断しないようにしよう。

3つの履歴を区別する

操作・状態新しいコミット主な用途・注意
fast-forward merge作らず先端を進める取り込む履歴が現在の先端から続いている場合
分岐した履歴の通常mergeマージコミットを作る分岐・合流の経緯を保持
rebase適用し直すコミットを新規作成共有相手の作業への影響を確認

自分の未共有ブランチで試す手順

前提はmainとfeatureが存在し、作業ツリーがクリーンで、ローカルのmainが取り込みたい状態であることです。次の2方式は、どちらか一方を選ぶ例です。

git status
git switch feature
git merge main

未共有コミットを載せ替える場合は、最後をgit rebase mainにします。リモートの最新状態は自動では取得されません。必要なら事前にfetchし、チームの方針に従って取り込む参照を選びます。

競合時に使うコマンド

状態修正してgit addした後処理中に中止する
merge中git merge —continuegit merge —abort
rebase中git rebase —continuegit rebase —abort

rebase --skipは変更を飛ばす操作なので、「競合を直すのが面倒だから」で使わないでください。rerereで過去の解決を再利用する場合も、再適用された差分の確認は必要です。

参考資料

確認日:2026年9月26日。製品の仕様・料金・対応環境は導入時にも確認してください。

  • Git: git-merge:fast-forward、マージコミット、continue/abort、未コミット変更の注意。
  • Git: git-rebase:変更の再適用、continue/abort/skip、共有履歴への影響。