Mercurialでチェンジセットを別ブランチへ移動する

こんにちはkotaです。今回はタイトルの通りMercurialについての記事です。
私は普段Mercurialを使っているのですが、最近コミットした後のチェンジセットを別のブランチへ移動させたいという事があり、その時に調べた内容を書きます。

Mercurial-1

Mercurialを使っている方は、こんな場面に出会ったことはないでしょうか?

  • ブランチAにコミットしていたが、ブランチBにコミットすべきだった
  • ブランチAからブランチBへマージしたくはないが、特定のチェンジセットの内容だけコピーしたい

このような時には、graftやrebaseというコマンドを使うことで、ブランチをまたいでチェンジセットを移動することができます。

それぞれのコマンドの違いは、graftはチェンジセットをコピーしますが、rebaseは移動前のチェンジセットを削除します。
またgraftは全てのフェーズのチェンジセットに使えますが、rebaseはフェーズがpubulicのものには使えません。
これらを参考にして目的にあったコマンドを使ってください。


TortoiseHGを使った操作

ここからは、TortuiseHGの画面を見ながら操作方法を説明します。

  • graftを使ったチェンジセットのコピー
    (例)ブランチAのチェンジセットをブランチBへコピーする

1. 作業領域を更新してブランチBへ移動します
Mercurial-2

2. コピーしたいチェンジセットを選択して、右クリックのメニューにある
「選択リビジョンをローカルへ移植(graft)」をクリックします
Mercurial-3

3. オプションを確認してから「移植(graft)」をクリックします
Mercurial-4

4. ブランチAのチェンジセットがブランチBへコピーされました
graftではチェンジセットを指定できるので、必要なチェンジセットだけをコピーすることもできます
Mercurial-4

  • rebaseを使ったチェンジセットの移動

(準備) エクステンションの有効化
ファイルメニューの「設定」を開き、そのなかの「ユーザ設定」タブをクリックします
そこの左側のメニューの中から「エクステンション」を選択し、そこからrebaseにチェックを入れて「OK」ボタンをクリックします

1. 作業領域を更新してブランチBへ移動します
Mercurial-2

2. ブランチAを選択して、右クリックのメニューに追加された「履歴を修正」→「移動(rebase)」をクリックします
Mercurial-7

3. オプションを確認してから「リベース」をクリックします
Mercurial-8

4. ブランチAのチェンジセットがブランチBへ移動しました
rebaseは移動前のブランチにチェンジセットが残らないので、コミット先を間違えていた場合などは便利です
Mercurial-9
ただし、pubulicになったチェンジセットには使えないので、こまめにプッシュしていると使いどころがないかも。。。


他にもMercurialには様々なコマンドやエクステンションがあるようで、それらを駆使することでもっと複雑な履歴を改変できるそうですが、今回はそこまでは必要なかったので実際に使うところまでしか調べませんでした。
もっと改変が必要な場面はあまり思い浮かびませんが、その時が来た際には調べた内容をまた紹介しようと思います。