Chapter 8
Managing releases and branchy development

Mercurial めるようなプロジェクトできるみをっていますこれらのみをするためにまずはソフトウェアみをめてみましょう

くのソフトウェアプロジェクトでは規機メジャリリしますそれとして マイリリすることがありますくのマイナリリにしたメジャリリですがバグがなされています

このでは、「リリのようなプロジェクトマイルストする方法からめたいといますそのプロジェクトにおけるフェでのれやその Mercurial によってする方法ます

8.1 Giving a persistent name to a revision

リビジョンリリぶことにしたならそのリビジョンID するべきですリビジョンID することでらかのえばバグ再現プラットフォへのになったリリ再現することがで きます

1  $ hg init mytag
2  $ cd mytag
3  $ echo hello > myfile
4  $ hg commit -A -m ’Initial commit’
5  adding myfile

hg tagコマンド利用することでMercurial リビジョンしますこのことを タグびます

1  $ hg tag v1.0

リビジョンにとってタグ徴的”(symbolic name) でもありませんタグ純粋便のためにするものでリビジョンするとなります Mercurial 利用いるタグしたりしませさができることをするためにいてはタグらかのをつけたりすることもありませ 以下のいずれのタグには使できません

hg tagsコマンド使することでリポジトリしているタグさせることができますhg tagsコマンドにおいてタグけされたリビジョンめにタグリビジョン最後一意リビジョンハッシュ れます

1  $ hg tags
2  tip                                1:8997f6fa7740
3  v1.0                               0:d9f38a9cee5b

tip タグhg tagsコマンドされていることにしてくださいtip リポジトリリビジョン タグです

hg tagsコマンドではタグリビジョンされていますこれはタグタグよりも されることをそれはhg tagsするタグtip されることもしま

hg logコマンドタグけられたリビジョンするhg logコマンドタグしま

1  $ hg log
2  changeset:   1:8997f6fa7740
3  tag:         tip
4  user:        Bryan O’Sullivan <bos@serpentine.com>
5  date:        Mon Jul 20 21:58:56 2009 +0000
6  summary:     Added tag v1.0 for changeset d9f38a9cee5b
7  
8  changeset:   0:d9f38a9cee5b
9  tag:         v1.0
10  user:        Bryan O’Sullivan <bos@serpentine.com>
11  date:        Mon Jul 20 21:58:56 2009 +0000
12  summary:     Initial commit
13  

Mercurial コマンドしてリビジョンするがあるリビジョンするではタグ 使することができますMercurial ではタグするリビジョンしてから使していま

1  $ echo goodbye > myfile2
2  $ hg commit -A -m ’Second commit’
3  adding myfile2
4  $ hg log -r v1.0
5  changeset:   0:d9f38a9cee5b
6  tag:         v1.0
7  user:        Bryan O’Sullivan <bos@serpentine.com>
8  date:        Mon Jul 20 21:58:56 2009 +0000
9  summary:     Initial commit
10  

リポジトリできるタグにもリビジョンできるタグにもはありませんとし タグリビジョンするものですからプロジェクトじてなりますがタグ するのはよろしくありませんくのタグがあるとリビジョンする便してしまいま

えばあるプロジェクトではマイルストしているとするとそれぞれのマイルストタグ るのはめてですしかしてのリビジョンビルドができるcontinuousビルドシステムがあるビルドタグするとノイズむことになりますそのわりにビルドするリビジョンこの だとしています!)タグするかビルドするタグ使めるのがいでしょ

くなったタグしたいhg tag --removeコマンド使します

1  $ hg tag --remove v1.0
2  $ hg tags
3  tip                                3:b353803674a7

タグけをすることもできますのでhg tagコマンドによりタグなるリビジョ するようになりますタグしたいことを Mercurial えるために-f オプション使しなければなりませ

1  $ hg tag -r 1 v1.1
2  $ hg tags
3  tip                                4:8c84a68a62fa
4  v1.1                               1:8997f6fa7740
5  $ hg tag -r 2 v1.1
6  abort: tag ’v1.1’ already exists (use -f to force)
7  $ hg tag -f -r 2 v1.1
8  $ hg tags
9  tip                                5:d242de1da2c9
10  v1.1                               2:6acb1fe9afed

タグタグしていたリビジョンするりますがMercurial がそれを使することはあ りませんこのようにったリビジョンへのタグにはもありませんのでタグけをったならしいリビ ジョンタグせばよいのです

Mercurial リポジトリリビジョンされたファイルタグしていますらかのタグ すると.hgtags ファイルにそのタグつけることができるでしょうhg tagコマンドすると Mercurial はこのファイルコミットしますこのことはhg tagコマンドした にはするチェンジセットhg logコマンドることができるということをしていま

