git rebase・mergeの使い分け完全ガイド|履歴の残し方で選ぶ判断軸

ブランチを統合するときに、mergeとrebaseのどちらを使うか迷う場面はよくあります。

ところが、この2つはやりたいこと自体は同じでも、コミット履歴の残り方がまったく違います

そこで、この記事では「履歴をどう残したいか」を軸にした使い分けを整理しました。

mergeとrebase、何が違うのか

項目mergerebase
履歴の見た目分岐・統合がそのまま残る一直線に並び替えられる
コミット本体変更されない再作成される(ハッシュが変わる)
マージコミット作られる作られない(fast-forwardになる)
共有ブランチでの安全性安全他の人がpull済みだと事故りやすい

mergeは事実をそのまま記録し、rebaseは記録を書き直してきれいに見せます。この違いが、そのまま使い分けの判断軸になります。

mergeの基本

featureブランチの内容を、mainブランチに統合する基本の書き方です。

Bash
git checkout main
git merge feature

分岐点からの変更をまとめる「マージコミット」が自動的に作られ、両方のブランチの履歴がそのまま残ります。

rebaseの基本

featureブランチの分岐元を、mainブランチの最新コミットに付け替えます。

Bash
git checkout feature
git rebase main

featureブランチのコミットが1つずつ再作成され、まるで最初からmainの最新の上で作業していたかのような、一直線の履歴になります。

コミットが再作成される以上、コミットハッシュはすべて変わります。ここがmergeとの決定的な違いです。

使い分けの判断軸

判断軸はシンプルで、「そのブランチを他の人がすでに手元にpullしているかどうか」です。

  • 共有済みのブランチ(main等)に統合する → merge(履歴を書き換えないので安全)
  • 自分専用のfeatureブランチを整理したい → rebase(誰にも影響しない)

他の人が同じブランチをpull済みの状態でrebaseすると、コミットハッシュの食い違いが起きて、次のpullで大量のコンフリクトを引き起こすことがあります。すでに公開したコミットはrebaseしない、というのがGitの基本ルールです。

interactive rebaseでコミットを整理する

rebaseにはもう一つ、統合とは別の使い道があります。push前の自分のブランチのコミットを整理する用途です。

Bash
git rebase -i HEAD~3

エディタが開き、直近3件のコミットを一覧できます。picksquashに書き換えると、そのコミットを1つ前にまとめられます。「動作確認用の細かいコミット」を、pushする前に意味のある単位にまとめ直すときに使います。

この使い方は自分のブランチ内で完結するので、他の人に影響を与える心配はありません。

実務で役立つTips

rebase中のコンフリクトを解消する

該当ファイルを開いて手動で解消し、git addでステージしたあと以下で再開します。

Bash
git rebase --continue

rebase自体をやめたい場合は、以下で開始前の状態に戻せます。

Bash
git rebase --abort

Squash and mergeはmerge・rebaseとは別物

GitHubのPull Requestでよく使うSquash and mergeは、merge・rebaseのどちらとも異なる第3の統合方法です。featureブランチの全コミットを1つのコミットにまとめてmainへ追加します。

CLIで同じことをする場合は、--squashオプションを使います。

Bash
git checkout main
git merge --squash feature
git commit -m "featureブランチの変更をまとめて統合"

通常のgit mergeと違い、マージコミットは自動生成されません。--squashはステージするだけなので、コミットは自分で行う必要があります。

featureブランチ内の細かいコミットを気にせず、PR単位で1コミットとして履歴を残したい場合によく使われます。

push済みのコミットを誤ってrebaseしてしまったときの対処

他の人がまだpullしていなければ、以下で上書きできます。

Bash
git push --force-with-lease

すでに誰かがpull済みの場合は、チームに連絡してrebase前の状態に揃えてもらう必要があります。

まとめ

共有ブランチへの統合はmerge、自分だけのブランチの整理はrebase。「もう他の人が見ているかどうか」で選べば、事故らずに使い分けられます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

普段は主にPython開発をしています。
最近はAI駆動開発にも関わっています。

コメント

コメントする