Mercurial ~ ブランチ

前置き

ブランチとマージ。SCMツールを使う上で最も苦痛を伴うのがマージでしょう。マージ専用ツールによるビジュアルな差異表示やワンタッチでの編集操作など、便利になってきているとは言え、どうしても機械任せにできない部分が残ります。残念ながら、Mercurialでもそれは同じです。

本文

準備

まずは、ひと通り(個人で)で使ったサンプルプロジェクトのタグVERSION1.0をクローン化して、そこから作業を開始しましょう。

~/sandbox/proj1 $ cd ..
~/sandbox $ hg clone -r VERSION1.0 proj1 proj1.branch
全チェンジセットを取得中
チェンジセットを追加中
マニフェストを追加中
ファイルの変更を追加中
10 のチェンジセット(10 の変更を 4 ファイルに適用)を追加
ブランチ default へ更新中
ファイル状態: 更新数 2、マージ数 0、削除数 0、衝突未解決数 0
~/sandbox $ cd proj1.branch/
~/sandbox/proj1.branch $ hg ll
9[tip]   50f3095c9a73   2011-04-19 18:46 +0900   maru
  remove barrr

8   b63d3a430609   2011-04-19 18:44 +0900   maru
  edit barrr(d)

7   e15b7674791e   2011-04-19 18:44 +0900   maru
  rename bar to barrr

暗黙のブランチ(implicit or unnamed branches)

ティップ以外のリビジョンを親としてコミットするとブランチが生成されます。

~/sandbox/proj1.branch $ hg update -r 3
ファイル状態: 更新数 0、マージ数 0、削除数 1、衝突未解決数 0
~/sandbox/proj1.branch $ cat foo
a
b
c
d
~/sandbox/proj1.branch $ echo E >>foo
~/sandbox/proj1.branch $ hg com -m "edit foo(E)"   # R3に対してコミット。
新規ヘッドが増えました
~/sandbox/proj1.branch $ hg heads       # ヘッドが2つ(R3から伸びたR10と、それまでティップだったR9)。
チェンジセット:   10:a05399d6610f
タグ:             tip
親:               3:c6a9db7df968
ユーザ:           maru
日付:             Tue Apr 19 23:26:02 2011 +0900
要約:             edit foo(E)

チェンジセット:   9:50f3095c9a73
ユーザ:           maru
日付:             Tue Apr 19 18:46:29 2011 +0900
要約:             remove barrr

~/sandbox/proj1.branch $ hg parents     # 親はR10。
チェンジセット:   10:a05399d6610f
タグ:             tip
親:               3:c6a9db7df968
ユーザ:           maru
日付:             Tue Apr 19 23:26:02 2011 +0900
要約:             edit foo(E)

2つのヘッドをそれぞれ更新していきます。

~/sandbox/proj1.branch $ echo F >>foo
~/sandbox/proj1.branch $ hg com -m "edit foo(F)"
~/sandbox/proj1.branch $ hg heads
チェンジセット:   11:83ee799bc16c
タグ:             tip
ユーザ:           maru
日付:             Tue Apr 19 23:36:28 2011 +0900
要約:             edit foo(F)

チェンジセット:   9:50f3095c9a73
ユーザ:           maru
日付:             Tue Apr 19 18:46:29 2011 +0900
要約:             remove barrr

~/sandbox/proj1.branch $ hg update -r 9
ファイル状態: 更新数 2、マージ数 0、削除数 0、衝突未解決数 0
~/sandbox/proj1.branch $ cat foo
a
b
c
d
~/sandbox/proj1.branch $ echo e >>foo
~/sandbox/proj1.branch $ hg com -m "edit foo(e)"
~/sandbox/proj1.branch $ echo f >>foo
~/sandbox/proj1.branch $ hg com -m "edit foo(f)"
~/sandbox/proj1.branch $ hg heads
チェンジセット:   13:a623bfc3b5c0
タグ:             tip
ユーザ:           maru
日付:             Tue Apr 19 23:37:29 2011 +0900
要約:             edit foo(f)

チェンジセット:   11:83ee799bc16c
ユーザ:           maru
日付:             Tue Apr 19 23:36:28 2011 +0900
要約:             edit foo(F)

~/sandbox/proj1.branch $ hg parents
チェンジセット:   13:a623bfc3b5c0
タグ:             tip
ユーザ:           maru
日付:             Tue Apr 19 23:37:29 2011 +0900
要約:             edit foo(f)

元からあった方のブランチはR13まで進み、新しいブランチはR11まで進みました。作業ディレクトリの現在の親はR13です。ここで、新しいブランチの開発成果(R11)を元のブランチへマージしましょう。マージの際は、その方向を意識することが重要です。

