コンフリクトの発生メカニズムとMergeとの違いを5分で理解する
あなたは新機能を開発するためにfeatureブランチを作成し、作業を進めています。
その間に、チームメンバーがmainブランチに新しい変更を追加しました。
あなたの作業を統合する前に、mainブランチの最新の変更を取り込む必要があります。
あなたがF1を作った後、mainにC3とC4が追加された状態
パッチは「どのファイルの、どの行を、どう変更したか」という情報です。例えば:
Rebaseでは各パッチを一つずつ適用するため、コンフリクトが発生する可能性もパッチごとにあります。これがMergeとの大きな違いです。
Gitはファイルをマージするときに3-way merge(3点マージ)という仕組みを使います。
これは3つのバージョンを比較して、自動的に統合できるかを判断する方法です。
自動解決できる場合:
• 異なる行を変更している → 両方の変更を統合
• 片方だけが変更している → その変更を採用
手動が必要な場合(コンフリクト):
• 同じ行を両方が異なる方法で変更
• 同じ行を一方が変更、もう一方が削除
赤色:あなたの変更 / 緑色:mainブランチの変更 / オレンジ:区切り線
git rebase --continue
例えば、F1, F2, F3のコミットが全て同じファイルの同じ行を変更していて、mainブランチでもその行が変更されていた場合:
git rebase --continue
git rebase --continue
複数のコミットが同じ箇所を変更している場合、Mergeなら1回のコンフリクト解決で済むところを、Rebaseでは各コミットごとに解決が必要になります。
これは、Rebaseが「コミットを一つずつ順番に再生する」という仕組み上、避けられない特性です。
Mergeは2つのブランチの最終的な状態だけを見て統合するので、中間のコミットがどうであれ、コンフリクトは1回の判定で完結します。
• 個人のブランチで、まだ誰とも共有していない変更
• 履歴をまっすぐにしてレビューしやすくしたい
• 作業中に頻繁にmainの最新を取り込みたい
• コミットを整理(squash)してから統合したい
• 複数人が使っているブランチの統合
• いつ統合したかの記録を残したい
• 長期ブランチで、同じ箇所に多数の変更がある
• コンフリクト解決を1回で済ませたい
公開済みのブランチ(他の人がベースにしている可能性があるブランチ)に対してRebaseを実行すること
理由:Rebaseはコミットを書き換えるため、他の人の作業に深刻な混乱を招きます。これは「Rebaseの黄金律」と呼ばれています。
📋 このブランチは他の人と共有している?
→ YES: Mergeを使う
→ NO: 次へ
📋 まっすぐな履歴にしたい?
→ YES: Rebaseを使う
→ NO: Mergeでも良い
📋 同じファイルの同じ箇所を複数コミットで変更している?
→ YES: Mergeの方が楽かも(コンフリクト解決1回で済む)
→ NO: Rebaseでクリーンな履歴に