hgflow

GitにはA successful Git branching modelと言われるブランチ運用フローが知られています。

内容の詳細はこちら

原文
A successful Git branching model » nvie.com

翻訳
見えないチカラ: A successful Git branching model を翻訳しました

でこのフローを補助するツールとしてgit-flowというのがあります。
GitHub - nvie/gitflow: Git extensions to provide high-level repository operations for Vincent Driessen's branching model.

git-flowの使い方はこちらが詳しいです。
A successful Git branching model を補助する git-flow を使ってみた - Twisted Mind

これのMercurial版としてhgflowなるものもあります。
yinwm / hgflow / wiki / Home — Bitbucket

なので、上記のgit-flowの使用例にあわせてhgflowも試してみました。


hg flow initで方針を決めます。ここではデフォルトのままにしておきます。なおgit flow initだとgit initも実行されますが、hgflowはそうではないのでhg initを先に実行しておきます。

$ mkdir snowflake
$ cd snowflake
$ hg init
$ hg flow init
Branch name for production release : [default] 
Branch name for "next release" development : [develop] 

How to name your supporting branch prefixes?
Feature branches? [feature/] 
Release branches? [release/] 
Hotfix branches? [hotfix/] 
Version tag prefix? [] 
作業領域をブランチ default に設定
変更なし
作業領域をブランチ develop に設定

この時点でブランチはこうなります。defaultブランチがgitのmasterに相当します。

$ hg branches
develop                        1:a2a56cf63a7f
default                        0:b8b8a5cf5037 (非アクティブ)

適当にファイルを作ってコミットしてみます

$ mkdir src
$ touch src/snowflake.erl
$ hg add src/snowflake.erl 
$ hg ci -m "add snowflake.erl"

新しい機能を実装するので feature ブランチを切ります。
spam というブランチを作ります。

$ hg flow feature start spam
ファイル状態: 更新数 0、 マージ数 0、 削除数 0、 衝突未解決数 0
作業領域をブランチ feature/spam に設定
$ hg branches
feature/spam                   3:08f0cbe9b0ab
develop                        2:bb31437ac6cb (非アクティブ)
default                        0:b8b8a5cf5037 (非アクティブ)

ブランチが作成されたので、コードを編集してコミットします。

$ vim src/snowflake.erl 
$ hg di
diff -r 08f0cbe9b0ab src/snowflake.erl
--- a/src/snowflake.erl	Tue Mar 15 21:13:03 2011 +0900
+++ b/src/snowflake.erl	Tue Mar 15 21:13:45 2011 +0900
@@ -0,0 +1,1 @@
+-module(snowflake)
$ hg ci -m "modify"

コミット後、この feature/spam ブランチを終了します。

$ hg flow feature finish spam
ファイル状態: 更新数 0、 マージ数 0、 削除数 0、 衝突未解決数 0
ファイル状態: 更新数 1、 マージ数 0、 削除数 0、 衝突未解決数 0
ファイル状態: 更新数 1、 マージ数 0、 削除数 0、 衝突未解決数 0
(マージ結果の commit を忘れずに)

$ hg glog
@    チェンジセット:   6:7273f9f37e24
|\   ブランチ:         develop
| |  タグ:             tip
| |  親:               2:bb31437ac6cb
| |  親:               5:5d7b6105ce8b
| |  ユーザ:           wyukawa
| |  日付:             Tue Mar 15 21:14:37 2011 +0900
| |  要約:             hg flow, merge release `spam` to develop branch `develop`
| |
| o  チェンジセット:   5:5d7b6105ce8b
| |  ブランチ:         feature/spam
| |  ユーザ:           wyukawa
| |  日付:             Tue Mar 15 21:14:37 2011 +0900
| |  要約:             hg flow, close feature spam
| |
| o  チェンジセット:   4:e74af3a7186e
| |  ブランチ:         feature/spam
| |  ユーザ:           wyukawa
| |  日付:             Tue Mar 15 21:14:26 2011 +0900
| |  要約:             modify
| |
| o  チェンジセット:   3:08f0cbe9b0ab
|/   ブランチ:         feature/spam
|    ユーザ:           wyukawa
|    日付:             Tue Mar 15 21:13:03 2011 +0900
|    要約:             hg flow, add feature branch `feature/spam`.
|
o  チェンジセット:   2:bb31437ac6cb
|  ブランチ:         develop
|  ユーザ:           wyukawa
|  日付:             Tue Mar 15 21:12:47 2011 +0900
|  要約:             add snowflake.erl
|
o  チェンジセット:   1:a2a56cf63a7f
|  ブランチ:         develop
|  ユーザ:           wyukawa
|  日付:             Tue Mar 15 21:11:27 2011 +0900
|  要約:             hg flow init, add branch develop
|
o  チェンジセット:   0:b8b8a5cf5037
   ユーザ:           wyukawa
   日付:             Tue Mar 15 21:11:27 2011 +0900
   要約:             hg flow init, add .hgflow file

