HRR Co., Ltd.

技術的な記録を残していくことを目的としています。1次情報を大事にしています。

ブランチの派生元を変更したいとき

はじめに

ブランチの派生元を変更したいときにコマンドで対応するお話です。

現ブランチでの修正が少なければ、

  • git diffでパッチファイルを作成してブランチ切り替え後にgit apply
  • git cherry-pickで特定のコミットを移動する
  • 新しいブランチに手で修正を入れ直す

で切り抜けられるかと思いますが、ある程度ブランチが進んだときにはツライものです。
これをコマンド一発で解決する方法についての記事になります。

※パッチファイルについては、過去に記事にしました。

hrroct.hatenablog.com

一次情報

git-scm.com

正直ここに書いてある内容だけで足りる…。

モデルケース

           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以外の手段も残されています。
状況に応じて楽な手段を選んでいただければと思います。

以上でした!