履歴を付け替える- git rebase
コミットを別のベースブランチ上に再適用します。
概念図
構文
git rebase <branch>使用例
mainブランチ上にリベース
git rebase main直近3コミットを対話的にリベース
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で元に戻れるいつでもリベース前の状態に戻れるため、競合解決が難しい場合は無理せず中断してください。
