merge と rebase の違いを説明してください

履歴の形がどう変わるかで答える問い。rebase はコミットを作り直すので、共有した枝では使わない、という決めまで話します。

こう聞かれます

  • 「merge と rebase の違いを説明してください」
  • 「main の変更を自分のブランチに取り込むとき、どちらを使いますか」
  • 「rebase してはいけないのは、どんなときですか」

面接官が見ている点

  • 「どちらも取り込む操作」で止まらず、履歴の形の違いで説明できるか
  • rebase がコミットを作り直す操作だと分かっているか
  • 共有したブランチを書き換えない、というチームの決めを言えるか

短い答え

  • merge は 2 つのブランチの履歴をそのまま残し、合流のコミットを 1 つ足してまとめます。
  • rebase は自分のコミットを相手のブランチの先に付け替えて、履歴を一直線にします。
  • rebase はコミットを作り直すので、ほかの人と共有したブランチでは使わず、手元だけのブランチで使います。

少し詳しい答え

同じ分かれ方を、2 つのやり方で取り込む

main と feature が 1 つずつ別のコミットを持っている所から、先に rebase した写しを作り、そのあと main で merge します。--graph は履歴を線で描く指定です。

ターミナル

git init -q -b main demo
cd demo
git config user.name Aya
git config user.email a@x.jp
echo "base" > base.txt
git add base.txt
git commit -q -m "土台"
git switch -q -c feature
echo "a" > a.txt
git add a.txt
git commit -q -m "機能A"
git switch -q main
echo "b" > b.txt
git add b.txt
git commit -q -m "修正B"
git switch -q -c rebased feature
git rebase -q main
git log --graph --format=%s
git switch -q main
git merge -q --no-edit feature
git log --graph --format=%s
* 機能A
* 修正B
* 土台
*   Merge branch 'feature'
|\  
| * 機能A
* | 修正B
|/  
* 土台

上の 3 行が rebase の結果で、「機能A」が「修正B」のあとに付け替えられ、一直線になっています。下が merge の結果で、分かれた線がそのまま残り、合流のコミットで 1 つにまとまっています。

rebase はコミットを作り直す

rebase で付け替えた「機能A」は、中身が同じでも、元とは別のコミットです。ほかの人が元の「機能A」を持っている所で付け替えると、2 人の履歴が食い違い、同じ直しが二重に入るなどの混乱が起きます。だから、push して共有したブランチは rebase しない、という決めが広く使われています。

どちらを選ぶか

  • merge は、いつ分かれていつ合わせたかが履歴に残る。共有したブランチでも安全に使える
  • rebase は、履歴が一直線で読みやすい。まだ自分だけのブランチを、最新の main の上に乗せ直すときに向く

チームによって決めが違うので、まずチームの決めに合わせる、と添えると落ち着いた答えになります。

作った物と結ぶなら、たとえば「自分だけのブランチはプルリクエストを出す前に main の上へ rebase して差分を見やすくし、レビューが始まったあとは merge で main を取り込んでいました」のように話します。

よくある間違い

  • 「rebase のほうが新しいので上」と言う優劣ではなく、履歴の残し方の違いです。場面とチームの決めで選びます
  • 共有したブランチを rebase して、強制で push するほかの人の手元の履歴と食い違い、作業を失わせるおそれがあります
  • 「rebase してもコミットは同じ」と言う付け替えたコミットは作り直された別物です。だから共有した所では使いません

深掘りの問い

  • 「fast-forward の merge とは何ですか」 main 側に新しいコミットが無いとき、合流のコミットを作らず、main の名札を先へ進めるだけで済む取り込み方、と答えます
  • 「rebase の途中でコンフリクトしたら」直して add し、git rebase --continue で続ける、と答えます。やめるなら git rebase --abort で戻せます
  • 「git pull と git pull --rebase の違いは」取ってきた変更を merge で合わせるか、rebase で合わせるかの違い、と答えます

確認日 2026年10月23日

技術面接問題の一覧へ戻る