【初心者向け】Gitの rebase と merge の違いと使い分けについて整理する
はじめに
Gitを使って開発をしていると、merge
や rebase
に触れる機会が増えてきます。
特に以下のような場面で迷ったことはないでしょうか?
- 「他のブランチの変更を取り込みたいけど、
merge
とrebase
のどちらを使えばいいのか?」 - 「履歴がきれいなのはどちらか? チームで使っても大丈夫か?」
実際の現場でも、
- 「
merge
を使っていたら履歴が複雑になってきた」 - 「
rebase
の方が履歴が見やすいと聞いたが、安全に使えるのか?」
といった話題が上がることもあります。
本記事では、初心者の方向けに、rebase
と merge
の違いや使い分けについて整理します。
main
ブランチの更新
準備:まずは main
ブランチを、リモートの最新状態に完全に揃えます。
git fetch origin
git switch main
git reset --hard origin/main
⚠️ 注意:git reset --hard
は ローカルの変更をすべて破棄します。
未コミットの作業内容がある場合は失われるので、必ず事前に確認しましょう。
-
git fetch origin
:リモートの最新情報を取得します -
git switch main
:main
ブランチに切り替えます -
git reset --hard origin/main
:ローカルのmain
を、リモートのmain
と完全に同じ状態にする(※ローカル変更はすべて破棄される)
merge
:そのまま取り込む
1. 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 #〜」という形で履歴が明確に残るため、履歴を追いやすいというメリットがあります。
✅ 特徴
- マージした履歴がそのまま残るため、どのブランチから統合されたかが見てすぐにわかります。
- コンフリクト(衝突)が起きた場合でも、どのファイル・どの箇所で発生したかが明確に表示されます。
- ブランチの流れを残しやすく、チーム開発で良く使用されます。
rebase
:履歴を付け替える
2. 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 が便利 |
rebase
後は「強制push」が必要になる理由
4. すでにGitHubなどにpushしているブランチに対して rebase
を行うと、
履歴が書き換わるため、git push
ではエラーになります。
git push --force-with-lease
このように「強制push」が必要になるため、
共同開発の場ではトラブルを避けるために merge
を使う方が安全です。
おわりに
rebase
と merge
は、どちらもブランチの統合に使える便利なコマンドですが、
履歴をどう管理したいか、どこまで安全性を保ちたいかによって使い分けるのがポイントです。
- 安全第一なら
merge
- 履歴をきれいに整えたいなら
rebase
(ただしローカル限定)
本記事が参考になれば幸いです。
Discussion