うさぎ組

ソフトウェア開発、チームによる製品開発、アジャイル、ソフトウェアテスト

Mercurialでブランチ名を変更する方法

キッカケ

@さんに「defaultブランチで作業したリビジョン群に後からブランチ名を指定したい場合にどうすればいいのか」
と聞かれたので、その場では思いつかなかったんだけど、冷静に考えると簡単にできたので書いておきます。

hgのrebaseは「元のブランチ名を保持する」もしくは「移動先リビジョンのブランチ名を使う」のどちらかしかありません。
今回は「新しいブランチ名を使いたい」というケースです。

方針

で、今回の解決方法は新しいブランチをつくってから、そこにrebaseして、ブランチをつくるためだけのコミットのみを後から削除する。
という方針です。
もっとクールな方法があると思うのですが、あったら教えてください。


補足としてここで使用している拡張のrebaseとhisteditは次のように設定します。
次のように~/.hgrc に追記します。(WindowsだったらMecurial.iniかも。

[extensions]
rebase =
histedit =/Users/kyon/mercurial_extensions/histedit/hg_histedit.py

histeditはdurin42 / histedit / source / — Bitbucketからダウンロードしてきたhg_histedit.pyの絶対パスを指定します。


手順

状況としては次の感じ

@ 5:default

task/2のブランチを作成し忘れたまま作業

o 4:default

task/2のブランチを作成し忘れて作業開始
o 3:task/1
task/1での作業を継続
o 2:task/1
/ task/1での作業を開始

o 1:default

ここまではdefaultブランチでの作業

o 0:default
defaultブランチで作業開始

ここで
hg update 1 として、

o 5:default

task/2のブランチを作成し忘れたまま作業

o 4:default

task/2のブランチを作成し忘れて作業開始
o 3:task/1
task/1での作業を継続
o 2:task/1
/ task/1での作業を開始

@ 1:default

ここまではdefaultブランチでの作業

o 0:default
defaultブランチで作業開始

ここでtask/2のブランチを作成する
hg branch task/2

そして、このブランチを開始するためのコミットをする(有名ブランチを作成する場合は、管理対象に変更がなくてもコミットできる)
hg ci -m "task/2ブランチを作成するためだけのコミット"

@ 6:task/2

task/2ブランチを作成するためだけのコミット
o 5:default
task/2のブランチを作成し忘れたまま作業
o 4:default
/ task/2のブランチを作成し忘れて作業開始
o 3:task/1
task/1での作業を継続
o 2:task/1
/ task/1での作業を開始

o 1:default

ここまではdefaultブランチでの作業

o 0:default
defaultブランチで作業開始

これで、revision4,5をtask/2ブランチとして移動する
hg rebase -d 6 -s 4

@ 6:task/2

task/2のブランチを作成し忘れたまま作業

o 5:task/2

task/2のブランチを作成し忘れて作業開始

o 4:task/2

task/2ブランチを作成するためだけのコミット
o 3:task/1
task/1での作業を継続
o 2:task/1
/ task/1での作業を開始

o 1:default

ここまではdefaultブランチでの作業

o 0:default
defaultブランチで作業開始


@さんもここまではできていて、問題は存在していなかったrev4(task/2ブランチを作成するためだけのコミット)が存在していることである。

ここでhisteditを使用して、revision4を削除する。


hg histedit 4


こうすると、テキストエディタが開いて、revision4,5,6の順番を変えたり、コミットをやりなおしたり、削除出来たりする。
詳細は実際にhisteditを叩いてほしい。
起動したテキストエディタのコメントにどのようなことができるか説明があります。


ここで、revision4のみを削除対象にして、テキストエディタで保存をして閉じると、revision4のみが削除された状態になります。

@ 5:task/2

task/2のブランチを作成し忘れたまま作業

o 4:task/2

task/2のブランチを作成し忘れて作業開始
o 3:task/1
task/1での作業を継続
o 2:task/1
/ task/1での作業を開始

o 1:default

ここまではdefaultブランチでの作業

o 0:default
defaultブランチで作業開始


これで解消ですね。



まとめ

「defaultブランチでの作業はさせないようにcommitを禁止させる」とかもできるんだろうけど、
今回のケースはたまたまdefaultブランチだっただけで、「task/1ブランチで作業してしまったけど、実はdefaultから派生させたtask/2で開始すべきだった」とかもあって、その場合にも同じ手順で解消できます。



自分で作業しているときにブランチの移動は結構自動化してしまっていることがあるので、今回のような事象に出会わなかったのですが、なるほどー。って感じでした。


histeditとrebaseとcollapseがあればだいたいできる。