rebase 中のコンフリクト対処法
rebase 中にコンフリクトが発生した場合の対処法と、中断・継続の判断基準
rebase 中のコンフリクトとは
rebase はコミットを一つずつ別のベースに再適用する操作です。
各コミットを適用する際に、同じ箇所が変更されているとコンフリクト(競合)が発生します。
merge と異なり、複数のコミットを再適用するため、1回の rebase で何度もコンフリクトが発生する可能性があります。
コンフリクトを解決して続行する
git statusでコンフリクトしたファイルを確認rebase は一時停止しており、「Unmerged paths」に該当ファイルが並びます。
ファイルを編集してマーカーを解消
<<<<<<<=======>>>>>>>のコンフリクトマーカーを取り除き、正しい内容に整えます。git addでステージング解消したファイルをステージすると Git が「解決済み」と認識します。
git rebase --continueで次のコミットへ次のコミットの適用に進みます。さらにコンフリクトが出たら 1 からの流れを繰り返します。
# 1. コンフリクトしたファイルを確認
git status
# 2. ファイルを編集してコンフリクトを解決
# 3. 解決したファイルをステージ
git add resolved-file.txt
# 4. rebase を続行
git rebase --continueコミットをスキップする / rebase を中断する
git rebase --skip現在のコミットを適用せずにスキップします。適用不要なコミットがあるときに使います。
git rebase --abortrebase 自体を取りやめ、開始前の状態に完全に戻します。何も失われません。
コンフリクトが多すぎるときは撤退も選択肢
収拾がつかなければ無理せず
--abortして merge に切り替える判断も重要です。
# 現在のコミットをスキップ
git rebase --skip
# rebase を完全に中断(元の状態に戻る)
git rebase --abortrebase と merge の使い分け
コンフリクトが少なくクリーンな履歴にしたい場合は rebase が向いています。
コンフリクトが大量に発生する場合や、共有ブランチの場合は merge のほうが安全です。
rebase は「まだ push していないローカルのコミット整理」に使い、push 済みのコミットには使わないのが基本方針です。
Git Ready