Gitを使った分散開発管理15 – git-flowを使ってみる

2012.01.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

git-flowを使ってブランチの管理

いままでGitについてのさまざまな機能をご紹介してきました。
まだまだほかにも機能があり自由なスタイルでソース管理できるGitですが、自由すぎてどうしようか迷うかもしれません。
今回ご紹介するものは、実際に開発を進めていく中での運用を補助するプラグイン、
git-flowについてご紹介します。

git-flowとは?

「A successful Git branching model」※1 と呼ばれるGitのブランチモデルでの運用を補助するプラグインです。
このモデルにそったgit-flowのブランチモデルは下記のような特徴があります。

  • 中央リポジトリとみなす、originを用意
  • originはmasterとdevelopのブランチを持つ
  • masterはリリース用のブランチで、リリースしたらタグ付けする。(SVNでいう trunkとtag)
  • developは開発用ブランチ。リリース準備ができたらmasterへマージする。リリース前はこのブランチが最新

originをマスターとみなすことで管理が容易になります。
このような運用をすることで、SVNと同じような中央型の利点を得ることができます。

各開発者はmasterとdevelopのブランチのほか、

  • フィーチャーブランチ
  • リリースブランチ
  • ホットフィックスブランチ

のブランチを使用します。
フィーチャーブランチは機能の追加のためのブランチで、developから分岐/マージします。
リリースブランチはリリースの準備のためのブランチです。
機能追加、バグ修正と分離することで、リリース時に含めるコードを綺麗な状態に保つことが可能です。
ホットフィックスブランチはリリース後の緊急バグ修正などの、現在のバージョンに対する変更用です。
このブランチはmasterから分岐/マージし、タグをつけ、developにマージするといった使用方法です。
なお、これらのサポートブランチは最後には削除されます。

インストール

インストールはhomebrewで可能なので簡単です。

$ brew install git-flow

git-flowを使ってみる

では基本的な流れをやってみましょう。

git-flow初期化

ディレクトリを作成し、git flow initコマンドを実行します。
対話式で各種ブランチの名前などを変更することができます。ここは全てデフォルトにします。

%mkdir git-flow-sample                                            
%cd git-flow-sample/                                             
%git flow init                                   
Initialized empty Git repository in /Users/git-flow-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? []

github上のoriginを登録

Github上で適当なプロジェクトを作成し、みなし中央リポジトリとして登録しておきましょう。

% git remote add origin git@github.com:<username>/<作成したリポジトリ>
% git push -u origin master

機能追加をしてみる

まずはfeatureブランチを開始します。git flow feature start <機能名>とします。

% git flow feature start helloworld
Switched to a new branch 'feature/helloworld'

Summary of actions:
- A new branch 'feature/helloworld' was created, based on 'develop'
- You are now on branch 'feature/helloworld'

Now, start committing on your feature. When done, use:

     git flow feature finish helloworld

git branchで確認します。feature/helloworldブランチが作成され、切り替わっています。
また、git flow featureとすると、現在のfeatureブランチ一覧をみることができます。

%git branch
  develop
* feature/helloworld
  master
%git flow feature                                
* helloworld

では適当なファイルを追加しましょう。helloworldを出力するcljファイルを追加し、コミットします。

%vi hello.clj                                    
%git add hello.clj                               
%git commit -m "add hello.clj"                   
[feature/helloworld ef21595] add hello.clj
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 hello.clj

機能追加コミットができたので、ブランチを終了します。
git flow feature finish <機能名>とします。

%git flow feature finish helloworld              
Switched to branch 'develop'
Updating a24a0a1..ef21595
Fast-forward
 hello.clj |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 hello.clj
Deleted branch feature/helloworld (was ef21595).

Summary of actions:
- The feature branch 'feature/helloworld' was merged into 'develop'
- Feature branch 'feature/helloworld' has been removed
- You are now on branch 'develop'

featureブランチが削除され、developブランチに切り替わりました。
logを確認してみると、featureブランチでコミットした内容がdevelopブランチにマージされています。

%git branch                                      
* develop
  master
%git log                                        
commit ef215953889637995b1298b182cd4249cd955289
Author: syuta <nakamura.shuta@gmail.com>
Date:   Sat Jan 7 10:22:58 2012 +0900

    add hello.clj

・・・・

では、みなし中央リポジトリにpushしましょう。

%git push  origin develop                        
Counting objects: 4, done.
Writing objects: 100% (3/3), 265 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:<user>/git-flow-sample.git
 * [new branch]      develop -> develop

Githubで確認してみてください。developブランチが新たに作成され、hello.cljファイルが追加されています。

まとめ

今回はgit-flowのfeature機能を使用してみました。
基本的にリリース機能もホットフィックス機能も似たような流れで使用します。
これを使用すればチームで開発におけるGit運用が便利になりそうですね。

参考サイトなど