今回、肥大化したPRをレビュワーへの負担軽減やPRの粒度を小さくするためにブランチを途中で分離させる方法を記載します。

今回のケース

mixedブランチ(様々なレイヤーの変更が盛り込まれているブランチ)を

  • apiブランチ
  • batchブランチ

へ分離する。 そして、最終的にmixedブランチに対して、api・batchがapproveされた状態でマージさせたい。

こうすることで、複雑なmixedブランチがmainへマージされる時には全てapproveされたことを担保する。

手順

イメージとしては以下のような感じ。

gitGraph commit id: "main初期状態" branch mixed commit id: "api+batch+その他変更" checkout main branch api merge mixed id: "mixedからapi dirのみ取り込み" checkout main branch batch merge mixed id: "mixedからbatch dirのみ取り込み" checkout mixed commit id: "api,batch差分削除" checkout api commit id: "apiレビュー対応" tag: "approved" checkout batch commit id: "batchレビュー対応" tag: "approved" checkout mixed merge api merge batch checkout main merge mixed tag: "全承認済"
# apiブランチの作成
git checkout main
git checkout -b api

# mixedブランチからapiディレクトリの変更を取り込み
git pull mixed -- api
git commit -m "merge: mixedからapiの変更を取り込み"
git push -u origin HEAD

# batchブランチの作成
git checkout main
git checkout -b batch

# mixedブランチからbatchディレクトリの変更を取り込み
git pull mixed -- batch
git commit -m "merge: mixedからbatchの変更を取り込み"
git push -u origin HEAD

# mixedブランチからapi, batchディレクトリの差分削除
git checkout mixed
git restore --source=main api batch
git commit -m "revert: api, batch処理分離に伴う差分削除"
git push

これで無事にapi, batchディレクトリの差分分けが完了しましたとさ。 mixedブランチには今までの差分が保持されるので、まとめてresetするよりも安全かなと思います。

最適解ではないと思うので、参考にされる場合は自己責任でお願いします!