症状
git rebase を実行中に「CONFLICT」と表示され、リベースが途中で止まる
結論:まずこれを確認
git statusでコンフリクトしているファイルを確認- ファイルを編集してコンフリクトマーカーを解消
git add→git rebase --continueで再開
操作フロー
flowchart TD
A[rebase中にCONFLICT発生] --> B{git statusで状態確認}
B --> C[コンフリクトファイルを特定]
C --> D{解決方法を選択}
D -->|解決して続行| E[ファイルを編集]
D -->|rebaseを中止| F[git rebase --abort]
E --> G[コンフリクトマーカーを削除]
G --> H[git add ファイル名]
H --> I[git rebase --continue]
I --> J{まだコンフリクトある?}
J -->|Yes| C
J -->|No| K[rebase完了]
F --> L[rebase前の状態に戻る]
よくある原因
- 同じ行を別々のコミットで編集した - 最も一般的な原因
- ファイルの削除と編集が競合した - 片方で削除、片方で編集した場合
- ブランチの分岐後に base ブランチが大きく変更された - 長期間マージしていない場合に発生しやすい
- リネームと編集が競合した - ファイル名変更と内容変更が同時に起きた場合
- バイナリファイルの変更が競合した - 画像やPDFなどの自動マージ不可ファイル
- 空白や改行コードの差異 - OS間の改行コード違いで発生することがある
操作手順
ステップ1: 現在の状態を確認する
git status
🔍 チェックポイント: both modified: や Unmerged paths: にファイル名が表示される
出力例:
interactive rebase in progress; onto abc1234
You have unmerged paths.
(fix conflicts and run "git rebase --continue")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: src/app.js
ステップ2: コンフリクト箇所を確認する
git diff
または、該当ファイルを直接開く:
cat src/app.js
🔍 チェックポイント: 以下のようなコンフリクトマーカーが表示される
<<<<<<< HEAD
現在のブランチの内容
=======
rebase元のコミットの内容
>>>>>>> コミットハッシュ
ステップ3: コンフリクトを解消する
ファイルをエディタで開き、以下を行う:
<<<<<<< HEADを削除=======を削除>>>>>>> コミットハッシュを削除- 残したいコードだけを残す(両方の変更を組み合わせることも可能)
編集後の例:
// 両方の変更を取り入れた最終的なコード
const result = processData(input);
console.log(result);
🔍 チェックポイント: ファイル内にコンフリクトマーカー(<<<<<<<, =======, >>>>>>>)が残っていないことを確認
ステップ4: 解消したファイルをステージングする
git add src/app.js
複数ファイルがある場合は個別に、または:
git add .
🔍 チェックポイント: git status で Unmerged paths: がなくなっていることを確認
ステップ5: rebaseを続行する
git rebase --continue
🔍 チェックポイント: 次のコミットの適用が始まる、または「Successfully rebased」と表示される
さらにコンフリクトが発生した場合は、ステップ1〜5を繰り返す。
(代替)rebaseを中止する場合
途中でrebaseをやめて元の状態に戻したい場合:
git rebase --abort
🔍 チェックポイント: rebase開始前の状態に完全に戻る
NG行動
- コンフリクトマーカーを残したままコミットする - 構文エラーやバグの原因になる
git rebase --skipを安易に使う - そのコミットの変更が完全に失われる- 解消内容を確認せずに
git add .する - 意図しない変更が含まれる可能性がある - rebase中に別のブランチに切り替える - 中途半端な状態になり復旧が困難になる
- コンフリクト解消前に
git rebase --continueを実行する - エラーになり進まない
よくある質問(FAQ)
Q1: rebase中にどのコミットでコンフリクトしたか確認するには?
A: git status の出力に「currently rebasing branch ‘xxx’ on ‘yyy’」と表示される。また .git/rebase-merge/ ディレクトリ内の情報でも確認可能。
Q2: --continue と --skip の違いは?
A: --continue は解消した変更を含めて続行する。--skip は現在のコミットを完全に無視して次へ進む。変更を残したい場合は必ず --continue を使う。
Q3: コンフリクト解消に自信がないときは?
A: git rebase --abort で安全に中止できる。rebase開始前の状態に戻るため、何度でもやり直せる。
関連するトラブル
準備中
解決しない場合
- Git公式ドキュメント: https://git-scm.com/docs/git-rebase
- 確認すべきファイル:
.git/rebase-merge/ディレクトリ内のファイル - 次に調べるキーワード: 「git rebase interactive conflict」「git rerere」「git mergetool」