git-flowがよくわからなかったので、Graphvizで書いてみました

Gitについて調べていて、git-flow（ツールじゃなくってワークフローの方ね）というのが出てきて、これがよくわからなかったので、図を写しました。

元ネタはこちらから。
[A successful Git branching model » nvie.com](http://nvie.com/posts/a-successful-git-branching-model/ "A successful Git branching model » nvie.com")

[見えないチカラ: A successful Git branching model を翻訳しました](http://keijinsonyaban.blogspot.jp/2010/10/successful-git-branching-model.html "見えないチカラ: A successful Git branching model を翻訳しました")

（多少アレンジしています。現時点での私の理解に基づいて書いているので、間違っているかもしれません。）

Graphviz（dot言語）で書いておくと、

- テキストデータなので再利用が容易
- テキストエディタで編集できるので、あとで間違いの修正や書き足しが容易
- めんどくさいレイアウトはレンダリングエンジンさんにお任せするので、余計なことは考えなくていい

というメリットがあります。

``` git-flow.dot 
//
// git-flow.dot
// Graphviz でgit-flowを書いてみる
//
// ファイルは、UTF-8で保存すること
//
// 画像ファイルの作成例
// dot -Tpng  git-flow.dot -o  git-flow.png
//

digraph gitflow {
  newrank=true; // サブグラフ間でrankを使う設定
  rankdir = TB;
  ratio=compress;
  fontname=sans;
  label="git-flow";

  node [fontname=sans, fontsize = 10, shape = circle];
  edge [fontname=sans, fontsize = 8];

  subgraph cluster_feature {
    rankdir = TB;
    label="feature";

    feature_A_begin [label="機能A"] ;
    feature_A_end [label="削除"] ;
    feature_A_begin -> A01 -> A02 -> A03 -> A04 -> A05 -> A06 -> feature_A_end [weight = 5];

    feature_B_begin [label="機能B"] ;
    feature_B_end [label="削除"] ;

    feature_B_begin -> B01 -> B02 -> feature_B_end [weight = 5];

    { rank = same; A01 ; B01 }
    { rank = same; A06 ; B02 }
    { rank = same; feature_A_begin ; feature_B_begin }
    { rank = same; feature_A_end ; feature_B_end }
  }

  subgraph cluster_develop {
    rankdir = TB;
    label="develop";

    develop_begin [label="開発"] ;
    develop_end [label="続く…"] ;

    develop_begin -> d01 [ weight = 5];
    d01 -> d02 [weight = 5];
    d02 -> d03 [weight = 5];
    d03 -> d04 [weight = 5];
    d04 -> d05 [weight = 5];
    d05 -> d06 [weight = 5];
    d06 -> d07 [weight = 5];
    d07 -> d08 [weight = 5];
    d08 -> d09 [weight = 5];
    d09 -> develop_end [weight = 5];
  }

  subgraph cluster_release {
    rankdir = TB;
    label="release";
    release_begin [label="リリース"] ;
    release_end [label="削除"] ;

    release_begin -> r01 -> r02 -> r03 -> r04 ->  r05 -> r06 -> release_end [weight = 5]; 
  }

  subgraph cluster_hotfix {
    rankdir = TB;
    label="hotfix";
    hotfix_begin [label="バグ修正"] ;
    hotfix_end [label="削除"] ;
    hotfix_begin -> h01 -> hotfix_end [weight = 5];
  }

  subgraph cluster_master {
    rankdir = TB;
    label="master";
    TAG01[label="0.1"];
    TAG02[label="0.2"];
    TAG10A[label="1.0α"];
    TAG10B[label="1.0β"];
    TAG10[label="1.0"];
    master_begin [label="マスター"] ;
    master_end [label="続く…"] ;
    master_begin -> TAG01 ->  TAG02 -> TAG10A -> TAG10B -> TAG10 -> master_end [weight = 5]; 
  }

  TAG01 -> d01[ label ="反映"];
  d03 -> A01;
  d03 -> B01 [ label ="機能の実装のためのブランチ"];

  A03 -> d06[ label ="実装"] ;

  TAG01 -> h01[ label ="バグ取り"];
  h01 -> TAG02[ label ="バグ修正完了"];
  h01 -> d05[ label ="バグ修正の反映"];

  d06 -> r01[ label ="リリース準備のためのブランチ"];
  r02 -> d07[ label ="リリースのための修正"];
  r04 -> d08[ label ="リリースを反映"];
  r04 -> TAG10A[ label ="リリース準備"];

  d07 -> A04[ label ="リリースのための機能修正"];

  A06 -> d08 [ label ="実装完了"];
  B02 -> d08;

  d08 -> r06;
  r06 -> TAG10[ label ="正式リリース"];
  r06 -> d09[ label ="正式リリースを反映"];

  { rank = same;  feature_A_begin ; feature_B_begin ; develop_begin ; release_begin ; hotfix_begin ; master_begin }

  {rank = same; d03 ; h01 }
  {rank = same; develop_end ; master_end }
  {rank = same; feature_A_end ; feature_B_end ; release_end }

} // EOF

```
で、できた図はこちら。

![git-flow.png](https://qiita-image-store.s3.amazonaws.com/0/26107/9448fd2a-db03-be68-dd44-e25670cb61c1.png)