Skip to main content

Git リベースについて

git rebase コマンドを使えば、一連のコミットを容易に修正し、リポジトリの履歴を変更できます。 コミットの順序を変更したり、編集したり、まとめて squash できます。

通常、次の場合に git rebase を使用します。

  • 以前のコミットメッセージの編集
  • 複数のコミットを1つにまとめる
  • 不要になったコミットの削除もしくは打ち消し

警告: コミット履歴を変更すると、リポジトリを使う他の人にとって管理が困難になる場合があるため、リポジトリにプッシュ済みのコミットをリベースするのは推奨されません。 GitHub.com で安全にリベースする方法については、「プルリクエストのマージについて」をご覧ください。

ブランチに対するコミットのリベース

他のブランチと現在のブランチの状態との間のすべてのコミットをリベースするには、シェル(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はコミットをリベースする際に利用できるコメントを示すことで多少のヘルプを提供しています。

参考資料