git rebase --onto

ブランチで開発してるとどうしても必要な場面が出てくるので覚えた。

こんな状況。 f:id:suer:20190606213558p:plain

  1. コミット C からブランチして i, ii, iii と開発を進めた。
  2. iii からそれを前提とするブランチをつくって 1, 2, 3 と開発を進めた。
  3. iii を master にマージしたかったが修正が入り iv をコミットしてから master にマージした

この状況で branch_b を master の先端(Z) にリベースしたいが、 i、 ii、 iii はすでに master に入っているので iii の後の 1, 2, 3 だけを rebase したい。

少しなら 1 2 3 を一つづつ cherry-pick してもそんなに苦ではない。 (cherry-pick コミットID..コミットID で一気にやることもできる)

f:id:suer:20190606213836p:plain

cherry-pick の場合は一度作業用のブランチを作ったりして進めないといけなかったりして少々面倒になってきたので git rebase --onto を覚えた。

こんな感じ。

$ git rebase --onto (移動先のベースとなるコミット) \
  (移動するコミット列のベースのコミット) (移動するブランチ)

最初の絵の状況なら

  • 移動先のベースとなるコミット = Z
  • 移動するコミット列のベースのコミット = iii
  • 移動するブランチ = branch_b

なので

$ git rebase --onto Z iii branch_b

f:id:suer:20190606214426p:plain

また、最初の絵の場合 master が Z を指しているので以下でもできる。

$ git rebase --onto master iii branch_b