読者です 読者をやめる 読者になる 読者になる

Mercurial の default ブランチは消せるのか?

Mercurial neta

最初からあるアレ

default ブランチ。
Mercurial 使ってると、特に作った記憶がないのにいつの間にか出来ている名前付きブランチ。
この default ブランチを消せるのか?という話。

能書きはいいから結論はよ!

消せるし、そもそも作らないようにすることも出来る *1

default ブランチのないリポジトリを作る

$ hg init repo
$ cd repo
$ hg branch
default

$ hg branch branch-1
$ hg commit -m "branch-1"

$ hg branches
branch-1

最後の hg branches の結果から default ブランチがないことが分かる。

途中までは default ブランチがあった?

branch を2回使っているが、最初の hg branch ではたしかに 「default」と表示されている。この時点では default ブランチはあったのではないか?

結論から言うとこの時点でも default ブランチはない。
では、なぜ hg branch で「default」と表示されるのかというと、branch コマンドに理由がある。
というのも、hg branch コマンドは現在の作業領域情報からブランチ名を取得するのだが、取得した結果が真と評価出来ない場合には「default」を戻すようになっているからだ *2
作業領域に名前付きブランチが設定されていないため、「とりあえず default と表示している」という感じだ *3

試してみる

さきほどのリポジトリで以下のコマンドを実行してみる。

$ rm .hg/branch
$ hg branch
default

default ブランチが復活 (?) した。
これは、hg branch が .hg/branch からブランチ名を得ているためだ *4

もう一つ試してみる。

$ echo master > .hg/branch
$ hg branch
master

hg branch の表示が「master」に変わった。
なんとなく hg branch の動きが見えたのではないかと思う。

結論

default ブランチは消せる。
消すというよりも (別の) 名前付きブランチを設定する、と言った方が正しいかもしれない。

…などと書いてきましたが .hg は Mercurial の管理情報が格納されているので基本的に触らないに越したことはないです *5

しかし、何か試したくなったら自分のマシン上で hg init して、そこで好きなように出来る。
途中で失敗したら hg rollback, hg update で過去の作業成果に戻れる。
要らなくなったらリポジトリのディレクトリごと削除。

このお手軽さは Mercurial やその他の DVCS の大きなアドバンテージだと思う。
このお手軽さこそが、学習コストの低減に影響しているのではないだろうか? *6

参考

Mercurial のブランチはポインタではなくてリビジョンの属性にすぎない、等などとても勉強になる。
また、こういったことの理解が進むと Mercurial の挙動が自然と理解でき、さらに使いこなせるようになる。

Branch - Mercurial
コードウォーキングのための準備運動 ※ 入門 Mercurial 著者の藤原さんのページ
Mercurial SCM

*1:どちらも特にメリットはないし、全くオススメできないが

*2:このあたりは commands.py, dirstate.py あたりに書いてある。たぶんそっちを読んだ方が分かりやすい

*3:文字通り default

*4:branch に名前が似た branches というコマンドがあるが、こちらはリビジョンの情報からブランチ名を取得するので、状況によっては両者の表示が異なることもある。リポジトリ初期化直後などは分かりやすい

*5:MQ もあるし触る必要があまり思いつかない

*6:Mercurial 初心者が言っても説得力がないかもしれないが…