git-flow によるブランチの管理

surgo
2011/11/07 09:30

今回は分散バージョン管理システムgitと共に用いる「ブランチモデル」について紹介していただきます。gitを使ってみて、その高機能さをどう使えば良いか悩まれた方は、ぜひ本稿をご一読ください。gitそのものの使い方については解説していませんので、その際には『 実用git 』などの書籍を参考にしてください。

git-flow は Vincent Driessen 氏によって書かれた A successful Git branching model (O-Show 氏による日本語訳) というブランチモデルを補助するための git 拡張です。 git-flow を利用する前には、まずこの文章を一読することをおすすめします。 その骨子については、 Voluntas 氏のブログ が参考になります。

git を使うメリットの 1 つは、そのブランチモデルです。しかし gitを使っていると、その高い柔軟性から各開発者ごとにブランチが 分散 しがちであったり、最新バージョンが把握しにくいといった不便を感じることがあります。

このツールを導入することで、git の長所を損なわずに、

  • 分散型バージョンコントロールシステムである git に集中型 (Subversion 等) の長所を取り入れることができる
  • チーム内でブランチモデルを共通化できる

などの利点を得ることが可能です。

分散型に対する集中型の長所は、

  • リポジトリが 1 つのため、管理が簡単
  • マスターが 1 つのため、最新バージョンが把握しやすい
  • コミットすべきリポジトリがわかりやすい。

と言われています。これは、リポジトリが 1 箇所にあることの長所であり、短所です。 git-flow では、中央と みなす リポジトリ origin を作成することで、この長所を取り入れています。

centr-decentr.png

Git ブランチモデル( A successful Git branching model より。Creative Commons BY-SA ライセンス)

git-flow のブランチモデルを要約すると、

origin には master, develop という 2 つの メインブランチ を保持します。

  • master: リリースブランチ。プロダクトとしてリリースするためのブランチ。リリースしたらタグ付けする。集中型でいう trunk、tag。
  • develop: 開発ブランチ。コードが安定し、リリース準備ができたら master へマージする。リリース前はこのブランチが最新バージョンとなる。

各開発者は master, develop の他に、フィーチャーブランチ、リリースブランチ、ホットフィックスブランチという サポートブランチ を利用し分散開発します。このブランチは最終的には破棄されます。各ブランチの目的は

  • フィーチャーブランチ: 機能の追加。 develop から分岐し、 develop にマージする。
  • リリースブランチ: プロダクトリリースの準備。 機能の追加やマイナーなバグフィックスとは独立させることで、 リリース時に含めるコードを綺麗な状態に保つ(機能追加中で未使用のコードなどを含まないようにする)ことができる。 develop ブランチにリリース予定の機能やバグフィックスがほぼ反映した状態で develop から分岐する。 リリース準備が整ったら, master にマージし、タグをつける。次に develop にマージする。
  • ホットフィックスブランチ: リリース後のクリティカルなバグフィックスなど、 現在のプロダクトのバージョンに対する変更用。 master から分岐し、 master にマージし、タグをつける。次に develop にマージする。

となります。このサポートブランチにより、マージ、コミットすべきブランチを明確化することができます。

git-flow 環境を構築する

git-flow のソースコードはgithubのリポジトリ nvie@github/gitflow に公開されています。

Mac OS へのインストール

Mac OS では homebrewMacPorts を使って簡単にインストールできます。

homebrew:

$ brew install git-flow

MacPorts:

$ port install git-flow

Linux へのインストール

Linux へは 利用しているディストリビューションのパッケージ管理システム、 もしくは以下のコマンドによってインストールできます。

$ wget --no-check-certificate -q -O - https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | sudo bash

Windows へのインストール

Windows の場合は git 本体のインストールを Cygwinmsysgit どちらで行ったかによってインストール方法が異なります。

Cygwin:

$ wget -q -O - https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash

msysgit による git / git-flow 環境の構築

git-flow のドキュメントでは、msysgit の利用が推奨されています。 ここでは、 msysgit による git と git-flow 環境の構築手順について詳しく解説したいと思います。

