GitHubを用いた開発フロー(GitHub Flow)のまとめ
GitHubを用いたチームプロジェクト進行の有名なベストプラクティスの一つとして、GitHub Flowという手法がGitHubのstaffであるScott Chaconによって主張されています(GitHub Flow – Scott Chacon)[1]本エントリはこの記事を自分なりに解釈したまとめです。
GitHub Flow?
GitHubのPull Requestを利用した、簡潔なブランチ運用ルールによるチームでの開発フローのこと
GitHub Flowにおける6つのルール
- マスターのブランチにあるものは全てデプロイ可能にしておく
- 何に取り組んでいるのか自明な名称のlocalブランチを切って開発を進める
- (上記のブランチに対して)定期的に同名のリモートブランチへpushする
- 必要なときはいつでもPull Requestを出してチームにレビューを求める
- マスターへのmergeは必ず上記のPull Request reviewを通してから。
- masterが他開発ブランチをmergeしたらすぐdeployする。
git-flowの問題点
git-flow[3]という標準化されたブランチ運用ルールが既に確立されていますが、Scottによれば以下の様な問題点があるそうです;
- ルールそのものが複雑。一般的な開発チームに必要とされる以上に複雑。
- gitそのものが難解なのに、更に複雑なルールが試行され、そのためのヘルパースクリプトnvie/gitflow · GitHubも存在する。
- 基本的にCUIで処理される必要がある。
- (デザイナー等GUIgitクライアントから操作しづらい等の問題?)
つまり、ルールがわかりづらいことそのものが開発コストになるということだと思います。
GitHub flowにおけるブランチ運用ルール
1.masterブランチ: リモートのmaster
は常にdeployできる状態を保つ
- JenkinsなどによるCI管理を積極的に使い、ビルドの清潔を保つ。
master
に問題があったときはrevertか、修正mergeで対応されるべきで、rollbackされるべきではないdeployed
というデプロイ専用ブランチを作っても良いが、普通は行わない。運用ルールはシンプルであればあるほどよいので。- また、
master
に新機能がmergeされた時はすぐにdeployされるべき。- GitHubではHubotを使ってデプロイしている。
master
を壊すのは絶対ダメ
If you push something to master that is not tested or breaks the build, you break the social contract of the development team and you normally feel pretty bad about it.
2. 開発ブランチ: featureの機能開発は、自明な名称の別ブランチを作って行う
- featureごとに、最新の
master
からブランチを切って開発を始める。 - 自明で簡潔な命名を心がける。 ex:
new-oauth2-scopes
,user-content-cache-key
,submodules-init-task
orredis2-transition
意識的にこうしておくことで、開発の進捗がブランチ一覧で一目瞭然に
さらにgit fetch
がそのままTODOリストになる
$ git fetch remote: Counting objects: 3032, done. remote: Compressing objects: 100% (947/947), done. remote: Total 2672 (delta 1993), reused 2328 (delta 1689) Receiving objects: 100% (2672/2672), 16.45 MiB | 1.04 MiB/s, done. Resolving deltas: 100% (1993/1993), completed with 213 local objects. From github.com:github/github * [new branch] charlock-linguist -> origin/charlock-linguist * [new branch] enterprise-non-config -> origin/enterprise-non-config * [new branch] fi-signup -> origin/fi-signup 2647a42..4d6d2c2 git-http-server -> origin/git-http-server * [new branch] knyle-style-commits -> origin/knyle-style-commits 157d2b0..d33e00d master -> origin/master * [new branch] menu-behavior-act-i -> origin/menu-behavior-act-i ea1c5e2..dfd315a no-inline-js-config -> origin/no-inline-js-config * [new branch] svg-tests -> origin/svg-tests 87bb870..9da23f3 view-modes -> origin/view-modes * [new branch] wild-renaming -> origin/wild-renaming
- 開発ブランチと同名のremoteブランチを作成して、定期的にpushする。
- 開発ブランチがremoteにpushされたらCIツールにテストを実行させ、開発レポジトリも常にcleanにできるよう保つとgood
Pull Request
をopenするタイミング
Pull Request
: GitHub上でチームでブランチを比較・議論できるGitHubの1機能のこと
(git本来のコマンド等ではありません)
- 開発ブランチが完成し
master
へのmerge準備ができた時 - 現在の開発ブランチのコードについてチームからフィードバックが欲しい時
- pull request != 完成報告、ということがポイント!
Conclusion
GitHub Flowはブランチの運用方法をシンプルにすることによって、なるべく頻繁にチーム内でのコミュニケーションを取ること、を重視しているようです。
「master
だけは清潔に」、「開発ブランチ名は明確に」、「困ったらすぐPR」。早速実践してみたいと思います。
原典自体は2011年に出たもので、割と古い部類のようです。
GitHubを利用した、類似の開発フローがあったらぜひ教えて頂けると嬉しいです。