git-flowとは、A successful Git branching modelを簡単に行えるように開発されたツール。
A successful Git branching modelは、効率的にバージョンを管理するために開発されたブランチを活用したモデル。
このモデルに沿って開発していくと、マージ漏れだったり何が最新かわからなくなったり、どこで作業すればよいかわからなくなる、といったことがなくなる。
このモデルでは5つのブランチを利用する。5個のブランチを用意する、ということではなくて5種類のブランチを利用するということ。なのでfeatureブランチが2つある場合もある。
- developブランチ
- featureブランチ
- releaseブランチ
- masterブランチ
- hotfixブランチ
開発を行う主軸となるブランチ。開発の最新情報はこのブランチに集約される。このブランチで作業することはなく、他のブランチからマージされて形成されていく。
作業者が作業を行うブランチ。developブランチから各作業者がブランチを作成して開発していく。終わるとdevelopブランチにマージされ、featureブランチは削除される。
プロダクトをリリースするためのブランチ。featureブランチで各自が作業し、その集約がdevelopブランチとなり、いよいよリリースとなるとまずdevelopブランチからreleaseブランチを作成。リリース前の最終調整をreleaseブランチで行う。releaseブランチでの作業が終わるとその内容が、masterブランチとdevelopブランチにマージされる。マージするとreleaseブランチは削除される。
その名の通り、リリースされた最新情報を管理するためのブランチ。リリースしたタイミングを管理するため、リリースタグも打つ。
リリースしたプロダクトにバグがあってすぐ直したい場合に使うブランチ。リリースしたけどタイポがあった、とかセキュリティ的にまずいので緊急対応が必要!というときに使う。hotfixブランチはmasterブランチから作成する。作業終了後は、masterブランチとdevelopブランチにマージされ、hotfixブランチは削除する。
常に存在しているのは、developブランチとmasterブランチ。developブランチが開発の主軸で、masterブランチがリリースの主軸。
作業のメインとなるのが、featureブランチ。作業が終われば削除されるもの。
リリース前、最後の微調整をするのが、releaseブランチ。作業が終われば削除されるもの。
緊急対応時に使用するのが、hotfixブランチ。作業が終われば削除されるもの。
この開発モデルの肝となる部分というか面倒な部分は、どのブランチがどのブランチから作る必要があるのか把握しておく必要があり、しかもそのブランチを作る作業も若干手間。また、作業が終わった後にどのブランチにマージさせる必要があるのか把握しておくのとその作業も面倒。
ここを補ってくれるのが、git-flow。
$ git flow init -d
とすると、開発に必要な環境(各ブランチを用意するなど)を行ってくれる。(オプションの -d はおそらくデフォルトのこと。このオプションを付けておくと「 develop / feature / release / master / hotfix 」という名前で管理される。もしこのオプションを付けないとそれぞれオリジナルの名前をつけることができる)
いざ作業を始めるときには、featureブランチで作業するので
$ git flow feature start <ブランチ名>
とコマンドするだけで、自動でdevelopブランチの先頭から<ブランチ名>を作ってくれる。わざわざブランチを切り替えて、などといった作業をする必要がなくなる。
$ git flow feature start mitomex
と打てば、「 feature/mitomex 」という名のブランチを作ってくれる。releaseブランチやhotfixブランチも同様。
$ git flow release start 0.1.0
や
$ git flow hotfix start v1.0.1
となる。
作業が終わったら
$ git flow feature finish <ブランチ名>
とコマンドすればマージする必要があるブランチに自動でマージしてくれて、マージし終わったブランチは自動で削除される。featureブランチをfinishさせればdevelopブランチにマージしてくれるし、releaseブランチでfinishさせればmasterブランチとdevelopブランチにマージしてくれる。
自分がどのブランチで作業する必要があるのか、を把握しておけば後はgit-flowというツールが補完してくれる。