git-rebase コマンド

別のベースの先端に対してコミットを再適用し、コミット履歴を書き換えます。

概要

git rebase は、ブランチのベースを一つのコミットから別のコミットに変更するために使用され、あたかも異なるコミットからブランチを作成したかのように見せることができます。元のブランチの各コミットに対して新しいコミットを作成することで履歴を書き換え、より整理された直線的なプロジェクト履歴を実現できます。

オプション

-i, --interactive

対話的なリベースセッションを開始し、コミットの編集、スカッシュ(統合)、並べ替え、または削除を行うことができます。

$ git rebase -i HEAD~3
# 最新の3つのコミットを修正するためのエディタが開く

--onto <newbase>

変更を再適用する新しいベースコミットを指定します。

$ git rebase --onto main feature-branch
# 現在のブランチからfeature-branchを起点としてmainに対してコミットを再適用する

--continue

コンフリクトを解決した後にリベース操作を続行します。

$ git rebase --continue
# コンフリクトを修正した後にリベースを続行する

--abort

リベース操作をキャンセルし、リベース前の状態に戻します。

$ git rebase --abort
# リベースをキャンセルして元の状態に戻す

--skip

現在のパッチをスキップして次のパッチに進みます。

$ git rebase --skip
# 現在のコミットをスキップして次のコミットに進む

-m, --merge

マージ戦略を使用してリベースします。

$ git rebase -m main
# mainにリベースする際にマージ戦略を使用する

-s, --strategy=<strategy>

指定されたマージ戦略を使用します。

$ git rebase -s recursive main
# mainにリベースする際に再帰的な戦略を使用する

使用例

基本的なリベース

$ git checkout feature
$ git rebase main
# featureブランチのコミットをmainの先端に再適用する

コミットをスカッシュするための対話的リベース

$ git rebase -i HEAD~5
# 開いたエディタで:
# pick 01ab234 最初のコミットメッセージ
# squash 56cd789 2番目のコミットメッセージ
# squash 89ef012 3番目のコミットメッセージ
# pick 34gh567 4番目のコミットメッセージ
# pick 78ij890 5番目のコミットメッセージ

ブランチを異なるベースに移動する

$ git rebase --onto main feature-base feature
# feature-baseからfeatureまでのコミットをmainに再適用する

ヒント:

公開ブランチを絶対にリベースしない

公開リポジトリにプッシュされたコミットのリベースは避けてください。リベースはコミット履歴を変更するため、それらのコミットに基づいて作業している他の人にコンフリクトを引き起こす可能性があります。

コンフリクトを慎重に解決する

リベース中にコンフリクトが発生すると、Gitは操作を一時停止します。各ファイルのコンフリクトを解決し、git addで解決済みとマークしてからgit rebase --continueで続行します。

バックアップブランチを作成する

複雑なリベースを実行する前に、git branch backup-branchでバックアップブランチを作成しましょう。リベースがうまくいかない場合のセーフティネットになります。

クリーンアップには対話的リベースを使用する

対話的リベース(-i)は、作業を共有する前にコミット履歴をクリーンアップするのに最適です。関連するコミットを結合したり、不要なコミットを削除したり、コミットメッセージを書き直したりできます。

よくある質問

Q1. マージとリベースの違いは何ですか?

A. マージは履歴を保持しマージコミットを作成しますが、リベースは新しいコミットを作成して履歴を書き換え、直線的な履歴を実現します。

Q2. リベースを元に戻すにはどうすればよいですか?

A. 変更をプッシュしていない場合は、git reflogを使用してリベース前のコミットを見つけ、git reset --hard <commit-hash>でその状態に戻ります。

Q3. マージではなくリベースを使用すべき場合はいつですか?

A. ローカルの未公開コミットをクリーンアップする場合や、直線的な履歴を維持する場合にリベースを使用します。公開ブランチを統合する場合はマージを使用します。

Q4. リベース中のコンフリクトを解決するにはどうすればよいですか?

A. コンフリクトしたファイルを編集して解決し、git addで解決済みファイルを追加してからgit rebase --continueを実行します。

Q5. 複数のブランチを一度にリベースできますか?

A. いいえ、一度に一つのブランチしかリベースできません。

参考文献

https://git-scm.com/docs/git-rebase

改訂履歴