1  $ hg tip
2  changeset:   5:d242de1da2c9
3  tag:         tip
4  user:        Bryan O’Sullivan <bos@serpentine.com>
5  date:        Mon Jul 20 21:58:57 2009 +0000
6  summary:     Added tag v1.1 for changeset 6acb1fe9afed
7  

8.1.1 Handling tag conflicts during a merge

.hgtags ファイルにするどありませんがにはにそのされることがありますこのファイルしたからされていますチェンジセットハッシュまりタグきま

における .hgtags ファイルするには.hgtags ファイルにひねりがですリポジトリタグ するMercurial して.hgtags ファイルキングコピすることはありませんそのわりにMercurial コミットされたファイルリビジョン調べます

このようなとしてした.hgtags ファイルそのコミットしたしいであることを することができません.hgtags ファイルするにはコミットhg tagsコマンド れずにってください.hgtags ファイルがあったhg tagsコマンド場所しますのでその してコミットすればいのですしさをするためにhg tagsコマンドしてくださ

8.1.2 Tags and cloning

hg cloneコマンドチェンジセットしてするための-r オプションっていることにいている かもしれませんしいしたリビジョンよりもじたっていませんこのことがタグ互作した 、、しているとかされるになります

タグ生成.hgtags ファイルへのつのリビジョンとしてわれることをせばタグされたチェンジ セットタグとなるチェンジセットするのはのことですタグ foo リポジトリするため hg clone -r fooしたされたリポジトリする使されたタグするっていませ しいリポジトリにはプロジェクトサブセットまれますがいたタグまれていませ

8.1.3 When permanent tags are too much

Mercurial タグされておりプロジェクトしているためかがしたタグっている もがることができますしかしリビジョンけることはリビジョン 4237e45506ee v2.0.2 であるというこ とをめておく有用がありますバグするアンがこのリビジョン症状かけたといった としてタグしたいもあるでしょう

このようなカルタグです-l オプションきでhg tagコマンドすることでカルタグ することができますこのコマンドタグ.hg/localtags ファイルされます.hgtags .hg/localtags されません-l によってしたタグ現在作をしているリポジトリまりけま 2

8.2 The flow of changes—big picture vs. little

ここでべたしたわれているプロジェクトについてえてましょ

しい リリリリするたなマイナバグ現在にあるようなリリする せぬ “hot fix” のための push があるでしょう

におけるしたするための方法ブランチばれるものですしかしMercurial ブランチとしてっていることをてきましたにはにはしているようで そのたまたまであるだけのつのっているのです

8.3 Managing big-picture branches in repositories

Mercurial において ブランチする方法リポジトリすることですえばにある リポジトリ これを myproject します “1.0” というマイルストしている1.0 のために使したリビジョンタグすることで1.0 するるべきリリいま

1  $ cd myproject
2  $ hg tag v1.0

タグけしたmyproject-1.0.1というしいリポジトリします

1  $ cd ..
2  $ hg clone myproject myproject-1.0.1
3  updating working directory
4  2 files updated, 0 files merged, 0 files removed, 0 files unresolved

その1.0.1 マイナリリめるべきバグになったならmyproject-1.0.1 リポジトリ ってそのします

1  $ hg clone myproject-1.0.1 my-1.0.1-bugfix
2  updating working directory
3  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
4  $ cd my-1.0.1-bugfix
5  $ echo ’I fixed a bug using only echo!’ >> myfile
6  $ hg commit -m ’Important fix for 1.0.1’
7  $ hg push
8  pushing to /tmp/branch-repolpQVYV/myproject-1.0.1
9  searching for changes
10  adding changesets
11  adding manifests
12  adding file changes
13  added 1 changesets with 1 changes to 1 files

そのメジャリリけたマイナリリするとはされたmyproject リポジト においてけられます

1   $ cd ..
2  $ hg clone myproject my-feature
3  updating working directory
4  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
5  $ cd my-feature
6  $ echo ’This sure is an exciting new feature!’ > mynewfile
7  $ hg commit -A -m ’New feature’
8  adding mynewfile
9  $ hg push
10  pushing to /tmp/branch-repolpQVYV/myproject
11  searching for changes
12  adding changesets
13  adding manifests
14  adding file changes
15  added 1 changesets with 1 changes to 1 files

8.4 Don’t repeat yourself: merging across branches

ブランチバグったとするとくのプロジェクトメインブランチそしてそれブランチにおいて バグするがありますバグしたいとですからすことなくバグ するために Mercurial するつかの方法てみましょう

方法ブランチからしたカルリポジトリブランチからpull することで

1  $ cd ..
2  $ hg clone myproject myproject-merge
3  updating working directory
4  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
5  $ cd myproject-merge
6  $ hg pull ../myproject-1.0.1
7  pulling from ../myproject-1.0.1
8  searching for changes
9  adding changesets
10  adding manifests
11  adding file changes
12  added 1 changesets with 1 changes to 1 files (+1 heads)
13  (run ’hg heads’ to see heads, ’hg merge’ to merge)

