🔖

【初心者向け】Gitの rebase と merge の違いと使い分けについて整理する

に公開

はじめに

Gitを使って開発をしていると、mergerebase に触れる機会が増えてきます。

特に以下のような場面で迷ったことはないでしょうか?

  • 「他のブランチの変更を取り込みたいけど、mergerebase のどちらを使えばいいのか?」
  • 「履歴がきれいなのはどちらか? チームで使っても大丈夫か?」

実際の現場でも、

  • merge を使っていたら履歴が複雑になってきた」
  • rebase の方が履歴が見やすいと聞いたが、安全に使えるのか?」

といった話題が上がることもあります。

本記事では、初心者の方向けに、rebasemerge の違いや使い分けについて整理します。

準備:mainブランチの更新

まずは main ブランチを、リモートの最新状態に完全に揃えます

git fetch origin
git switch main
git reset --hard origin/main

⚠️ 注意git reset --hardローカルの変更をすべて破棄します。
未コミットの作業内容がある場合は失われるので、必ず事前に確認しましょう。

  • git fetch origin:リモートの最新情報を取得します
  • git switch mainmainブランチに切り替えます
  • git reset --hard origin/main:ローカルの main を、リモートの main と完全に同じ状態にする(※ローカル変更はすべて破棄される)

1. merge:そのまま取り込む

merge は、2つの履歴をそのまま残して統合する方法です。

git switch feature
git merge main

これで main ブランチの最新変更を feature に取り込むことができます。
このとき、マージコミットMerge branch 'main' into feature のようなコミット)が1つ追加されます。

実行後のコミット履歴イメージ

*   c7f9a2d  Merge branch 'main' into feature
|\
| * 12a7d2f  mainブランチの最新コミット
* | 5b8c1ae  featureブランチでの作業2
* | 3c2e9df  featureブランチでの作業1
|/
* 9f1b3e0  共通の親コミット

このように、merge では両方の履歴がそのまま残り、マージコミット(分岐を束ねるノード)が追加されます。

※GitのGUI(GitHubなど)でも「Merge pull request #〜」という形で履歴が明確に残るため、履歴を追いやすいというメリットがあります。

✅ 特徴

  • マージした履歴がそのまま残るため、どのブランチから統合されたかが見てすぐにわかります。
  • コンフリクト(衝突)が起きた場合でも、どのファイル・どの箇所で発生したかが明確に表示されます。
  • ブランチの流れを残しやすく、チーム開発で良く使用されます。

2. rebase:履歴を付け替える

rebase は、今の作業を、別のブランチの後ろに付け直す操作です。

git switch feature
git rebase main

この場合、feature の変更が、まるで main のあとに行われたかのように履歴が並び替えられます。
見た目はスッキリしますが、履歴を書き換える操作なので注意が必要です。

実行後のコミット履歴イメージ

* 5b8c1ae  featureブランチでの作業2(付け替え後)
* 3c2e9df  featureブランチでの作業1(付け替え後)
* 12a7d2f  mainブランチの最新コミット
* 9f1b3e0  共通の親コミット

このように、rebase を使うと feature のコミットが main の直後に“後付け”されたように並び替えられます

✅ 特徴

  • 履歴が一本化されるため、あとから変更の流れを追いやすく、シンプルに見えます。
  • merge と比べて、コンフリクトが発生するタイミングが異なり、作業中に1つずつ解消する必要があります。
  • コミット履歴を書き換える操作のため、すでに他の人と共有しているブランチで使うと混乱を招く可能性があります。
     → 共有前の作業ブランチで使うのが安全です。

3. 使い分けの目安

シーン merge rebase
チーム開発での最新取り込み ✅ よく使われる ⚠️ 慣れていれば可(要注意)
自分だけのローカル開発 ✅ 問題なし ✅ 履歴をきれいに整えられる
プルリクエスト前に履歴をまとめたい ❌ やや冗長 rebase -i が便利

4. rebase 後は「強制push」が必要になる理由

すでにGitHubなどにpushしているブランチに対して rebase を行うと、
履歴が書き換わるため、git push ではエラーになります。

git push --force-with-lease

このように「強制push」が必要になるため、
共同開発の場ではトラブルを避けるために merge を使う方が安全です。

おわりに

rebasemerge は、どちらもブランチの統合に使える便利なコマンドですが、
履歴をどう管理したいか、どこまで安全性を保ちたいかによって使い分けるのがポイントです。

  • 安全第一なら merge
  • 履歴をきれいに整えたいなら rebase(ただしローカル限定)

本記事が参考になれば幸いです。

Discussion