git-flow の導入に必要なソフトウェアは以下の通りです。

  • PuTTY: SSHクライアント。SSH 経由で git を利用する場合に必要。OpenSSH で代用が可能
  • msysgit: git 本体
  • util-linux パッケージ: GnuWin32 プロジェクトが提供している Util-linux パッケージ。 Util-linux パッケージは Linux においてファイルシステム、コンソール、パーティション、カーネルメッセージなどを取り扱うユーティリティプログラムです。 GnuWin32 は GNU のツール群を Windows 環境(32bit)で使えるようにしたものです
  • git-flow: git-flow 本体

PuTTY のインストール

github 等 SSH 経由で git を利用する場合に必要となります。

  1. PuTTY ダウンロードページ から最新版のインストーラ (執筆時点では 0.6.1) をダウンロードしてインストールしてください

    images/installation.putty.download.png

    ダウンロードページ

  2. PuTTYgen を起動し、SSH のキーペアを作成します。今回は SSH-2 DSA で生成します

    images/installation.putty.keygen.png

    鍵の生成

    "Generate" キーを押し、"Key" フレーム上でしばらくマウスを動かすと鍵が生成できます。 生成が完了したら、"Save publick key"、"Save private key" により、 それぞれ "id_dsa.pub"、"id_dsa.ppk" 等任意の場所・ファイル名で保存します

  3. Pageant を起動し、生成した鍵を登録します

    images/installation.putty.pageant.start.png

    起動するとタスクトレイにアイコンが表示されます

    タスクトレイのアイコンから Pageant を起動し、"Add Key" で先ほど生成した鍵を登録します

    images/installation.putty.pageant.addkey.png

    プライベートキーの追加

    起動時に自動的に Pageant 起動したい場合は、"スタートアップ" に以下のショートカットを追加します。

    "C:\Program Files\PuTTY\pageant.exe" "C:\path\to\.ssh\id_dsa.ppk"
    

github を使いたい場合は、github.com の鍵をキャッシュします。この場合、事前に github 側に公開鍵 ("id_dsa.pub") を登録しておく必要があります (参考)。

C:\>"\Program Files\PuTTY\plink.exe" git@github.com The server's host key is not cached in the registry. You have no guarantee that the server is the computer you think it is.
The server's rsa2 key fingerprint is:
ssh-rsa 2048 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
If you trust this host, enter "y" to add the key to PuTTY's cache and carry on connecting. If you want to carry on connecting just once, without adding the key to the cache, enter "n".
If you do not trust this host, press Return to abandon the connection.
Store key in cache? (y/n) y
Using username "git".
Server refused to allocate pty
Hi Surgo! You've successfully authenticated, but GitHub does not provide shell access.

msysgit のインストール

  1. msysgit ダウンロードページ から最新版のインストーラ (執筆時点では 1.7.7) をダウンロードしてインストールしてください。ダウンロードファイルは以下の図に示すように Git-<バージョン番号>-<パッケージのステータスと日付>.exe という形式のものを選択します。

    images/installation.msysgit.download.png

    ダウンロードページ

    images/installation.msysgit.runfromcmd.png

    実行方法の選択

    システムパスを追加し、git をコマンドプロンプトから実行できるようにします

  2. git が使う ssh を plink.exe にする

    システム環境変数へ GIT_SSHC:\Program Files\PuTTY\plink.exe として追加します。

    images/installation.msysgit.path.png
  3. git のエディタを設定する

    C:\Program Files\Git\cmd\git.cmd にエディタの設定を追加します。以下は Vim (the editor) の設定です。

    @set GIT_EDITOR="C:\Program Files\Vim\vim73\gvim.exe"
    
  4. コマンドプロンプトを起動し、git コマンドが使えるか確認します

    C:\>git --version
    git version 1.7.7.msysgit.1
    

util-linux パッケージのインストール

util-linux パッケージ ダウンロードページ から最新版のインストーラ (執筆時点では 2.14.1) をダウンロードしてインストールしてください。

