Pull Request
オープンソースだけじゃない!!
PullRequestとは
主にGitHubでこう呼ばれる
複数のリポジトリ・ブランチ間で
のオープンなpatchのやりとりこ
と
PullRequestのフロー
1. ka4君はあるリポジトリA のdevelopブランチをforkして、リ
ポジトリA‘を作り、そこに今回の変更を加えたコミットを追
加した
2. そしてリポジトリAの管理者 (ko8君) に、「A' の develop ブ
ランチに変更おいてあるのでpullしてくれ」と要求する
3. ko8君がそれを確認し、A' -> A に merge を行う。
これが基本的な処理フロー
もっとわかりやすくするとこうなる
PullRequestのフロー2
1. 今回portalの精算画面と勤怠画面を修正することになった
2. Erika君はportalのmasterブランチから新たに精算修正ブラン
チ(feat_account)を作成して修正を追加した
3. Toru君もmasterブランチから新たに勤怠修正ブランチ
(feat_time)を作成して修正を追加した
4. そして二人はportalの今回の修正の管理者 (ko8君) に、各々の
ブランチ( feat_account、feat_time)からmasterへのpull リク
エストを要求する
5. ko8君がそれを確認(レビュー)しmaster に merge を行う。
こんな感じ
例題
今回tomoko君はportalに新たに画面を追加するこ
とになった
今回の追加により、既存の共通クラス
(common)のDB接続クラスを変更する必要があ
る
共通クラスの管理者はko8君である
tomoko君の他にka4君も別の画面の修正をして
いる
そんな場合のcommonクラスの修正の仕方を考え
主な変更パターン①
Tomoko君はko8君にcommonクラスの変更・
対応を依頼する
ko8君の責任
commonクラス
Ko8君の責任
ko8 tomoko
+ 依頼
1. Tomokoはko8に「こういう機能が足りないんだけど、追加しろよ!」と
依頼する
2. Ko8は泣きながら対応する
3. Tomokoはそいつを利用する
主な変更パターン①
このパターンの問題
• オーバーヘッドが大きい
• Ko8君がいつ対応してくれるかという問題
• 変更の依頼・対応は、コミュニケーションコストが
大きい
• 「今すぐ欲しいのに」に対応できない
• コミュニケーションミスで、修正されたのに「コレ
じゃない」問題
主な変更パターン②
Tomoko君はko8君に確認をとり、変更しコミッ
トする
ko8君の責任
commonクラス
tomoko君の責任
ko8 tomoko
確認 +
1. Tomokoはcommonの修正箇所を探し当て、そこに変更を加える
2. Ko8にdiff見せて、「こういう変更してもいい?」って確認とる
3. Ko8は「大丈夫だ。問題ない」
4. Tomokoはドヤ顔でコミットする
主な変更パターン②
このパターンの問題
•コミュニケーションのとれたチームじゃな
いと無理
•仲悪いとかそういう意味じゃなくて、物理
的に作業場所が遠い場合とか
•こいつもコミュニケーションコストが大き
い
主な変更パターン③
Tomoko君は変更せずに解決する方法を探す
ko8君の責任
commonクラス
Tomoko君の責任
tomoko
+
1. Tomokoは当該箇所に一切手を入れずに自分の希望の機能を提供される
ようにした
2. Ko8の責任範囲には影響しないように自分の責任でコードを追加する感
じ
主な変更パターン③
このパターンの問題
•こういうことを繰り返すと、謎のオプションが
増えたり、似た様なメソッドが増えたりカオス
化する
あれ?このメソッドあっちにもあったわ
似たようなメソッドありすぎ、どれ使うの?
どっちも使ってるから消せないやん
結局「あー、そこ樹海だから触らない
で」ってなる・・・・ おめでとう。
主な変更パターン④
Tomoko君は勝手にこっそり変更する
ko8君の責任
commonクラス
tomoko君の責任
tomoko
+
1. Tomokoはcommonの修正箇所を探し当て、そこに変更を加える
2. Tomokoは知らん顔でコミットする
主な変更パターン④
このパターンの問題
•言わずもがな、一番ダメなパターン
•あとからko8が「この変更なんじゃこ
りゃ!?」ってなる
•テストで見つかればいいが、予期せぬバグを
生む原因となる
•あとKo8君のストレスが溜まる
PullRequestでのパターン
では、
プルリクエストを使うと
どうなるのか
PullRequestでのパターン
Tomoko君はko8君に確認をとり、変更しコミッ
トする
ko8君の責任
commonクラス
tomoko君の責任
ko8
tomoko
確認
+
1. Tomokoはローカルブランチでcommonに修正を加え、パッチをつくる
2. TomokoはKo8にpullRequestを送る
3. Ko8はそれを確認(レビュー、リファクタリング)する
4. 変更を取り込む
パッチ
PullRequestでのパターン
見た感じ、パターン②の「変更し、確認
をとりコミットする」に似てるけど
•Git の分散性、ブランチ機能を生かした効率
的なフローがシステムよって提供される
•オープンにやりとりされる
の点で異なる
PullRequestでのパターン
そもそも、Git の利点として
•自分の元にリポジトリを持てる
•気軽にブランチを切り気軽にマー
ジできる
というのがあるけど、Pull Request
こそ、これを最大限生かした理想的
な開発フローじゃないかー(棒)
PullRequestメリット
•パッチは小さいにこしたことは
ない
ソースコードへの変更は、大きければ大きいほど影響
範囲やバグの混入する確率も大きくなるので、パッチ
は小さければ小さい方が良い
小さな patch ごとにレビューが入るため、コストが小
さく、議論が1点に集中できるため質も高い
小さな diff であればあるほど、小さなコストで確認が
できる。それを繰り返すことが重要だ
PullRequestメリット
•コードレビューの機会を設けれ
る
いっぺんにたくさんのコードをレビューするのは
非常に大変だし、コストが大きいけど、pullrequest
は小さい単位でできる
修正者が変更の影響範囲はわかっていたつもりで、
それに対応したつもりだけど、想定できていな
かった影響範囲について、有識者のチェックが入
り、余計なバグを防げる
PullRequestメリット
•レビューによってリファクタさ
れる
レビューされるということは、有識者が、そ
れがその機能を提供するための変更にとって
良い変更なのか、がチェックされることにな
り、ベターからベストな修正にりファクタが
可能
リファクタ自体もカオスになりきった大きな
コードをあとからリファクタすることよりも
PullRequestメリット
•オープンだからそのやりとりが
他の開発者もわかる
こういうやり取りをしてこの変更が加えられたの
だ、ということが他の人に分かる形で残る
次に別の人が手を加えるときにどういう意図で書
かれているのか両人の意図がすぐにわかる
まとめ
•ちいさなパッチを常々レビューしよ
う
•そのために仕事でもPull Request使お
う
•とりあえず、gitHubでもいいから
おまけ
github を用いた開発フロー
https://pepabo.github.io/docs/github/
workflow.html
参考になるから一読してみてくださ
い!

[社内勉強会]Pull requestを使おう