ブランチ

git rebase

コミット履歴を別のブランチの先端に付け替えます。履歴を一直線に整理できますが、共有ブランチへの使用は禁止です。

構文 git rebase <base-branch>

オプション

フラグ 説明
-i / --interactive インタラクティブモードでリベースします。コミットの編集・squash・並び替えが行えます。
--onto <newbase> 付け替え先のブランチを明示的に指定します。三引数リベースに使います。
--abort 進行中のリベースを中断し、リベース前の状態に戻します。
--continue コンフリクト解決後にリベースを再開します。
--autosquash fixup! / squash! で始まるコミットメッセージを自動的に並び替えます。

git rebase は、現在のブランチのコミット群を別のブランチの先端に付け替えるコマンドです。履歴を一直線に整理できるため、プルリクエスト前の履歴整形によく使われます。

⚠️ 警告: 共有ブランチへの rebase は絶対に行わないでください

maindevelop など他の人が使っているブランチに対して rebase を行うと、コミット ID が書き換わりチームメンバーの履歴と食い違います。rebase は自分だけが使っているローカルブランチに限定してください。

基本的な使い方

# feature ブランチで作業中に main の最新変更を取り込む
git switch feature/login
git rebase main

git merge との違いを図で示します。

【merge の場合】
main:    A → B → C → M(マージコミット)

feature: D → E

【rebase の場合】
main:    A → B → C

feature:            D' → E'

rebase 後は feature のコミット(D’, E’)が main の先端に付け替えられ、履歴が一直線になります。

インタラクティブリベース

# 直近3コミットを対話的に編集
git rebase -i HEAD~3

エディタが開き、以下のようなリストが表示されます。

pick a1b2c3d コミットメッセージ1
pick e4f5g6h コミットメッセージ2
pick i7j8k9l コミットメッセージ3

各コミットのアクションを変更できます。

アクション説明
pickそのままコミットを使う(デフォルト)
rewordコミットメッセージを変更する
squash前のコミットに統合する
fixupsquash と同じだが、メッセージを破棄する
dropコミットを削除する

コンフリクトの解決

# コンフリクトが発生したら
git rebase main
# CONFLICT (content): Merge conflict in src/index.js

# ファイルを編集してコンフリクトを解決
git add src/index.js

# リベースを再開
git rebase --continue

# やり直したい場合はリベース前の状態に戻す
git rebase --abort

リモートブランチへの push

rebase によってコミット ID が変わるため、すでに push 済みのブランチに対しては強制 push が必要です。

# 自分だけのブランチに限り使用可能
git push --force-with-lease origin feature/login

--force ではなく --force-with-lease を使うと、他の人が push していた場合に上書きを防げます。