いものやま。

雑多な知識の寄せ集め

Gitによる歴史改変。(まとめ)

これまでの各記事は、以下から。

リベースの考え方

リベースとは、パッチを順番に当てていく操作。

なので、次の3つをおさえておく必要がある。

  1. パッチを当てる対象となるコミット(newbase)
  2. パッチの開始地点となるコミット(upstream)
  3. パッチの終了地点となるコミット(branch)

さらに、パッチの終了地点のコミットを指していたブランチ(リベース対象のブランチ)は、パッチ適用後の終了地点のコミットを指すように変更される。

リベースの構文

パターン1(--ontoなし)

$ git rebase <newbase> [<branch>]

このとき、上記の3つは、それぞれ以下のようになる。
(<branch>が省略された場合、<branch>は現在のブランチ)

  1. <newbase>で指定されたコミット
  2. <newbase>で指定されたコミットと<branch>の共通の親
  3. <branch>で指定されたコミット

パターン2(--ontoあり)

$ git rebase --onto <newbase> <upstream> [<branch>]

このとき、上記の3つは、それぞれ以下のようになる。
(<branch>が省略された場合、<branch>は現在のブランチ)

  1. <newbase>で指定されたコミット
  2. <upstream>で指定されたコミット
  3. <branch>で指定されたコミット

コミットの細かい指定

どのコミットを使うかなどを細かく指定したい場合、--interactiveオプション(あるいは省略形の-i)を使う。

このオプションを指定するとエディタでコミットのリストが表示されるので、コマンドの編集などを行う。

使えるコマンドは、以下。

コマンド 説明
pick そのコミットをそのまま使う。(デフォルト)
reword そのコミットを使うが、コミットメッセージの修正を行う。
edit そのコミットを使うが、コミットの修正を行うためにリベースを一時停止する。
squash そのコミットでの変更内容を直前のコミットに入れるようにし、コミットを1つにする。
(コミットメッセージの変更も行う)
fixup そのコミットでの変更内容を直前のコミットに入れるようにし、コミットを1つにする。
(コミットメッセージの変更は行わず、そのコミットのコミットメッセージは捨てられる)
exec execに続く内容をシェルで実行する。
(コミットのリストの間に追加する)

なお、このリストの順番を入れ替えると、パッチを当てる順番が変更される。
さらに、リストから一行削除すると、そのコミットは使われなくなる。

リベース中のコントロール

変更の衝突やeditでリベースが一時停止した状態からリベースを再開するには、次のようにする。

$ git rebase --continue

リベースの途中で、リベースを止めて元に戻したいと思った場合には、次のようにする。

$ git rebase --abort

リベースが終わってから、リベース前の状態に戻したい場合には、次のようにする。

$ git reset --hard ORIG_HEAD

今日はここまで!