そのつのブランチのそれぞれのヘッドそのメインブランチします

1  $ hg merge
2  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
3  (branch merge, don’t forget to commit)
4  $ hg commit -m ’Merge bugfix from 1.0.1 branch’
5  $ hg push
6  pushing to /tmp/branch-repolpQVYV/myproject
7  searching for changes
8  adding changesets
9  adding manifests
10  adding file changes
11  added 2 changesets with 1 changes to 1 files

8.5 Naming branches within one repository

くのリポジトリによってブランチするのがですですからですしそれ ることがありませんしているブランチコンピュリポジトリディレクトリができていますの ブランチリポジトリファイルして、(Mercurial しない使することもできま

あなたがそしてパワよりもレベルにあるのであればブランチ (that you can consider XXXX) 方法がありますではブランチブランチ利用レベルでのについて ましたリポジトリブランチえばpull していないっている Mercurial ブランチうこともできます

Mercurial ブランチブランチけるところにありますのように default というブランチしますのでブランチへの命名であってもせば default ブランチつけることが できます

えばhg commitコマンドするとエディタされてコミットメッセできま 3 HG: branch defaultてくださいこれはdefault というブランチしてコミットしているという ことをしています

ブランチをつけるにはまずはhg branches使しますこのコマンドリポジトリするブラ ンチブランチにおけるtipリビジョンがどれかをします

1  $ hg tip
2  changeset:   0:893159f5cd87
3  tag:         tip
4  user:        Bryan O’Sullivan <bos@serpentine.com>
5  date:        Mon Jul 20 21:58:30 2009 +0000
6  summary:     Initial commit
7  
8  $ hg branches
9  default                        0:893159f5cd87

ではブランチ生成するですからする default だけがされます

どれが 現在ブランチかをるにはしでhg branchコマンドしますこのコマンド現在チェンジセッ チェンジセットどのブランチにあるものかをします

1  $ hg branch
2  default

しいブランチするにはhg branchコマンドしますが生成するブランチとしてしま

1  $ hg branch foo
2  marked working directory as branch foo
3  $ hg branch
4  foo

ブランチ生成hg branchコマンドによりどのようなじたのかしむかもしれませんhg statushg tipはどうなっているでしょうか

1  $ hg status
2  $ hg tip
3  changeset:   0:893159f5cd87
4  tag:         tip
5  user:        Bryan O’Sullivan <bos@serpentine.com>
6  date:        Mon Jul 20 21:58:30 2009 +0000
7  summary:     Initial commit
8  

えられていませんしもありませんこのことがしているようにhg branchコマンド ちませんこのコマンドチェンジセットコミットというブランチ使するかを Mercurial えるだけです

コミットするとMercurial コミットされたチェンジセットブランチしますdefault ブランチから ブランチえてコミットしたならhg loghg tipやそれにするコマンドたなブランチ されていることでしょう

1  $ echo ’hello again’ >> myfile
2  $ hg commit -m ’Second commit’
3  $ hg tip
4  changeset:   1:9a664847a614
5  branch:      foo
6  tag:         tip
7  user:        Bryan O’Sullivan <bos@serpentine.com>
8  date:        Mon Jul 20 21:58:31 2009 +0000
9  summary:     Second commit
10  

hg logするコマンドdefault ブランチするてのチェンジセットしてブランチしますそのた ブランチ使わないブランチするることはありません

ブランチそのブランチコミットしたならばそのなるそのコミット ブランチぎますhg branchコマンドによりブランチすることができま

1  $ hg branch
2  foo
3  $ hg branch bar
4  marked working directory as branch bar
5  $ echo new file > newfile
6  $ hg commit -A -m ’Third commit’
7  adding newfile
8  $ hg tip
9  changeset:   2:5417f05f786a
10  branch:      bar
11  tag:         tip
12  user:        Bryan O’Sullivan <bos@serpentine.com>
13  date:        Mon Jul 20 21:58:31 2009 +0000
14  summary:     Third commit
15  

ブランチはかなり寿つためにはこのようなブランチはそれほどすることはいでしょう のことはではなくあくまでです)。

8.6 Dealing with multiple named branches in a repository

リポジトリブランチがあるhg updatehg pull -uといったコマンドMercurial ディレクトリするブランチえていてリポジトリ全体tip リビジョンではなくそのブランチtip リビジョン ディレクトリしますブランチリビジョンしたいhg updateコマンド-C オプション しなければなりません

このいはですからてみましょうめにどのブランチしているのかとどんなブランチリポ ジトリるのかをします

