これまでの各記事は、以下から。
リベースの考え方
リベースとは、パッチを順番に当てていく操作。
なので、次の3つをおさえておく必要がある。
- パッチを当てる対象となるコミット(newbase)
- パッチの開始地点となるコミット(upstream)
- パッチの終了地点となるコミット(branch)
さらに、パッチの終了地点のコミットを指していたブランチ(リベース対象のブランチ)は、パッチ適用後の終了地点のコミットを指すように変更される。
リベースの構文
パターン1(--onto
なし)
$ git rebase <newbase> [<branch>]
このとき、上記の3つは、それぞれ以下のようになる。
(<branch>が省略された場合、<branch>は現在のブランチ)
- <newbase>で指定されたコミット
- <newbase>で指定されたコミットと<branch>の共通の親
- <branch>で指定されたコミット
パターン2(--onto
あり)
$ git rebase --onto <newbase> <upstream> [<branch>]
このとき、上記の3つは、それぞれ以下のようになる。
(<branch>が省略された場合、<branch>は現在のブランチ)
- <newbase>で指定されたコミット
- <upstream>で指定されたコミット
- <branch>で指定されたコミット
コミットの細かい指定
どのコミットを使うかなどを細かく指定したい場合、--interactive
オプション(あるいは省略形の-i
)を使う。
このオプションを指定するとエディタでコミットのリストが表示されるので、コマンドの編集などを行う。
使えるコマンドは、以下。
コマンド | 説明 |
---|---|
pick | そのコミットをそのまま使う。(デフォルト) |
reword | そのコミットを使うが、コミットメッセージの修正を行う。 |
edit | そのコミットを使うが、コミットの修正を行うためにリベースを一時停止する。 |
squash | そのコミットでの変更内容を直前のコミットに入れるようにし、コミットを1つにする。 (コミットメッセージの変更も行う) |
fixup | そのコミットでの変更内容を直前のコミットに入れるようにし、コミットを1つにする。 (コミットメッセージの変更は行わず、そのコミットのコミットメッセージは捨てられる) |
exec | execに続く内容をシェルで実行する。 (コミットのリストの間に追加する) |
なお、このリストの順番を入れ替えると、パッチを当てる順番が変更される。
さらに、リストから一行削除すると、そのコミットは使われなくなる。
リベース中のコントロール
変更の衝突やedit
でリベースが一時停止した状態からリベースを再開するには、次のようにする。
$ git rebase --continue
リベースの途中で、リベースを止めて元に戻したいと思った場合には、次のようにする。
$ git rebase --abort
リベースが終わってから、リベース前の状態に戻したい場合には、次のようにする。
$ git reset --hard ORIG_HEAD
今日はここまで!