リモートの最新の変更の上に、自分のコミットを歴史の後ろから付け直すことで、履歴を一本の直線に保ちながら競合を解決する手法(git rebase)のマニュアルです。
自分の作業ブランチ(例: feature)にいる状態で、元となる親ブランチ(例: main)の最新状態を後ろに敷き直します。
git fetch origin
git rebase origin/main
【理由】 自分の変更を「あとから追加する」ためには、まずリモート側の最新状態の履歴をローカルに落とし込み、その最新状態をベース(土台)として自分のコミットを上に乗せ換える必要があるためです。
リベース中にコンフリクトが発生すると、処理が一時停止します。git status で衝突しているファイルを確認し、使い慣れたエディタで開いて修正します。
【注意】リベース中の衝突部分の表記
<<<<<<< HEAD
リモート側の最新コード(ベース側)
=======
自分が書いた、あとから追加しようとしているコード
>>>>>>> 1234567... (コミットID)
【理由】
リベースは「リモートの最新状態に一時的にチェックアウトし、そこに自分のコミットを1つずつ適用していく」という動きをするため、Gitの内部的にはリモート側が現在地(HEAD)として扱われるからです。
すべてのコンフリクト箇所の修正・整理が終わったら、Gitにリベースの再開を指示します。
git add <修正したファイル名>
git rebase --continue
【理由】 リベース中にコミットを確定させる際、通常の git commit
を使ってしまうとリベースの管理状態から外れてしまいます。git add
でステージングに上げたあと、--continue(続ける)を指示することで、Gitが自動的にあなたのコミットを新しいベースの上に再構築してくれます。
ローカルでのリベースがすべて完了したら、リモートリポジトリに変更を反映させます。
git push origin <自分の作業ブランチ名> --force-with-lease
【理由】
リベースを行うと、ローカルにあるあなたのコミットの「生い立ち(ベースとなる親コミットの歴史)」そのものが書き換わります。そのため、リモート側にある古い歴史と整合性が合わなくなり、通常のプッシュは拒否されます。歴史を上書きするために強制プッシュが必要となりますが、安全のために他人の変更を誤って消さない
--force-with-lease オプションを使用するのがベストプラクティスです。