git rebase
コミット履歴を別のブランチの先端に付け替えます。履歴を一直線に整理できますが、共有ブランチへの使用は禁止です。
構文
git rebase <base-branch> git rebase は、現在のブランチのコミット群を別のブランチの先端に付け替えるコマンドです。履歴を一直線に整理できるため、プルリクエスト前の履歴整形によく使われます。
⚠️ 警告: 共有ブランチへの rebase は絶対に行わないでください
mainやdevelopなど他の人が使っているブランチに対して 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 | 前のコミットに統合する |
fixup | squash と同じだが、メッセージを破棄する |
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 していた場合に上書きを防げます。