git flow でのチーム開発ワークショップ資料

この記事は会社内の別チームの方に、
僕の今のチームで git をどう運用してるかを
ワークショップ形式で説明するための資料である。

事前準備

git と git-flow を入れておくこと

参考資料(Macでgitとgit-flowインストール)

- xcode cli toolインストール 
-- https://daw.apple.com/cgi-bin/WebObjects/DSAuthWeb.woa/wa/login?appIdKey=d4f7d769c2abecc664d0dadfed6a67f943442b5e9c87524d4587a95773750cea&path=%2F%2Fdownloads%2Findex.action
- homebrew のインストール 
-- https://github.com/mxcl/homebrew/wiki/installation
- brew で git と git-flow のインストール
-- >brew install git
-- >brew install git-flow

参考資料(Windowsでgitとgit-flowインストール:msysgist編)

- msysgistのインストール
-- http://code.google.com/p/msysgit/downloads/list?q=full+installer+official+git
- git-flowのために、util-linuxからgetopt.exeとlibintl3.ddlを入手
-- http://gnuwin32.sourceforge.net/packages/util-linux-ng.htm#download から「Complete package, except sources」 でダウンロードしインストール
-- インストールディレクトリ(「C:\Program Files (x86)\GnuWin32」)の「bin\getopt.exe」と「bin\libintl3.ddl」をmsysgit のインストールディレクトリのbin(「C:\Program Files (x86)\Git\bin」)にコピー
- git clone git://github.com/nvie/gitflow.git する
-- >cd gitflow
-- > git clone git://github.com/nvie/shFlags.git
-- 管理者権限で、contrib\msysgit-install.cmd "C:\Program Files (x86)\Git" を実行
 

前提

うちのチームの前提
- リリースは週1ぐらいを想定
- チームサイズは10人程度
- リモートリポジトリは各人もったりしないで一個

リリースサイクル早かったり人数多いと運用は変わるだろう。

git-flow とは

Vincent Driessen氏がブログに書いた"A successful Git branching model" というブランチモデルの導入を簡単にする git プラグインである
(日本語訳 http://keijinsonyaban.blogspot.jp/2010/10/successful-git-branching-model.html)

A successful Git branching model とは
http://d.hatena.ne.jp/Voluntas/20101223/1293111549
から引用すると

master ブランチは tag 専用とする
新機能開発は feature ブランチで行う
細かい開発は develop ブランチで行う
release ブランチはタグを打つための作業を行う
hotfix ブランチはバグフィックスを行う専用のブランチで develop と master に反映する

というモデルである.

git flow コマンドは上記モデルを助けるためのツールなので、
なるべく上記モデルを理解し、
git flowコマンドが裏側で何をやっているのかも理解しながら行なって欲しい

注釈
git flowが本当に何をやってるか詳しく知りたい人は、ソースを読もう。
https://github.com/nvie/gitflow
git プラグインは基本的にはシェルスクリプトだ。
例えばgit flow feature finishが何をやってるか見たければ
このソースの
https://github.com/nvie/gitflow/blob/develop/git-flow-feature
cmd_finishを見ればいい

git flow の初期化

まずは二人一組になって欲しい。はーい。あぶれた人は先生と組みましょうね。
二人の名前はアリスとボブと名づける
(二人一組になれない人は一人二役でcloneするディレクトリをAliceとBobと2つに分けて実行しよう。ScreenとかでWindowわけておくといいのでは)

アリスもボブもgit cloneをしてローカルにリポジトリをクローンしよう

次にアリスもボブもgit flow initで、リポジトリの初期化を行なっておこう
色々と聞かれるが、git flowのFeatureブランチの名前などを聞かれている
基本はデフォルトで良い

#git flow init

Which branch should be used for bringing forth production releases?
   - master
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? [] 

git flow init -d を使うとすべてデフォルトの設定のままでコマンドが終わる

このときgit branchコマンドを実行するとdevelopブランチで作業してることになっているはずである

# git branch
* develop
  master

注記
ほんとうにまっさらなgitリポジトリでやってると、developブランチがremoteにないのでこの後の説明で怒られるので、
git push origin developしておこう。
(ワークショップのとき、まっさらなリポジトリでやったので怒られた><)

アリスが新しい機能の作成を行うために Feature ブランチを切る

さて、新しい機能を作成しよう。

アリスはコマンドラインから数値を受け取って、数値にしたがって、FizzBuzzを表示するタスクをやって欲しいと言われた。
(ワークショップなのでプログラムの内容は適当)

チケット番号は TSK48 とする。

まずは機能を作成する前に、Feature branchを切る。

Feature branchとは、将来に向けた機能を開発するためのブランチである。
日々の開発は基本的にはFeature branch上で行うことになる。

brach名には「チケット番号_簡単な説明」としている。
アリスは以下のようにgit flow start コマンドを実行しよう。

# git flow feature start TSK48_fizzbuzz
Switched to a new branch 'feature/TSK48_fizzbuzz'

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

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

     git flow feature finish TSK48_fizzbuzz

この時点で何が行われているかというと、feature/TSK48_fizzbuzzというブランチが作成され、
そのbranchがチェックアウトされた状態になっている。

アリスがgit branchすると以下のようになる。

# git branch                                      
  develop
* feature/TSK48_fizzbuzz
  master

feature/TSK48_fizzbuzzが作られチェックアウトされている。

>>
注記
git を使うときは、しつこいぐらいに git branch , git status , git status -s,git status -bコマンドを使うべき。
自分がどこにいるかを確認しないとダメだからだ。
僕はzshコマンドプロンプトにブランチの状態と、statusの状態を自動で表示するようにしている。