git rebase --onto とは?
- 指定したコミットに、あるブランチの指定した範囲をつなげるコマンド
G - H - I(target-branch)
/
D - E - F
/
A - B - C (このコミットの後ろに GHI を繋げたい!)
のような形になっている時に、
git rebase --onto C F target-branch
と実行すると、
D - E - F
/
A - B - C - G' - H' - I'(target-branch)
のような形になるようにブランチを操作してくれるコマンド
どんな場面で使えるの?(個人的な感想です)
- テストの経験が浅いが、単体テストを導入したい
- 自分の開発用ブランチに続けてテスト用のブランチを作成し、まずは自分の環境でだけテストできるようにした
- (自分でも手探りなところがあるため)共有されているリポジトリにはテスト用のコミットはpushできない
- 諸事情で
develop
ブランチがmaster
にmergeできなくなったときや、develop
ブランチでの検証が終わったので、unit-test
ブランチをmaster
ブランチの後ろに持って行きたい
というようなケースで便利に使えます。具体的すぎる気もしますが、似たようなケースはたくさんあるのではないかと思います。
2が完了した状態
G - H - I(unit-test)
/
D - E - F (develop)
/
A - B - C (master)
このような形で、なんとなくunit-test
ブランチでのテストはうまく行ったけど、まだmasterにpushできるほどではない、という時に、「せっかく作ったunit-test
ブランチを、再利用可能な形で残しておきたい!」と大半の人が思うことかと思います。
そのようなときこそ、git rebase --onto
の出番です!
unit-test
ブランチをmaster
ブランチの後ろにもっていきましょう。
# unit-test ブランチで、
git rebase --onto master develop unit-test
のコマンドを実行した状態
D - E - F (develop)
/
A - B - C - (master) - G' - H' - I'(unit-test)
unit-test
ブランチが、master
ブランチの後ろにくっつきました。やったー!
最初の例と同じ形になりました!
(もし、引き続きdevelop2
の開発が始まりまって、そこでもunit-test
ブランチの検証がしたいと思った時には、unit-test
ブランチ上で普通に、git rebase develop2
を実行すればOKです!
なれてきたら、最初の
git rebase --onto master develop unit-test
実行時に、
git rebase --onto develop2 develop unit-test
と実行しても大丈夫です!)
まとめ
-
git rebase --onto
を使うとブランチを自由に移動させられる - 新しい技術や手法の検証のために、
git rebase --onto
を使うことができる - ローカル環境で色々試しやすくなって幸せになれる
- ある程度検証が終わったら、
master
にマージしてチーム全体が幸せになれる
注意点
上記のような使い方で、git rebase --onto
が必要なブランチを大量に作っていると、大量にコンフリクトが発生してrebase作業だけで半日たっていた!等、本末転倒なことが起こる可能性がありますのでご注意ください!