Git ブランチを複数のブランチにマージしようとしてコンフリクトが起きた場合にはマージできない
Git ブランチを複数のブランチにマージしようとしてコンフリクトが起きた場合にはマージできない
いま動いているプロジェクトで、Git ブランチをこのように運用しています。
- リポジトリは GitHub にある
- main ブランチは本番環境にデプロイするためのもの
- develop ブランチで開発する
- 本番環境にデプロイするときには develop を main にマージし、main を本番環境にアップする
-
必ず GitHub の PR を使ってマージする(c4 や c6)
-
develop ブランチの進行中に、急遽両方に適用したい修正が出た場合は、fix ブランチを作って main, develop の両方へマージする
- fix ブランチは main, develop の共通の祖先から作る
-
その後 develop ブランチでの開発が完了したときに、develop を main にマージする。
- develop には c8 が含まれていて、main にも c8 が含まれているが、同じ c8 であるため develop をマージしてもコンフリクトは起こらない(*1 と理解しています)
- cherry-pick で両方に同じ修正を入れると、あとで develop を main にマージしたときコンフリクトが起きる(*2 と理解しています)ので、そうしていません
発生している問題・エラー
やりたいことは、c8 の増分だけを develop と main の両方に適用することです。のちに develop を main にマージしてもコンフリクトを起こさないように、です。
c8 の時点で fix を develop にマージしようとして、コンフリクトが発生したとします(c7 と c8 に同じ箇所への追記がある、など)。GitHub の Web 上の "Resolve conflicts" ボタンでの編集やコマンドラインでの解決は、develop ブランチを fix ブランチにマージしたのち fix を develop へマージします(*3 と理解しています)。
その後 fix ブランチから main ブランチへマージしようとすると、マージ元である fix ブランチには develop ブランチの内容が含まれており、c8 の差分だけを main にマージすることができません。main には開発中の develop の他の修正(c7)もマージされてしまいます。
- PR でマージをするには、対象がブランチでなければならない(*4 と理解しています)
質問
- *1 の理解は間違っているでしょうか?
- *2 の理解は間違っているでしょうか?
- *3 の理解は間違っているでしょうか?
- *4 の理解は間違っているでしょうか?
- 「両方のブランチに修正を適用したい場合、共通の祖先を持つコミットから fix ブランチを作る」という使い方は間違っているでしょうか?
- コンフリクトの発生を回避することができない以上、「fix ブランチから複数のブランチに fix ブランチの修正だけをマージする」という使い方をするのは難しいのでしょうか?
- これは「必ず PR でマージする」という制限がなければ可能なのでしょうか?