images/installation.utillinux.download.png

ダウンロードページ

インストールディレクトリは、手順 1 でmsysgitをインストールしたのと同じ C:\Program Files\Git を選択します。

※ 他のディレクトリにインストールして getopt.exe のみを C:\Program Files\Git\bin に複製しても良い

images/installation.utillinux.path.png

インストールディレクトリの選択

git-flow のインストール

  1. github から git-flow をローカルにクローンしてください

    C:\>git clone git://github.com/nvie/gitflow.git
    remote: Counting objects: 2199, done.
    remote: Compressing objects: 100% (885/885), done.
    remote: Total 2199 (delta 1302), reused 2109 (delta 1225)
    Receiving objects: 100% (2199/2199), 457.02 KiB | 231 KiB/s, done.
    Resolving deltas: 100% (1302/1302), done.
    
  2. 同様にサブモジュールをクローンします

    C:\>cd gitflow
    C:\gitflow>git submodule init
    Submodule 'shFlags' (git://github.com/nvie/shFlags.git) registered for path 'shFlags'
    C:\gitflow>git submodule update
    Cloning into shFlags...
    remote: Counting objects: 454, done.
    remote: Compressing objects: 100% (55/55), done.
    remote: Total 454 (delta 389), reused 454 (delta 389)
    Receiving objects: 100% (454/454), 101.30 KiB | 54 KiB/s, done.
    Resolving deltas: 100% (389/389), done.
    Submodule path 'shFlags': checked out '2fb06af13de884e9680f14a00c82e52a67c867f1'
    
  3. git-flow のインストールスクリプトを実行します

    C:\gitflow>contrib\msysgit-install.cmd
    Installing gitflow into "C:\Program Files\Git"...
    getopt.exe... Found
    Copying files...
    C:\tmp\gitflow\git-flow -> C:\Program Files\Git\bin\git-flow
    1 個のファイルをコピーしました
    C:\tmp\gitflow\git-flow -> C:\Program Files\Git\bin\git-flow
    C:\tmp\gitflow\git-flow-feature -> C:\Program Files\Git\bin\git-flow-feature
    C:\tmp\gitflow\git-flow-hotfix -> C:\Program Files\Git\bin\git-flow-hotfix
    C:\tmp\gitflow\git-flow-init -> C:\Program Files\Git\bin\git-flow-init
    C:\tmp\gitflow\git-flow-release -> C:\Program Files\Git\bin\git-flow-release
    C:\tmp\gitflow\git-flow-support -> C:\Program Files\Git\bin\git-flow-support
    C:\tmp\gitflow\git-flow-version -> C:\Program Files\Git\bin\git-flow-version
    7 個のファイルをコピーしました
    C:\tmp\gitflow\gitflow-common -> C:\Program Files\Git\bin\gitflow-common
    C:\tmp\gitflow\gitflow-shFlags -> C:\Program Files\Git\bin\gitflow-shFlags
    2 個のファイルをコピーしました
    C:\tmp\gitflow\shFlags\src\shflags -> C:\Program Files\Git\bin\gitflow-shFlags
    1 個のファイルをコピーしました
    

※ 2011-10-26 現在、git-flow を Windows で実行するためには、 C:\Program Files\Git\bin\git-flowGITFLOW_DIRexport する箇所をフルパスに書き換える必要があります。

# export GITFLOW_DIR=$(dirname "$0")
export GITFLOW_DIR="C:\\Program Files\\Git\\bin"

コマンドラインを再起動すると、git-flow が使えるようになっています。

C:\gitflow>git flow version
0.4.2-pre

git-flow を利用する

簡単な利用方法を例示するために、 github 上に spam というプロジェクトを作成します。

中央 (origin) を作成する

git-flow プロジェクトの作成。

$ mkdir spam
$ cd spam
$ git flow init

git flow init を実行すると、対話式に以下の入力を求められます。

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 の Web サイトで spam というプロジェクトを作成し、コマンドラインから origin として登録します。

$ git remote add origin git@github.com:[username]/spam.git
$ git push -u origin master

すでに origin が存在している場合は、

$ git clone git@github.com:[username]/[project].git
$ cd [project]
$ git flow init

とすることにより、既存プロジェクトに git-flow を導入できます。

機能を追加する

spam プロジェクトに "hello world" と出力する機能を提供する egg.py を追加してみます。

git flow feature start hello

これにより、 feature/hello というブランチが作成され、スイッチされます。ブランチを確認してみましょう。

$ git branch
  develop
* feature/hello
  master

また、現在のフィーチャーブランチの一覧を確認してみましょう。

$ git flow feature
* hello

以下のような egg.py を作成します。

# -*- coding: utf-8 -*-
#!/usr/bin/env python

def hello():
    print "hello world"

if __name__ == '__main__':
    hello()

egg.py をリポジトリに追加します。

$ git add egg.py
$ git commit -m "Add hello."

この機能を開発用ブランチにマージします。

$ git flow feature finish hello

これにより、 develop ブランチにマージされ、 feature/hello ブランチは削除されます。

$ git branch
* develop
  master

develop ブランチを origin に push します。

$ git push origin develop

github (origin) 上に develop ブランチが作成され、 egg.py が作成されているのが確認 (https://github.com/[username]/spam/tree/develop) できます。また、 master ブランチには何も変更が加えられていないことも確認できます (https://github.com/[username]/spam)。

リリースする

リリース準備が整ったと仮定し、リリースブランチを作成します。

$ git flow release start 1.0.0

ブランチの状態を確認します。

$ git branch
  develop
  master
* release/1.0.0

リリース 1.0.0 のリリース準備が整いました。リリースに含まれる機能などを明記する README.md を作成してみましょう。

HISTORY
=======

- 1.0.0: Echo "hello world"

リリース準備が終わったので、 1.0.0 をリリースしてみます。

$ git add README.md
$ git commit -m "Update README for release 1.0.0."
$ git flow release finish 1.0.0

エディタが開きタグの入力を求められます。 1.0.0 等を入力し、エディタを閉じます。ブランチやタグを確認してみましょう。

$ git branch
* develop
  master

$ git tag
1.0.0

各ブランチを origin に push します。

$ git push

タグ 1.0.0 を origin に push します。

$ git push origin 1.0.0

github (origin) 上の masterdevelop ブランチおよびタグ 1.0.0README.md が作成されているかを確認します。

ホットフィックスを当てる

ホットフィックス用のブランチを master から作成します。

$ git flow hotfix start 1.0.1-somefix

ブランチの状態を確認します。

$ git branch
  develop
* hotfix/somefix
  master

egg.py をちょっとだけ編集します。

$ git diff
diff --git a/egg.py b/egg.py
index 1340512..9125761 100644
--- a/egg.py
+++ b/egg.py
@@ -2,7 +2,7 @@
 #!/usr/bin/env python

 def hello():
-    print "hello world"
+    print "hello world!"

 if __name__ == '__main__':
     hello()

ホットフィックスを適用します。

$ git commit egg.py -m "Add missing char."
$ git flow hotfix finish 1.0.1-somefix
$ git branch
* develop
  master

$ git tag
1.0.0
1.0.1-somefix

origin に push して確認してみましょう。

$ git push
$ git push origin 1.0.1-somefix

以上が、 git-flow を利用したブランチモデルの簡単な例となります。

最後に

今回は git-flow に触れてみました。同様のツールとして、ほかに Sotaro Karasawa 氏が公開されている git-daily 等もあります。最初に戻りますが、git の長所の一つはブランチモデルです。自分やチームにあったツールを使い、 git のブランチモデルを最大限活用してみてください。

Bookfair

O'Reilly Japanのセレクションフェア、全国の書店さんで開催
[ブックフェアのページへ]

Feedback

皆さんのご意見をお聞かせください。ご購入いただいた書籍やオライリー・ジャパンへのご感想やご意見、ご提案などをお聞かせください。より良い書籍づくりやサービス改良のための参考にさせていただきます。
[feedbackページへ]