ReadableなPull Requestを作る為に心がけていること②
前田です。
来週月曜日から久しぶりに社員全員で集まってローカルワークする予定なので今からwktkです。
以前書いた「ReadableなPull Requestを作る為に心がけていること」の追加で少し書きたいことがあったので追加で書きます。
前回「Pull Request(以下PR)を見やすくする為に粒度を小さくする」ことを心がけている、と書きました。
そんな、タスクの粒度が大きくてPRを細かくした時に行っているちょっとしたGitHubの運用ノウハウを紹介します。
1つのタスクを細かくするとどうなるか
① 分割した機能を実装するPR1をmasterブランチから切る
② PR1の機能を実装
③ 分割した機能を実装するPR2を**(PR1で実装した機能を使いたいので)PR1ブランチから切る
④ PR2の機能を実装
⑤ 分割した機能を実装するPR3を(PR2で実装した機能を使いたいので)**PR2ブランチから切る
そうすると以下のような状態になります。
この場合の問題は、PR2のmasterとの差分がPR1と被っている、PR3のmasterとの差分がPR1・PR2と被っている、ということです。
PR1をmasterにマージすればPR2は見やすくなっているのですが、レビューが中々進まない時はPR1がmasterにマージ出来ないので図のような状態になってしまいます。
コードの差分が重複しているとレビューアが「あれ、さっきもこのPR見たような。。?」などと混乱してしまい、差分もたくさんあり見ずらいPRになってしまいます。
解決方法は簡単で、PR先を以下のように変えることです。
こうすることで、PR2・PR3の差分が見やすくなります。
各PRで修正が入った時はどうするか
たとえばPR1で修正が入った時はどうするか。
PR1で修正をコミット後、PR2はPR1からrebaseし、PR3はPR2からrebaseします。
コンフリクトすることもあり、ちょっと面倒ですが子PRをrebaseしていきます。
コンフリクトがたくさん出て大変な時はcherry-pickで解決するのがいいと思います。
例 : PR2からPR3のrebaseが大変な時
PR2から新しくブランチ(PR3_1)を切る → PR3から必要なコミットをPR3_1にcherry-pick → PR3を削除
マージする時に気を付ける
マージする時には気を付けないといけません。
例えばPR1のレビューが終わり、PR1をmasterにマージしてcloseすると、PR1に対してリクエストしているPR2が自動でcloseされ、PR2に対してリクエストしているPR3が自動でcloseされます。
なので、正しい手順はPR1をmasterにマージする前にPR2のマージ先をmasterに変えてあげる必要があります。
その後、PR1をmasterにマージすればPR2とPR3はcloseされず、PR2・PR3の差分も同じです。
GitHubでのPRマージ先の変更はタイトルの右にある「Edit」ボタンから変更することが出来ます。
PR先を変更してSaveすれば変更されます。
以上GitHubでPRを見やすくするために実施しているちょっとしたチップスでした!
お役に立てたら幸いです。