develop にマージされました。
feature/spamブランチはクローズされています。Mercurialの名前付きブランチは削除できないですがクローズはできます。

$ hg branches
develop                        6:7273f9f37e24
default                        0:b8b8a5cf5037 (非アクティブ)
$ hg branches -c
develop                        6:7273f9f37e24
feature/spam                   5:5d7b6105ce8b (閉鎖済み)
default                        0:b8b8a5cf5037 (非アクティブ)

ではリリースブランチを作りましょう。リリース後のバージョンは 1.0 とします。

$ hg flow release start 1.0
ファイル状態: 更新数 0、 マージ数 0、 削除数 0、 衝突未解決数 0
作業領域をブランチ release/1.0 に設定

リリースブランチrelease/1.0が作成されました。

ここで、リリース用に少し変更します。

ebin/snowflake.app を追加してコミットします。

$ mkdir ebin
$ vim ebin/snowflake.app
$ hg add ebin/snowflake.app 
$ hg ci -m "add snowflake.app"

作業が終わったのでリリースブランチrelease/1.0を終了します。

$ hg flow release finish 1.0
ファイル状態: 更新数 0、 マージ数 0、 削除数 0、 衝突未解決数 0
ファイル状態: 更新数 0、 マージ数 0、 削除数 3、 衝突未解決数 0
close target_branch
ファイル状態: 更新数 3、 マージ数 0、 削除数 0、 衝突未解決数 0
(マージ結果の commit を忘れずに)
merge source_tag_name into publish branch
merge target_branch into develop branch
ファイル状態: 更新数 0、 マージ数 0、 削除数 2、 衝突未解決数 0
ファイル状態: 更新数 2、 マージ数 0、 削除数 0、 衝突未解決数 0
(マージ結果の commit を忘れずに)
$ hg tags
tip                               12:100afc538743
1.0                                8:ce7e4321efb3
$ hg branches -c
develop                       12:100afc538743
default                       11:adf3d8d62021
release/1.0                   10:856058d87e68 (閉鎖済み)
feature/spam                   5:5d7b6105ce8b (閉鎖済み)
$ hg glog
@    チェンジセット:   12:100afc538743
|\   ブランチ:         develop
| |  タグ:             tip
| |  親:               6:7273f9f37e24
| |  親:               10:856058d87e68
| |  ユーザ:           wyukawa
| |  日付:             Tue Mar 15 21:16:54 2011 +0900
| |  要約:             hg flow, merge release `1.0` to develop branch `develop`
| |
| | o  チェンジセット:   11:adf3d8d62021
| |/|  親:               0:b8b8a5cf5037
| | |  親:               10:856058d87e68
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:16:54 2011 +0900
| | |  要約:             hg flow, merge release `1.0` to publish branch `default`
| | |
| o |  チェンジセット:   10:856058d87e68
| | |  ブランチ:         release/1.0
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:16:54 2011 +0900
| | |  要約:             hg flow, close release release/1.0
| | |
| o |  チェンジセット:   9:081c2775c0c3
| | |  ブランチ:         release/1.0
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:16:54 2011 +0900
| | |  要約:             Added tag 1.0 for changeset ce7e4321efb3
| | |
| o |  チェンジセット:   8:ce7e4321efb3
| | |  ブランチ:         release/1.0
| | |  タグ:             1.0
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:16:41 2011 +0900
| | |  要約:             add snowflake.app
| | |
| o |  チェンジセット:   7:57b0363a6cf2
|/ /   ブランチ:         release/1.0
| |    ユーザ:           wyukawa
| |    日付:             Tue Mar 15 21:15:28 2011 +0900
| |    要約:             hg flow, add develop branch `release/1.0`.
| |
o |    チェンジセット:   6:7273f9f37e24
|\ \   ブランチ:         develop
| | |  親:               2:bb31437ac6cb
| | |  親:               5:5d7b6105ce8b
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:14:37 2011 +0900
| | |  要約:             hg flow, merge release `spam` to develop branch `develop`
| | |
| o |  チェンジセット:   5:5d7b6105ce8b
| | |  ブランチ:         feature/spam
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:14:37 2011 +0900
| | |  要約:             hg flow, close feature spam
| | |
| o |  チェンジセット:   4:e74af3a7186e
| | |  ブランチ:         feature/spam
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:14:26 2011 +0900
| | |  要約:             modify
| | |
| o |  チェンジセット:   3:08f0cbe9b0ab
|/ /   ブランチ:         feature/spam
| |    ユーザ:           wyukawa
| |    日付:             Tue Mar 15 21:13:03 2011 +0900
| |    要約:             hg flow, add feature branch `feature/spam`.
| |
o |  チェンジセット:   2:bb31437ac6cb
| |  ブランチ:         develop
| |  ユーザ:           wyukawa
| |  日付:             Tue Mar 15 21:12:47 2011 +0900
| |  要約:             add snowflake.erl
| |
o |  チェンジセット:   1:a2a56cf63a7f
|/   ブランチ:         develop
|    ユーザ:           wyukawa
|    日付:             Tue Mar 15 21:11:27 2011 +0900
|    要約:             hg flow init, add branch develop
|
o  チェンジセット:   0:b8b8a5cf5037
   ユーザ:           wyukawa
   日付:             Tue Mar 15 21:11:27 2011 +0900
   要約:             hg flow init, add .hgflow file

