Gitリベースについて
git rebase
コマンドを使えば、一連のコミットを容易に修正し、リポジトリの履歴を変更できます。 コミットの順序を変更したり、編集したり、まとめて squash できます。
通常、git rebase
は以下の目的で使われます。
- 以前のコミットメッセージの編集
- 複数のコミットを1つにまとめる
- 不要になったコミットの削除もしくは打ち消し
警告:コミット履歴を変更すると、リポジトリを使う他の人々にとっては難しいことになり得るので、リポジトリにプッシュ済みのコミットをリベースするのは悪いプラクティスと考えられています。 使用している GitHub Enterprise Serverインスタンスで安全にリベースする方法を学ぶにはプルリクエストのマージについてを参照してください。
ブランチに対するコミットのリベース
他のブランチと現在のブランチの状態との間のすべてのコミットをリベースするには、シェル(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
#
# However, if you remove everything, the rebase will be aborted.
#
この情報を上から下へ見ていくと、以下のことが分かります。
- 7つのコミットがリストされており、出発点から現在のブランチの状態までに7つの変更があったことが示されています。
- リベースすることにしたコミットは、古い変更(先頭)から新しい変更(末尾)の順に並べられています。
- 各行にはコマンド(デフォルトでは
pick
)、コミットのSHA、そしてコミットメッセージがリストされています。git rebase
の全体の手続きは、これらの3つの列の操作を軸として展開されます。 行った変更は、リポジトリにリベースされます。 - コミット後に、Gitは作業しているコミットの範囲(
41a72e6..7b36971
)を示します。 - 最後に、Gitはコミットをリベースする際に利用できるコメントを示すことで多少のヘルプを提供しています。
参考リンク
- Git rebaseの利用
- Pro Gitの"Git Branching"の章
- Pro Gitの"Interactive Rebasing"の章
- リベースでのコミットのsquash
- GitHub Desktop ドキュメンテーションの「ブランチを同期する」