Git コンフリクト解消手順(Rebase編)

リモートの最新の変更の上に、自分のコミットを歴史の後ろから付け直すことで、履歴を一本の直線に保ちながら競合を解決する手法(git rebase)のマニュアルです。

目次

  1. 最新のリモートコードを取得してリベースを開始する
  2. コンフリクトを検知・ファイルを修正する
  3. 修正を確定してリベースを続行する
  4. リモートに強制プッシュ(Force Push)する
  5. 参考文献

1. 最新のリモートコードを取得してリベースを開始する

自分の作業ブランチ(例: feature)にいる状態で、元となる親ブランチ(例: main)の最新状態を後ろに敷き直します。

git fetch origin
git rebase origin/main

【理由】 自分の変更を「あとから追加する」ためには、まずリモート側の最新状態の履歴をローカルに落とし込み、その最新状態をベース(土台)として自分のコミットを上に乗せ換える必要があるためです。

2. コンフリクトを検知・ファイルを修正する

リベース中にコンフリクトが発生すると、処理が一時停止します。git status で衝突しているファイルを確認し、使い慣れたエディタで開いて修正します。

【注意】リベース中の衝突部分の表記

<<<<<<< HEAD
リモート側の最新コード(ベース側)
=======
自分が書いた、あとから追加しようとしているコード
>>>>>>> 1234567... (コミットID)

【理由】 リベースは「リモートの最新状態に一時的にチェックアウトし、そこに自分のコミットを1つずつ適用していく」という動きをするため、Gitの内部的にはリモート側が現在地(HEAD)として扱われるからです。

3. 修正を確定してリベースを続行する

すべてのコンフリクト箇所の修正・整理が終わったら、Gitにリベースの再開を指示します。

git add <修正したファイル名>
git rebase --continue

【理由】 リベース中にコミットを確定させる際、通常の git commit を使ってしまうとリベースの管理状態から外れてしまいます。git add でステージングに上げたあと、--continue(続ける)を指示することで、Gitが自動的にあなたのコミットを新しいベースの上に再構築してくれます。

4. リモートに強制プッシュ(Force Push)する

ローカルでのリベースがすべて完了したら、リモートリポジトリに変更を反映させます。

git push origin <自分の作業ブランチ名> --force-with-lease

【理由】 リベースを行うと、ローカルにあるあなたのコミットの「生い立ち(ベースとなる親コミットの歴史)」そのものが書き換わります。そのため、リモート側にある古い歴史と整合性が合わなくなり、通常のプッシュは拒否されます。歴史を上書きするために強制プッシュが必要となりますが、安全のために他人の変更を誤って消さない --force-with-lease オプションを使用するのがベストプラクティスです。

5. 参考文献