MacHGでのrebase onto Mercurial Advent Calendar 2011
partake.inの12日目は文殊堂がお送りします。
深夜35時などという遅くに申し訳ありません。
今日はSourceTree無料キャンペーンによって存在意義が危うくなった感のあるMacHGも得意な箇所は凄いんだよ、ということで
MacHGでrebase ontoをやるお話です。
Mercurialのrebase
rebaseというとGitのコマンドという印象が強いですが、
Mercurialでもビルトインのextensionを有効化するだけで使用できます。
話の都合上ついでにいくつか有効化しておきましょう。
[extensions] rebase = mq = graphlog =
rebase onto
さて、今日お話しするのはgit rebase --onto相当のことです。
まず以下のglogを見てください。
このmami branchから分岐しているmado branchをhomu branchから分岐するように改変します。
$ hg glog @ changeset: 3:09876c6c806e | branch: homu | tag: tip | parent: 0:663f5d36f850 | user: monjudoh <monjudoh@gmail.com> | date: Tue Dec 13 09:51:41 2011 +0900 | summary: branch homu | | o changeset: 2:917591f587ee | | branch: mado | | user: monjudoh <monjudoh@gmail.com> | | date: Tue Dec 13 09:44:03 2011 +0900 | | summary: branch mado | | | o changeset: 1:eaa1adaa875b |/ branch: mami | user: monjudoh <monjudoh@gmail.com> | date: Tue Dec 13 09:42:29 2011 +0900 | summary: branch mami | o changeset: 0:663f5d36f850 user: monjudoh <monjudoh@gmail.com> date: Tue Dec 13 09:41:46 2011 +0900 summary: first commit
とりあえず--sourceと--destを指定してみるとただのmergeになってしまいます。
$ hg rebase --source mado --dest homu saved backup bundle to /Users/monjudoh/Dropbox/example/.hg/strip-backup/917591f587ee-backup.hg $ hg glog @ changeset: 3:4f7d2a838aa9 |\ branch: homu | | tag: tip | | parent: 2:09876c6c806e | | parent: 1:eaa1adaa875b | | user: monjudoh <monjudoh@gmail.com> | | date: Tue Dec 13 09:44:03 2011 +0900 | | summary: branch mado | | | o changeset: 2:09876c6c806e | | branch: homu | | parent: 0:663f5d36f850 | | user: monjudoh <monjudoh@gmail.com> | | date: Tue Dec 13 09:51:41 2011 +0900 | | summary: branch homu | | o | changeset: 1:eaa1adaa875b |/ branch: mami | user: monjudoh <monjudoh@gmail.com> | date: Tue Dec 13 09:42:29 2011 +0900 | summary: branch mami | o changeset: 0:663f5d36f850 user: monjudoh <monjudoh@gmail.com> date: Tue Dec 13 09:41:46 2011 +0900 summary: first commit
Gitのrebaseのようにやるには--detachを付けます。
しかし、mado branchが消えてしまいました。あんまりだよ、こんなのってないよ。
$ hg rebase -s mado -d homu --detach saved backup bundle to /Users/monjudoh/Dropbox/example/.hg/strip-backup/917591f587ee-backup.hg $ hg glog @ changeset: 3:15acace3840a | branch: homu | tag: tip | user: monjudoh <monjudoh@gmail.com> | date: Tue Dec 13 09:44:03 2011 +0900 | summary: branch mado | o changeset: 2:09876c6c806e | branch: homu | parent: 0:663f5d36f850 | user: monjudoh <monjudoh@gmail.com> | date: Tue Dec 13 09:51:41 2011 +0900 | summary: branch homu | | o changeset: 1:eaa1adaa875b |/ branch: mami | user: monjudoh <monjudoh@gmail.com> | date: Tue Dec 13 09:42:29 2011 +0900 | summary: branch mami | o changeset: 0:663f5d36f850 user: monjudoh <monjudoh@gmail.com> date: Tue Dec 13 09:41:46 2011 +0900 summary: first commit
branchを保持してrebaseしたいのであれば--keepbranchesを付けましょう。そろそろoptionの長さにイライラしてきていると思いますが、ひとまずちゃんとrebase ontoに成功しました。
$ hg rebase -s mado -d homu --detach --keepbranches saved backup bundle to /Users/monjudoh/Dropbox/example/.hg/strip-backup/917591f587ee-backup.hg $ hg glog @ changeset: 3:1548007f5eaa | branch: mado | tag: tip | user: monjudoh <monjudoh@gmail.com> | date: Tue Dec 13 09:44:03 2011 +0900 | summary: branch mado | o changeset: 2:09876c6c806e | branch: homu | parent: 0:663f5d36f850 | user: monjudoh <monjudoh@gmail.com> | date: Tue Dec 13 09:51:41 2011 +0900 | summary: branch homu | | o changeset: 1:eaa1adaa875b |/ branch: mami | user: monjudoh <monjudoh@gmail.com> | date: Tue Dec 13 09:42:29 2011 +0900 | summary: branch mami | o changeset: 0:663f5d36f850 user: monjudoh <monjudoh@gmail.com> date: Tue Dec 13 09:41:46 2011 +0900 summary: first commit
ただ、id:monjudoh:20110801:1312179612 で書きましたがMercurialで歴史改変を行う場合は、
元のchangesetsを保持するoptionを付けて行い、正常に出来たことを確認した上で古い方の歴史をstripで削除する
のをお勧めします。
今回の場合だと、-keep optionを付けて実行し、確認後に古いほうをstripすることになります。
$ hg rebase -s mado -d homu --detach --keepbranches --keep
正直かったるいですね。
思うにrebase ontoという操作はコマンドラインで行うには複雑すぎる操作なのではないかと思います。
本家のgit rebase --ontoはoptionこそ少ないですが、3引数の順番とか覚えてられません。
MacHGの強力な歴史改変サポート
MacHGではrebase,mq(stripのみ),collapse,histeditといった歴史改変系のextensionを強力にサポートしています。
このような履歴になっている状態で、右クリックからRebase changesets…を選択し、
移動元と移動先をグラフからそれぞれ選択し、必要に応じて--keepbranches --keep相当のチェックボックスを選択しRebaseボタンを押すだけです。
無事元branchを保持したrebase ontoが出来ました。
stripもこのUIならまず誤爆しないでしょう。
まとめ
MacHGの歴史改変操作のUIはとても素敵です。
皆様も活用してみてはどうでしょうか。
後、よくわかってない奴は歴史改変とかすんな。
では13日目の @ponkotuy さんよろしくお願いします。