Git flowの使い方
インストール
macの場合
brew install git-flow
導入
git flowを導入したいプロジェクトをまだgit管理すらしていない状態の場合、非常に簡単です。以下のコマンドで、
- gitリポジトリとして初期化
- git flow導入
- 本番用ブランチと開発用ブランチをそれぞれ作成
をやってくれます。
# このコマンドを入力した後は全部エンターで良い。特にブランチ名にこだわりがなければ。
$ git flow init
Initialized empty Git repository in /Users/leo/src/noproject/no-sample/.git/
No branches exist yet. Base branches must be created now.
Branch name for production releases: [master]
Branch name for "next release" development: [develop]
How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
# developが作成され、そこにいる状態になる。
$ git branch
* develop
master
使い方
使うリポジトリでgit flowの設定が終わっている前提です。
新機能追加のためfeatureブランチを作成して作業をする場合は、開始:start、終了:finish、となります。
git flow feature start new-awesome-func
これで、feature/new-awesome-funcというブランチがdevelopから分岐して作成され、そのブランチにチェックアウトされます。開発を進めて、add, commit, pushなどは通常のgitコマンドでやります。作業が終了し、developにマージするときは、
# 終了(=developへマージ)
# と同時にdevelopへチェックアウトされ、feature/new-awesome-funcブランチは削除される
git flow feature finish new-awesome-func
もし、マージするときにfeatureブランチを削除せず残しておきたい場合は、-k
オプションをつけて、
git flow feature finish -k new-awesome-func
のようにします。自分がfeatureで作業している間にリモートのdevelopで更新があり、コンフリクトが起きた場合などは、featureブランチが残っていれば再度マージができます。(参考)
featureで開発中にdevelopが更新されたら?
どうするかは開発チームの方針にもよると思いますが、featureブランチにdevelopを取り込む場合は、私はrebaseが良いのではと思っています。あくまでdevelopをベースにしてfeatureを開発しているという意味で。でdevelopが更新されたのでベースポイントを最新コミットに合わせましょうということです。rebaseの場合はgit rebase
と一緒なのですが、git flow用にもコマンドが用意されていて、
# developブランチにて
git pull
# featureブランチに移動
git checkout feature/...
# rebase
git flow feature rebase develop
ただし、すでにfeatureブランチをリモートにプッシュしている場合は注意が必要(というかそれならマージした方が良い)です。なぜならrebaseするときは、最新のベースブランチにfeatureのコミットが追加されていくため、rebase前とはコミット自体が別物になります。したがってrebase後のfeatureブランチをリモートにプッシュしようとすると-f
で強制的に書き換えるしかありません(参考サイト)。
既存のgitリポジトリにgit-flowを導入する方法
私は初めてgit flowを使った時、すでにgitで管理しているリポジトリに追加しようとしました。この場合、開発用(developなど)と本番用(masterなど)の2つのブランチを最低限作っておく必要があります。この状態でリポジトリルートで
git flow init
とすると、以下のように色々聞かれるのでインタラクティブに設定していきます。
git flow init
Which branch should be used for bringing forth production releases?
- develop
- master
- staging
Branch name for production releases: [master]
Which branch should be used for integration of the "next release"?
- develop
- staging
Branch name for "next release" development: [develop]
How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
masterとdevelopは自動で認識してくれるのでproductionブランチをmaster、開発ブランチをdevelopとする場合は、エンターを押すだけで設定が完了します。ただ私がgit flowを使おうとしたリポジトリの開発フローは、develop –> staging –> masterという流れだったので、どうやらgit flowにこのフローを全部任せることはできないようです。はじめからgit flowを使う前提で開発フローもそれに従えばとても便利だと思うのですが、そうじゃない場合にはかえって操作ミスや誤解を招くかもしれませんね。ちなみにgit flow以外にもこうした開発フローを任せられるツールがここで色々比較されています。
git-flowとgit-flow-avhについて
実は、git-flowとgit-flow-avhというのがあります。
当然かもしれませんが、本家の方がスターはずっと多いですね。ただ、AVHの方のREADMEを見ると、こちらには本家にない機能が追加されているとのことです。