はじめに
ブランチの派生元を変更したいときにコマンドで対応するお話です。
現ブランチでの修正が少なければ、
git diff
でパッチファイルを作成してブランチ切り替え後にgit apply
git cherry-pick
で特定のコミットを移動する- 新しいブランチに手で修正を入れ直す
で切り抜けられるかと思いますが、ある程度ブランチが進んだときにはツライものです。
これをコマンド一発で解決する方法についての記事になります。
※パッチファイルについては、過去に記事にしました。
一次情報
正直ここに書いてある内容だけで足りる…。
モデルケース
main cA -- cB -- cC \ develop -- c1 -- c2 -- c3 \ target -- cX -- cY -- cZ
develop
ブランチから派生したtarget
で開発していたんですが、この度その開発内容をリリースすることになりました。
develop
ブランチには他の修正が入っており、「develop→main」のマージができません。
そこでtarget
ブランチの派生元をmain
にし、main
ブランチにマージすることにします。
main target cA -- cB -- cC -- cX' -- cY' -- cZ' \ develop -- c1 -- c2 -- c3
やり方
git rebase --onto main develop target git rebase --onto 変更先ブランチ 現在の派生元ブランチ 移動対象ブランチ(省略可)
省略した場合は今自分がいるブランチが対象になります。
rebaseコマンドを使っていることからわかるように、targetブランチで積み上げた修正コミットをmainブランチのお尻に持ってくるような動きになります。
注意点
target
ブランチの過去が大きく変わることになるので、このブランチをpushしていた場合には間違いなくコンフリクトすることになります…。
なのでブランチ名を変更して逃げるか、リモートブランチを消せるものなら消すか、個人ならpush -f
するか、選んで対応する必要があると思っております。
最後に
最初に書いた通り、rebase以外の手段も残されています。
状況に応じて楽な手段を選んでいただければと思います。
以上でした!