通常、次の場合に git rebase
を使用します。
- 以前のコミットメッセージの編集
- 複数のコミットを1つにまとめる
- 不要になったコミットの削除もしくは打ち消し
Warning
コミット履歴を変更すると、リポジトリを使う他の人にとって管理が困難になる場合があるため、リポジトリにプッシュ済みのコミットをリベースするのは推奨されません。 安全にリベースする方法については、「プルリクエストのマージについて」を参照してください。
ブランチに対するコミットのリベース
他のブランチと現在のブランチの状態との間のすべてのコミットをリベースするには、シェル(Windowsのコマンドプロンプト、あるいはMacやLinuxのターミナル)で以下のコマンドを入力してください。
git rebase --interactive OTHER-BRANCH-NAME
ある時点に対するコミットのリベース
現在のブランチの最後のいくつかのコミットをリベースするには、シェルに以下のコマンドを入力してください。
git rebase --interactive HEAD~7
リベースに利用できるコマンド
リベースの際に利用できるコマンドは6つあります。
pick
pick
は、単にコミットが含まれていることを意味します。pick
コマンドの順序を入れ替えると、リベースの実行中にコミットの順序が変更されます。 コミットを含めないのであれば、行全体を削除してください。reword
reword
コマンドはpick
に似ていますが、これを使用すると、リベース プロセスが一時停止し、コミット メッセージを変更することができます。 コミットによる変更は影響されません。edit
- コミットを
edit
すると、コミットを修正することができます。つまり、コミットを追加し、完全にコミットを変更することができます。 また、リベースを続ける前にさらにコミットをすることもできます。 こうすることで大きなコミットを小さなコミット群に分割したり、コミット中の間違った変更を取り除いたりすることができます。 squash
- このコマンドを使うと、2 つ以上のコミットを結合して 1 つのコミットにできます。 コミットはその上にあるコミットに squash されます。 Git は、どちらの変更についても記述する新しいコミットメッセージを書かせてくれます。
fixup
- これは
squash
に似ていますが、マージされるコミットのメッセージは破棄されています。 コミットはその上位のコミットに単純にマージされ、選考するコミットのメッセージがどちらの変更の記述としても使われます。 exec
- このコマンドは、コミットに対して任意のシェルコマンドを実行させてくれます。
git rebase
を使用する例
使用するコマンドに関係なく、Git は既定のテキスト エディターを起動し、選択した範囲内のコミットの詳細を示すファイルを開きます。 このファイルは以下のようになります。
pick 1fc6c95 Patch A
pick 6b2481b Patch B
pick dd1475d something I want to split
pick c619268 A fix for Patch B
pick fa39187 something to add to patch A
pick 4ca2acc i cant' typ goods
pick 7b36971 something to move before patch B
# Rebase 41a72e6..7b36971 onto 41a72e6
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
この情報を上から下へ見ていくと、以下のことが分かります。
- 7つのコミットがリストされており、出発点から現在のブランチの状態までに7つの変更があったことが示されています。
- リベースすることにしたコミットは、古い変更(先頭)から新しい変更(末尾)の順に並べられています。
- 各行には、コマンド (既定では
pick
)、コミット SHA、コミット メッセージが一覧表示されます。git rebase
手順全体は、主にこれら 3 つの列の操作に関するものです。 行った変更はリポジトリに リベースされます。 - コミットの後、Git によって、使用しているコミットの範囲 (
41a72e6..7b36971
) が通知されます。 - 最後に、Gitはコミットをリベースする際に利用できるコメントを示すことで多少のヘルプを提供しています。
参考資料
- コマンドラインで Git リベースを使う
- Pro Git ブックの「Git 分岐」の章
- Pro Git ブックの「対話型リベース」の章
- リベースを使用したコミットのスカッシュ
- GitHub Desktop ドキュメントの「GitHub Desktop でのブランチの同期」