今回は分散バージョン管理システム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 を作成することで、この長所を取り入れています。
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 では homebrew か MacPorts を使って簡単にインストールできます。
homebrew:
$ brew install git-flowMacPorts:
$ 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 本体のインストールを Cygwin 、 msysgit どちらで行ったかによってインストール方法が異なります。
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 を利用する場合に必要となります。
PuTTY ダウンロードページ から最新版のインストーラ (執筆時点では 0.6.1) をダウンロードしてインストールしてください
PuTTYgen を起動し、SSH のキーペアを作成します。今回は SSH-2 DSA で生成します
"Generate" キーを押し、"Key" フレーム上でしばらくマウスを動かすと鍵が生成できます。 生成が完了したら、"Save publick key"、"Save private key" により、 それぞれ "id_dsa.pub"、"id_dsa.ppk" 等任意の場所・ファイル名で保存します
Pageant を起動し、生成した鍵を登録します
タスクトレイのアイコンから Pageant を起動し、"Add Key" で先ほど生成した鍵を登録します
起動時に自動的に 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 のインストール
msysgit ダウンロードページ から最新版のインストーラ (執筆時点では 1.7.7) をダウンロードしてインストールしてください。ダウンロードファイルは以下の図に示すように Git-<バージョン番号>-<パッケージのステータスと日付>.exe という形式のものを選択します。
システムパスを追加し、git をコマンドプロンプトから実行できるようにします
git が使う ssh を plink.exe にする
システム環境変数へ GIT_SSH を C:\Program Files\PuTTY\plink.exe として追加します。
git のエディタを設定する
C:\Program Files\Git\cmd\git.cmd にエディタの設定を追加します。以下は Vim (the editor) の設定です。
@set GIT_EDITOR="C:\Program Files\Vim\vim73\gvim.exe"
コマンドプロンプトを起動し、git コマンドが使えるか確認します
C:\>git --version git version 1.7.7.msysgit.1
util-linux パッケージのインストール
util-linux パッケージ ダウンロードページ から最新版のインストーラ (執筆時点では 2.14.1) をダウンロードしてインストールしてください。
インストールディレクトリは、手順 1 でmsysgitをインストールしたのと同じ C:\Program Files\Git を選択します。
※ 他のディレクトリにインストールして getopt.exe のみを C:\Program Files\Git\bin に複製しても良い
git-flow のインストール
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.
同様にサブモジュールをクローンします
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'
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-flow で GITFLOW_DIR を export する箇所をフルパスに書き換える必要があります。
# 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) 上の master 、 develop ブランチおよびタグ 1.0.0 に README.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 のブランチモデルを最大限活用してみてください。