Git の merge と rebase の違い:チームのトラブルを避けるのはどちらの戦略か?
By Mirko Peters ·
Git の merge と rebase の重要な違いを解説します。チームのコード履歴を安全かつ整理された状態に保つための、rebase の黄金律を紹介します。
Automatically translated with AI from the original post. Read the English original

Git でコードを統合する際、merge と rebase のどちらを選ぶかによって、プロジェクトの履歴がどのように残るか、そしてチームメンバーの作業を上書きするリスクがあるかどうかが決まります。merge はマージコミットによって完全な履歴を残しますが、rebase は自分のコミットを main ブランチの先頭に移動させ、直線的で整理された履歴を作ります。ただし、共有ブランチに適用すると危険です。
重要なポイント
- merge は、マージコミットを使ってコードブランチがいつ、どのように統合されたかという正確な履歴を保持します。
- rebase はコミット履歴を書き換え、マージコミットで散らかることなく、直線的で整理されたタイムラインを作成します。
- 他の開発者が現在作業している共有ブランチは、決して rebase しないでください。ローカルコピーが壊れたり、破壊的な上書きが強制されたりするのを防ぐためです。
- rebase は、プルリクエストを公開する前に散らかったコミットを整理するために、自分だけのプライベートなローカルブランチに限って使用してください。
- 共同作業のプロジェクトで迷ったら、共有の正として一貫性を保つ最も安全な方法である merge を選んでください。
Git merge の仕組みを理解する
merge は、共同開発における基本的な安全策です。フィーチャーブランチの作業が完了し、プルリクエストが承認されると、merge は新しい マージコミット を生成して、変更を main ブランチと結合します。このコミットは、2 つの異なる履歴が合流した正確な瞬間を明示的に記録します。
この方法の主な利点は、完全な透明性です。何も書き換えられず、何も失われません。数週間後にバグが混入した場合でも、コミットログを確認すれば、特定のフィーチャーブランチが特定の火曜日に merge されたことがはっきり分かります。見た目の美しさよりも、監査可能性と絶対的な安全性を重視するチームにとって、merge は標準的な運用手順です。
Git rebase の魅力とリスク
rebase は、まったく異なるアプローチを取ります。フィーチャーブランチの時系列上の分岐を残すのではなく、コミットを元の起点から切り離し、main ブランチの最新版の上に整然と配置し直します。その過程で新しいコミットが生成され、全員が順番に作業したかのように見える、すっきりとした直線的な履歴になります。
多くの開発者は、この整理された見た目を好みます。merge 線が入り組むことなく、プロジェクトの履歴を追いやすくなるからです。しかし、この見た目の良さには、運用上の大きなトレードオフがあります。rebase は文字通り履歴を書き換えるため、コミット ID が変わります。別の人がローカルマシンに取り込んでいるブランチに rebase を適用すると、その人の状態があなたの状態とすぐに食い違ってしまいます。
Git rebase の黄金律
日常的な Git の利用で最も重要なルールは、次のように簡潔に言い表せます。他の人が作業しているブランチは決して rebase しない、ということです。rebase コマンドを実行する前に、必ず重要な問いを自分に投げかけてください。このブランチを他にも見ている人や、その上で作業している人はいないか?
答えが「はい」なら、直ちに中止し、代わりに merge を使ってください。rebase を強行し、その書き換えた変更をリモートにプッシュすると、チームメンバーのローカルコピーが壊れます。相手が push または pull しようとすると Git は大規模な競合を検出し、結果として破壊的な強制プッシュが必要になることがあります。その場合、同僚が何時間もかけた作業を、意図せず消去してしまうおそれがあります。
rebase の安全なワークフロー
リベースそのものが本質的に悪いわけではありません。適用範囲を超えて誤用されているだけです。リベースを使うのに理想的な場面は、公開レビューのためにプルリクエストを開く前の、自分だけのローカルなプライベートフィーチャーブランチ上です。
「typo を修正」「もう一度試す」「セミコロンを忘れた」などの、わかりにくいバグの原因を調べる途中で作った細かく雑然としたコミットが数十件あるなら、リベースでそれらをスカッシュして並べ替え、一貫性のある流れにまとめられます。プライベートブランチが整理できたら、プッシュしてプルリクエストを開き、あとは標準的なマージによる共同レビューのプロセスに安全に任せます。
まとめ
マージとリベースの違いを理解しておけば、致命的なデータ損失を防ぎ、チームの摩擦を最小限に抑えられます。履歴上の文脈を残すべき場面と、直線的で整ったタイムラインを保つべき場面を見極めることで、開発ワークフローはスムーズかつ効率的に進むようになります。より基礎的な概念や、より広範なデプロイ戦略について知りたい場合は、ポッドキャストのエピソード全編を聴いて、専門用語を極力使わない詳しい解説をご覧ください。
よくある質問
Git マージでは何が起こりますか?
Git マージは、分岐した 2 つのブランチの履歴を取り込み、新しいマージコミットを作成して一つに統合します。これにより、既存のコミットハッシュを変更することなく、両方のブランチの元の履歴が保持されます。
共有ブランチでリベースが危険とされるのはなぜですか?
リベースは新しいコミットハッシュを生成して、コミット履歴を書き換えます。ほかの開発者が同じブランチで作業している場合、その人のローカルコピーがリモートリポジトリと一致しなくなり、深刻なコンフリクトエラーや、データ損失の可能性につながります。
git rebase を安全に使うのはどのような場合ですか?
git rebase は、雑然としたコミットメッセージを整理したり、プルリクエストを開く前に main の最新の変更を取り込んだりするために、自分専用のローカルなプライベートフィーチャーブランチでのみ使用してください。
マージでは余分なコミットが作成されますか?
はい、通常マージではプロジェクト履歴にマージコミットが追加され、フィーチャーブランチを main に統合した正確な時点が記録されます。