~/sandbox/proj1.branch $ hg update -r 13 -C    # 念のため作業ディレクトリの親をR13へ。
ファイル状態: 更新数 1、マージ数 0、削除数 0、衝突未解決数 0
~/sandbox/proj1.branch $ hg merge -r 11        # 作業ディレクトリへR11をマージ(viが起動する)。
foo をマージ中
4 個のファイルが編集を控えています
ファイル状態: 更新数 0、マージ数 1、削除数 0、衝突未解決数 0
(マージ結果の commit を忘れずに)
~/sandbox/proj1.branch $ cat foo
a
b
c
d
e
f
E
F
~/sandbox/proj1.branch $ hg parents            # この時点で親はR13とR11の2つ。
チェンジセット:   13:a623bfc3b5c0
タグ:             tip
ユーザ:           maru
日付:             Tue Apr 19 23:37:29 2011 +0900
要約:             edit foo(f)

チェンジセット:   11:83ee799bc16c
ユーザ:           maru
日付:             Tue Apr 19 23:36:28 2011 +0900
要約:             edit foo(F)

~/sandbox/proj1.branch $ hg com -m "merge foo(F) to foo(f)"   # コミット。
~/sandbox/proj1.branch $ hg ll
14[tip]:13,11   bda4ac5d47e2   2011-04-20 00:07 +0900   maru
  merge foo(F) to foo(f)

13   a623bfc3b5c0   2011-04-19 23:37 +0900   maru
  edit foo(f)

12:9   fdd3cce42503   2011-04-19 23:37 +0900   maru
  edit foo(e)

~/sandbox/proj1.branch $ hg heads              # ヘッドが1つに合流した。
チェンジセット:   14:bda4ac5d47e2
タグ:             tip
親:               13:a623bfc3b5c0
親:               11:83ee799bc16c
ユーザ:           maru
日付:             Tue Apr 19 23:59:12 2011 +0900
要約:             merge foo(F) to foo(f)

明示的ブランチ(名前付きブランチ)

暗黙のブランチではコミットの副作用としてブランチを生成していた感がありますが、明示的にブランチを生成することもできます。明示的ブランチには名前が必要です。

~/sandbox/proj1.branch $ hg branches       # 名前付きブランチの一覧。
default                       14:bda4ac5d47e2
~/sandbox/proj1.branch $ hg ll
14[tip]:13,11   bda4ac5d47e2   2011-04-20 00:07 +0900   maru
  merge foo(F) to foo(f)

13   a623bfc3b5c0   2011-04-19 23:37 +0900   maru
  edit foo(f)

12:9   fdd3cce42503   2011-04-19 23:37 +0900   maru
  edit foo(e)

~/sandbox/proj1.branch $ hg branch         # 現在のブランチ設定。
default
~/sandbox/proj1.branch $ hg branch SMALL   # ブランチ設定を変更(次回コミット以降に有効)。
作業領域をブランチ SMALL に設定
~/sandbox/proj1.branch $ hg branches       # まだブランチは増えてない。
default                       14:bda4ac5d47e2
~/sandbox/proj1.branch $ echo g >>foo
~/sandbox/proj1.branch $ echo h >>foo
~/sandbox/proj1.branch $ hg com -m "edit foo(gh)"
~/sandbox/proj1.branch $ hg branches       # ブランチが増えた。
SMALL                         15:410df2f791e5
default                       14:bda4ac5d47e2 (非アクティブ)
~/sandbox/proj1.branch $ hg branch
SMALL

~/sandbox/proj1.branch $ hg log -b SMALL   # SMALLブランチのログだけ表示。
チェンジセット:   15:410df2f791e5
ブランチ:         SMALL
ユーザ:           maru
日付:             Wed Apr 20 00:11:02 2011 +0900
要約:             edit foo(gh)

いまSMALLブランチは、defaultブランチの先端から伸びている状態です。ブランチの分岐点よりも先にdefaultブランチは伸びていません。ブランチ一覧に「非アクティブ」と表示されるのはそのためです。そこで、defaultブランチを伸ばしてみましょう。

~/sandbox/proj1.branch $ hg update default # defaultブランチのヘッドを親とする。
ファイル状態: 更新数 1、マージ数 0、削除数 0、衝突未解決数 0
~/sandbox/proj1.branch $ hg parents
チェンジセット:   14:bda4ac5d47e2
親:               13:a623bfc3b5c0
親:               11:83ee799bc16c
ユーザ:           maru
日付:             Wed Apr 20 00:07:27 2011 +0900
要約:             merge foo(F) to foo(f)

