プライベートリポジトリを fork した人が作ったリモートのブランチをローカルに持ってくる
仕事のプロダクトがプライベートリポジトリで、そのリポジトリを fork した人と clone した人がそれぞれいる場合の話。
僕はそのリポジトリを自分の手元に clone して、ブランチを切ってプルリクエストを作ってというごく一般的な方法で業務を進めているのだけど、このリポジトリを fork して仕事をしているメンバーもいる。
で、fork した人が作成したプルリクエストに対して別のメンバーが変更を加えたい場合にどうするか分からなくて諦めていたんだけど、チームメンバーが教えてくれたのでメモしておく。
リモートに fork しているユーザーのリポジトリを登録する
僕(tagucch)がwork-repoというリポジトリを Fork しているという体でメモすることにする。
僕が fork しているリポジトリからfeature/add-new-contentというブランチ名でプルリクエストを作成した場合、プルリクエストのマージ元(base)はwork-repo:develop(ここでは develop ブランチとします。main とか master もよくあるよね)ということになるし、作られるプルリクエストのブランチはtagucch:feature/add-new-contentということになる。
で、このブランチを別の誰かがローカルに持っていきたいときに、普通にgit switch -c feature/add-new-content tagucch/feature/add-new-contentとやっても怒られてしまう。
なので、tagucch/work-repoを remote に登録しなければならない。
git remote add git@github.com:tagucch/work-repoすることで remote にリポジトリを登録し、git fetch tagucchとすることでtagucch/work-repoの状態を fetch する。
そうすることでgit switch -c feature/add-new-content tagucch/feature/add-new-contentが成功してローカルにブランチが切れる。
で、このブランチにコミットを足してgit push tagucch feature/add-new-contentすることでwork-repoにあるプルリクエストが更新される。
clone or fork
今の職場ではリポジトリを clone するか fork するかの指定は特にないんだけど、どっちのほうがいいのかよく分かっていない。
もし fork していた場合、例えばその会社を退職することで GitHub の organization から抜けた場合、その時点での fork したリポジトリがその人の repositories に残り続ける気がする(違うかもしれないけど)
それと fork の場合は上述のように各メンバーが fork した人のリポジトリを remote に追加するという作業が発生する。
fork は OSS みたいな不特定多数の開発者からプルリクエストをもらうことを前提とする場合の仕組みとしては適当だと思うけど、organization に所属しているメンバーからのコミットに限定するとしたら clone のほうがかなり楽な気がする。
なので、個人的には clone のほうがいいかなと思うんだけど実際どうなんだろう?