症状

git rebase を実行中に「CONFLICT」と表示され、リベースが途中で止まる

結論:まずこれを確認

  1. git status でコンフリクトしているファイルを確認
  2. ファイルを編集してコンフリクトマーカーを解消
  3. git addgit 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: コンフリクトを解消する

ファイルをエディタで開き、以下を行う:

  1. <<<<<<< HEAD を削除
  2. ======= を削除
  3. >>>>>>> コミットハッシュ を削除
  4. 残したいコードだけを残す(両方の変更を組み合わせることも可能)

編集後の例:

    // 両方の変更を取り入れた最終的なコード
const result = processData(input);
console.log(result);
  

🔍 チェックポイント: ファイル内にコンフリクトマーカー(<<<<<<<, =======, >>>>>>>)が残っていないことを確認

ステップ4: 解消したファイルをステージングする

    git add src/app.js
  

複数ファイルがある場合は個別に、または:

    git add .
  

🔍 チェックポイント: git statusUnmerged 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」