default と develop にrelease/1.0ブランチの変更がマージされました。

さらに 1.0 のタグが打たれて、現在のブランチが develop に変更されます。

さて最後に hotfix を当ててみます。

バグを修正した後のバージョン番号は 1.1 にしましょう。

$ hg flow hotfix start 1.1
ファイル状態: 更新数 0、 マージ数 0、 削除数 0、 衝突未解決数 0
作業領域をブランチ hotfix/1.1 に設定

src/snowflake.erl を編集してコミットします。

$ vim src/snowflake.erl 
$ hg ci -m "add author"

hotfixブランチを終了します。

$ hg flow hotfix finish 1.1
ファイル状態: 更新数 0、 マージ数 0、 削除数 0、 衝突未解決数 0
ファイル状態: 更新数 2、 マージ数 0、 削除数 0、 衝突未解決数 0
close target_branch
ファイル状態: 更新数 2、 マージ数 0、 削除数 0、 衝突未解決数 0
(マージ結果の commit を忘れずに)
merge source_tag_name into publish branch
merge target_branch into develop branch
ファイル状態: 更新数 2、 マージ数 0、 削除数 0、 衝突未解決数 0
ファイル状態: 更新数 2、 マージ数 0、 削除数 0、 衝突未解決数 0
(マージ結果の commit を忘れずに)
$ hg branches -c
develop                       18:6210035f6523
default                       17:c70d73961f11
hotfix/1.1                    16:5a6e13e20b0d (閉鎖済み)
release/1.0                   10:856058d87e68 (閉鎖済み)
feature/spam                   5:5d7b6105ce8b (閉鎖済み)
$ hg tags
tip                               18:6210035f6523
1.1                               14:db5c37e8c232
1.0                                8:ce7e4321efb3
$ hg glog
@    チェンジセット:   18:6210035f6523
|\   ブランチ:         develop
| |  タグ:             tip
| |  親:               12:100afc538743
| |  親:               16:5a6e13e20b0d
| |  ユーザ:           wyukawa
| |  日付:             Tue Mar 15 21:19:16 2011 +0900
| |  要約:             hg flow, merge release `1.1` to develop branch `develop`
| |
| | o  チェンジセット:   17:c70d73961f11
| |/|  親:               11:adf3d8d62021
| | |  親:               16:5a6e13e20b0d
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:19:16 2011 +0900
| | |  要約:             hg flow, merge release `1.1` to publish branch `default`
| | |
| o |  チェンジセット:   16:5a6e13e20b0d
| | |  ブランチ:         hotfix/1.1
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:19:16 2011 +0900
| | |  要約:             hg flow, close release hotfix/1.1
| | |
| o |  チェンジセット:   15:b9a54c79aa8d
| | |  ブランチ:         hotfix/1.1
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:19:16 2011 +0900
| | |  要約:             Added tag 1.1 for changeset db5c37e8c232
| | |
| o |  チェンジセット:   14:db5c37e8c232
| | |  ブランチ:         hotfix/1.1
| | |  タグ:             1.1
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:19:04 2011 +0900
| | |  要約:             add author
| | |
| o |  チェンジセット:   13:14b985eef242
|/ /   ブランチ:         hotfix/1.1
| |    ユーザ:           wyukawa
| |    日付:             Tue Mar 15 21:18:24 2011 +0900
| |    要約:             hg flow, add default branch `hotfix/1.1`.
| |
o |    チェンジセット:   12:100afc538743
|\ \   ブランチ:         develop
| | |  親:               6:7273f9f37e24
| | |  親:               10:856058d87e68
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:16:54 2011 +0900
| | |  要約:             hg flow, merge release `1.0` to develop branch `develop`
| | |
| | o  チェンジセット:   11:adf3d8d62021
| |/|  親:               0:b8b8a5cf5037
| | |  親:               10:856058d87e68
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:16:54 2011 +0900
| | |  要約:             hg flow, merge release `1.0` to publish branch `default`
| | |
| o |  チェンジセット:   10:856058d87e68
| | |  ブランチ:         release/1.0
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:16:54 2011 +0900
| | |  要約:             hg flow, close release release/1.0
| | |
| o |  チェンジセット:   9:081c2775c0c3
| | |  ブランチ:         release/1.0
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:16:54 2011 +0900
| | |  要約:             Added tag 1.0 for changeset ce7e4321efb3
| | |
| o |  チェンジセット:   8:ce7e4321efb3
| | |  ブランチ:         release/1.0
| | |  タグ:             1.0
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:16:41 2011 +0900
| | |  要約:             add snowflake.app
| | |
| o |  チェンジセット:   7:57b0363a6cf2
|/ /   ブランチ:         release/1.0
| |    ユーザ:           wyukawa
| |    日付:             Tue Mar 15 21:15:28 2011 +0900
| |    要約:             hg flow, add develop branch `release/1.0`.
| |
o |    チェンジセット:   6:7273f9f37e24
|\ \   ブランチ:         develop
| | |  親:               2:bb31437ac6cb
| | |  親:               5:5d7b6105ce8b
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:14:37 2011 +0900
| | |  要約:             hg flow, merge release `spam` to develop branch `develop`
| | |
| o |  チェンジセット:   5:5d7b6105ce8b
| | |  ブランチ:         feature/spam
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:14:37 2011 +0900
| | |  要約:             hg flow, close feature spam
| | |
| o |  チェンジセット:   4:e74af3a7186e
| | |  ブランチ:         feature/spam
| | |  ユーザ:           wyukawa
| | |  日付:             Tue Mar 15 21:14:26 2011 +0900
| | |  要約:             modify
| | |
| o |  チェンジセット:   3:08f0cbe9b0ab
|/ /   ブランチ:         feature/spam
| |    ユーザ:           wyukawa
| |    日付:             Tue Mar 15 21:13:03 2011 +0900
| |    要約:             hg flow, add feature branch `feature/spam`.
| |
o |  チェンジセット:   2:bb31437ac6cb
| |  ブランチ:         develop
| |  ユーザ:           wyukawa
| |  日付:             Tue Mar 15 21:12:47 2011 +0900
| |  要約:             add snowflake.erl
| |
o |  チェンジセット:   1:a2a56cf63a7f
|/   ブランチ:         develop
|    ユーザ:           wyukawa
|    日付:             Tue Mar 15 21:11:27 2011 +0900
|    要約:             hg flow init, add branch develop
|
o  チェンジセット:   0:b8b8a5cf5037
   ユーザ:           wyukawa
   日付:             Tue Mar 15 21:11:27 2011 +0900
   要約:             hg flow init, add .hgflow file 

新しいタグ1.1が作られdevelopにマージされています。が、しかし、hotfixブランチがdevelopから分岐してます。defaultから分岐するのが正しいのでは。。。hgflow-v0.3.pyの190行目の'develop'というハードコードが気になりますw

いじょ