Git Ready
履歴を付け替える - git rebase の使い方・オプション・サンプル

履歴を付け替える- git rebase

コミットを別のベースブランチ上に再適用します。

概念図

git rebase diagram

構文

bash
git rebase <branch>

使用例

mainブランチ上にリベース

bash
git rebase main

直近3コミットを対話的にリベース

bash
git rebase -i HEAD~3

インタラクティブリベースのコマンド

git rebase -i を実行するとエディタが開き、各コミットに対して以下のコマンドを指定できます。

コマンド 意味
pick コミットをそのまま使用
reword コミットメッセージを変更
edit コミットの内容を修正
squash 前のコミットと統合(メッセージも統合)
fixup 前のコミットと統合(メッセージは破棄)
drop コミットを削除

コミットを並び替えたい場合は行の順序を入れ替えるだけで OK です。

fixup! コミットと --autosquash を使った実践的な履歴整理の手順は、ガイド cherry-pick と rebase を実務で使いこなす を参照してください。

merge との使い分け

  • merge:履歴をそのまま保持したい

    マージコミットが作られるが、いつ統合されたかが明確になる。チームで「この時点で取り込んだ」という記録を残したいときに向いています。

  • rebase:履歴を直線的にきれいに保ちたい

    マージコミットを作らず一本の歴史に整理できる。ただし履歴の書き換えが発生するため、プッシュ済みのコミットには使わない。

注意点

  • 多くの場合 merge で代替できる

    rebase は履歴を直線的にするための操作ですが、きれいな履歴にこだわりすぎないことも大切です。特別な理由がなければ git merge のほうが安全です。

  • 公開済みコミットをリベースしてはいけない

    最も重要なルールです。リベースはコミットハッシュを変更するため、他の開発者がすでに取得しているコミットをリベースすると、履歴の不整合が発生し、チーム全体に混乱を招きます。

  • コンフリクトはコミット単位で解決する

    リベース中に競合が発生した場合、コミットごとに競合を解決する必要があります。複数のコミットで同じファイルが変更されている場合、何度も競合を解決する必要が出てくることがあります。

  • git rebase --abort で元に戻れる

    いつでもリベース前の状態に戻れるため、競合解決が難しい場合は無理せず中断してください。

関連コマンド