git cherry-pickで別ブランチのコミットを取り込んだら、取り込み元のコミットは消すべきなのかな?
ちょっとだけボリュームのある機能なので、ブランチを切ることになったんですが、ブランチを切るタイミングがずれてしまい、切ったブランチに欲しいコミットが反映されてない形になってしまいました。git cherry-pick
を初めて使って、欲しいコミットをブランチに取り込んで解決したんですが、masterにブランチをマージする時、コンフリクトの原因になってしまいました。取り込んだコミットはorigin/masterにあって、簡単に消す方法も知らなかったし、マージする際もその部分については同じコードがマージされるので、gitがうまいことやってくれると思ったんですが、ダメでした。何とかして、origin/masterから消しておくべきだったんでしょうか?
状況
- origin/masterにとあるコミットAがコミットされる。
- ブランチBを切ったが、その際
git pull
をしてなかったので、コミットAの1個前の位置で、ブランチBが出来てしまった。 - コミットAはブランチBでの開発に必要なので、
git cherry-pick コミットA
をしてブランチBにコミットAを取り込んだ。 - ブランチBでの開発を終え、masterにブランチBをマージしようとしたら、コミットAの内容でコンフリクト。
$ git merge branchB CONFLICT (rename/delete): Rename etc/conf.d/foo.conf->etc/conf.d/bar.conf in HEAD and deleted in branchB
ちょっとややっこしいのが、コミットAがgit mv
によるリネームという事です。ブランチB上でfoo.confは、git cherry-pick コミットA
によってbar.confになりました。その後、ブランチBでの開発でgit mv
で置き場所を1階層下のフォルダに変えています。
# Unmerged paths: # (use "git add/rm <file>..." as appropriate to mark resolution) # # added by us: etc/conf.d/bar.conf #
マージ時に、この様にbar.confを復活させようとしてきました。ブランチB上では削除というより、移動済みのファイルです。
今回、git cherry-pick
を使うのは初めてだったので、事前に使い方などをネットで調べたりしましたが、その中にはgit cherry-pick
したら元のコミットを取り除くようなことを書いてるエントリーも見かけました。*1取り除こうにも、コミットはリモートであるorigin/masterにあり、push済みのコミットを改変するのはよくないとも聞くので、今回は取り除きませんでした。ちゃんと取り除いてればコンフリクトしなかったのかも分かりませんが、git cherry-pick
をちゃんと使うにはどうすればいいのか、疑問の残る形になってしまいました。誰かが教えてくれるかなとちょっとだけ期待しつつ、記録しておきます。
*1:どこで見かけたか忘れちゃいましたが