ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

git-flowというものを使うらしいのでちょっと調べてみたなど

今回掴んだバイトですが、まだまだサービスがリリース前なので「変更はmasterリポジトリに突っ込んどいていいよ」と言われています。しかし、今後は「git-flow」というものを使って作業をすすめるようにとのことです。なんでしょうかねこれ、というわけでちょっとだけ調べてみました。

git-flowとは?

小洒落た言い方をすれば「yet another*1なブランチワーク補助ツール」です。結局は使う側も多少はルールに従う必要なのですが、これを使うことで、複雑なブランチの切り方をしてもあまり混乱することなくリリース状態をキープすることができるようです。

インストール

$ sudo yum install gitflow

yumはお使いのパッケージ管理ツールへと適当に読み替えてください。「gitflow」も環境によっては「git-flow」だったりするのでそちらも適宜読み替えt(ry

つかってみる

git-flowを使いたいリポジトリに移動したら

$ 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? [] 

特にこだわりのない人は何も考えずにEnterを押しておけばいいかと思います。なお、コマンドを打ったときのカレントディレクトリがgitのリポジトリではないときは、親切にもgit initしてくれます。なお、以降ことわりがなければ

開発版ブランチ
上記のdevelopブランチ
リリースブランチ
上記のmasterブランチ

とします。重要なのは、これらのブランチは直接触らないようにすることです。直に触ると後々面倒ですからね。

機能を追加してみる

未だかつて私はまともにやったことがありませんが、普通にGitを使ってバージョン管理をするときもまずはブランチを切りますよね。git-flowはこのへんをクールにサポートをしてくれます。どういうことかというと、

  1. 機能を追加するブランチを切る
  2. (機能を追加するためのコードは書いてくれません。自分で書きましょう)
  3. 開発版ブランチにマージする
  4. 機能追加ブランチを破棄する
  5. リリースのために必要な作業をするためのブランチを切る
  6. リリースブランチにマージする
  7. リリース作業のためのブランチを破棄する

という一連の作業を抜け漏れが出にくいようにしてくれます。
ではやってみましょう。

git-flow-feature start で作業開始

$ git-flow feature start add-some-feature
Switched to a new branch 'feature/add-some-feature'

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

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

     git flow feature finish add-some-feature

メッセージにもある通り、「git-flow feature start add-some-feature」と打ち込むと

  1. 「develop」という開発版ブランチを元に「feature/add-some-feature」というブランチを切る
  2. 先のブランチをチェックアウトする

というのを同時にやってくれます。試しにgit branchしてみると

$ git branch
  develop
* feature/add-some-feature
  master

このとおり。コードを書いていくときは普通にgitを使うのと大差ありません。ファイルを追加したり変更したりしたらaddしてcommitしていきます。

git-flow feature finish で作業終了

書き終わったらマージしてみましょう。

$ git-flow feature finish 
Switched to branch 'develop'
Updating 5970974..8d3eaa5
Fast-forward
 0 files changed
 create mode 100644 add.txt
Deleted branch feature/add-some-feature (was 8d3eaa5).

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

ここでは、

  1. 開発版ブランチの「develop」に、機能追加ブランチの「feature/add-some-feature」をマージする
  2. 機能追加ブランチを削除する
  3. 開発版ブランチに移動する

というのを一気にやってくれます。

そしてリリースへ…

機能追加のためのブランチはリリースブランチには一切手をつけません。ではリリースはどうするのか。
「git-flow release start」でしょ!
このコマンドは開発版ブランチからブランチを切ります。対になる「git-flow release finish」コマンドは、作業が終わったらリリースブランチと開発版ブランチにそれぞれ変更をマージし、リリース前作業で使ったブランチを削除し、ついでにタグ付をおこないます。基本的な使い方は機能追加をするときと変わりありませんね。

バグが見つかったらhotfix!

大変です。せっかく作った機能にアレなバグが見つかりました。速やかな対処が必要とのことで、機能追加ブランチを切ってマージして、リリース前の作業ブランチを切って…なんて悠長なことはしてられません。
そんな時に使うのが「git-flow hotfix start」です。このコマンドは開発版ブランチからバグフィックス用のブランチを切ります。対になる「git-flow hotfix finish」は、変更を開発版ブランチとリリースブランチの両方にマージします。こちらも基本的な使い方は機能を追加するときと変わりありません。

違いをまとめるとこうなる

若干端折ってご紹介した3つのコマンドですが、違いは以下のとおりです。

コマンド startで元にするブランチ finishで変更をマージするブランチ 使う目的
git-flow feature 開発版ブランチ 開発版ブランチ 機能追加
git-flow release 開発版ブランチ 開発版ブランチとリリースブランチ リリース前作業
git-flow hotfix リリースブランチ 開発版ブランチとリリースブランチ バグフィックス

*1:この界隈ではよく聞いた気がするけれど最近聞かなくなった気もする文言。あえて訳すなら「他とはちょっと違うんだぜ(チッチッ」的な意味