1  $ hg parents
2  changeset:   2:5417f05f786a
3  branch:      bar
4  tag:         tip
5  user:        Bryan O’Sullivan <bos@serpentine.com>
6  date:        Mon Jul 20 21:58:31 2009 +0000
7  summary:     Third commit
8  
9  $ hg branches
10  bar                            2:5417f05f786a
11  foo                            1:9a664847a614 (inactive)
12  default                        0:893159f5cd87 (inactive)

現在 bar ブランチにいますがhg fooブランチします

foo ブランチおよび bar ブランチtip リビジョンへのすることしかとしないためhg updateコマンド-C オプションすることしにそれぞれの tip リビジョンへのうことができま

1  $ hg update foo
2  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
3  $ hg parents
4  changeset:   1:9a664847a614
5  branch:      foo
6  user:        Bryan O’Sullivan <bos@serpentine.com>
7  date:        Mon Jul 20 21:58:31 2009 +0000
8  summary:     Second commit
9  
10  $ hg update bar
11  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
12  $ hg parents
13  changeset:   2:5417f05f786a
14  branch:      bar
15  tag:         tip
16  user:        Bryan O’Sullivan <bos@serpentine.com>
17  date:        Mon Jul 20 21:58:31 2009 +0000
18  summary:     Third commit
19  

foo ブランチるためにhg updateコマンドするとfoo ブランチまったままでbar ブランチtip リビジョン にはしません

1  $ hg update foo
2  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
3  $ hg update
4  0 files updated, 0 files merged, 0 files removed, 0 files unresolved

foo ブランチでのコミットによりたなヘッド生成されます

1  $ echo something > somefile
2  $ hg commit -A -m ’New file’
3  adding somefile
4  created new head
5  $ hg heads
6  changeset:   3:1c0fb9d007f6
7  branch:      foo
8  tag:         tip
9  parent:      1:9a664847a614
10  user:        Bryan O’Sullivan <bos@serpentine.com>
11  date:        Mon Jul 20 21:58:32 2009 +0000
12  summary:     New file
13  
14  changeset:   2:5417f05f786a
15  branch:      bar
16  user:        Bryan O’Sullivan <bos@serpentine.com>
17  date:        Mon Jul 20 21:58:31 2009 +0000
18  summary:     Third commit
19  

foo ブランチから bar ブランチへのしないとできませんからMercurial hg updateコマンド -Cオプションとします

1  $ hg update bar
2  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
3  $ hg update -C bar
4  0 files updated, 0 files merged, 0 files removed, 0 files unresolved

8.7 Branch names and merging

づきのとはいますがMercurial におけるではありませんリビジョン17 のものと 23 のもの ヘッドリポジトリっているものとしましょうリビジョン 17 へとhg updateしてからリビジョン 23 hg mergeした Mercurial リビジョン 17 リビジョン 23 としてしますリビジョン 23 へとhg updateしてからリビジョン 17 hg mergeしたリビジョン 23 リビジョン 17 としてされ ます

このいがったMercurial ブランチ選択しますにそのコミットすると Mercurial ブランチしようとしますブランチfoo bar ブランチリビジョンした ブランチfoo のままとなります

リポジトリブランチヘッドすることはそれほどしいことではありませんえばとあなたが foo ブランチしているとしますがそれぞれなるコミットがあなたのpull しましたこのリポ ジトリにはfoo ブランチつのヘッドしますfoo ブランチつのヘッドつになりま

しかしbar ブランチしていてfoo ブランチしたbar ブランチまりま

1   $ hg branch
2  bar
3  $ hg merge
4  abort: branch ’bar’ has one head - please merge with an explicit rev
5  $ hg commit -m ’Merge’
6  nothing changed
7  $ hg tip
8  changeset:   3:1c0fb9d007f6
9  branch:      foo
10  tag:         tip
11  parent:      1:9a664847a614
12  user:        Bryan O’Sullivan <bos@serpentine.com>
13  date:        Mon Jul 20 21:58:32 2009 +0000
14  summary:     New file
15  

よりとしてbleeding-edge ブランチしていてstable ブランチからみたいとったとし ますこのstable ブランチpull してしたMercurial ブランチ(bleeding-edge) 選択 します

8.8 Branch naming is generally useful

寿ブランチリポジトリしているだけがブランチ利用できるだとはえないでくださ リポジトリつにブランチつのであってもブランチ有用です

としてはブランチすることでチェンジセットがどのブランチ由来するかのることがで きますこの寿ブランチプロジェクト辿くのをもたらすことでしょ

リポジトリしてしているpretxnchangegroup フックをそれぞれのリポジトリしてすることでブランチまれるのをぐことができますこのですがとでもうべき ランチって したブランチへとむことをぐにはですこのようなフックリポジトリ hgrcファイル以下のようにします

1  [hooks]
2  pretxnchangegroup.branch = hg heads --template ’branches ’ | grep mybranch