~/sandbox/proj1.branch $ echo G >>foo
~/sandbox/proj1.branch $ echo H >>foo
~/sandbox/proj1.branch $ hg com -m "edit foo(GH)"
新規ヘッドが増えました
~/sandbox/proj1.branch $ hg heads          # ヘッドが増えた。
チェンジセット:   16:a58a48aa29ab
タグ:             tip
親:               14:bda4ac5d47e2
ユーザ:           maru
日付:             Wed Apr 20 00:20:27 2011 +0900
要約:             edit foo(GH)

チェンジセット:   15:410df2f791e5
ブランチ:         SMALL
ユーザ:           maru
日付:             Wed Apr 20 00:11:02 2011 +0900
要約:             edit foo(gh)

~/sandbox/proj1.branch $ hg branches       # defaultブランチもアクティブになった。
default                       16:a58a48aa29ab
SMALL                         15:410df2f791e5

SMALLブランチへdefaultブランチをマージしてみましょう。

~/sandbox/proj1.branch $ hg update SMALL
ファイル状態: 更新数 1、マージ数 0、削除数 0、衝突未解決数 0
~/sandbox/proj1.branch $ hg branch
SMALL
~/sandbox/proj1.branch $ hg merge default
foo をマージ中
4 個のファイルが編集を控えています
ファイル状態: 更新数 0、マージ数 1、削除数 0、衝突未解決数 0
(マージ結果の commit を忘れずに)
~/sandbox/proj1.branch $ cat foo
a
b
c
d
e
f
E
F
g
h
G
H
~/sandbox/proj1.branch $ hg parents
チェンジセット:   15:410df2f791e5
ブランチ:         SMALL
ユーザ:           maru
日付:             Wed Apr 20 00:11:02 2011 +0900
要約:             edit foo(gh)

チェンジセット:   16:a58a48aa29ab
タグ:             tip
親:               14:bda4ac5d47e2
ユーザ:           maru
日付:             Wed Apr 20 00:20:27 2011 +0900
要約:             edit foo(GH)

~/sandbox/proj1.branch $ hg com -m "merge foo(GH) to foo(gh)"
~/sandbox/proj1.branch $ hg ll
17[tip]:15,16   8782cf35d8c0   2011-04-20 00:29 +0900   maru
  merge foo(GH) to foo(gh)

16:14   a58a48aa29ab   2011-04-20 00:20 +0900   maru
  edit foo(GH)

15   410df2f791e5   2011-04-20 00:11 +0900   maru
  edit foo(gh)

~/sandbox/proj1.branch $ hg parents
チェンジセット:   17:8782cf35d8c0
ブランチ:         SMALL
タグ:             tip
親:               15:410df2f791e5
親:               16:a58a48aa29ab
ユーザ:           maru
日付:             Wed Apr 20 00:29:53 2011 +0900
要約:             merge foo(GH) to foo(gh)

~/sandbox/proj1.branch $ hg branches
SMALL                         17:8782cf35d8c0
default                       16:a58a48aa29ab (非アクティブ)
~/sandbox/proj1.branch $ hg branch
SMALL

ブランチを廃止して成長を止めたい場合は、--close-branchオプション付きでコミットします。

~/sandbox/proj1.branch $ hg update SMALL         # クローズしたいブランチを親とする。
ファイル状態: 更新数 1、マージ数 0、削除数 0、衝突未解決数 0
~/sandbox/proj1.branch $ hg com --close-branch -m "close SMALL"    # クローズ。
~/sandbox/proj1.branch $ hg parents              # クローズしても親は変わらない。
チェンジセット:   18:521106ea6144
ブランチ:         SMALL
タグ:             tip
ユーザ:           maru
日付:             Wed Apr 20 00:54:46 2011 +0900
要約:             close SMALL

~/sandbox/proj1.branch $ hg update default       # 親をdefaultへ戻す。
ファイル状態: 更新数 1、マージ数 0、削除数 0、衝突未解決数 0
~/sandbox/proj1.branch $ hg ll
18[tip]   521106ea6144   2011-04-20 00:54 +0900   maru
  close SMALL

17:15,16   8782cf35d8c0   2011-04-20 00:29 +0900   maru
  merge foo(HG) to foo(hg)

16:14   a58a48aa29ab   2011-04-20 00:20 +0900   maru
  edit foo(HG)

~/sandbox/proj1.branch $ hg branches             # ブランチ一覧にSMALLは表示されない。
default                       16:a58a48aa29ab (非アクティブ)
Last modified:2011/04/19 18:28:59
Keyword(s):
References:[Mercurial(分散SCM)] [Mercurial ~ ひと通り(チームで)] [Mercurial ~ ひと通り(個人で)]
This page is frozen.