はじめに
いつものように解説編です。Mercurial連携はGit連携やSubversion連携と異なり、そんなに機能豊富ではないので1回でおしまいです。
Mercurial連携時のユーザインターフェイスの特徴
今まで紹介したGitやSubversionの時と同じようにMercurial連携時もユーザインタフェースが変化します。
ある程度はバージョン管理システムに関わりなく共通で、特定のバージョン管理システムによって部分的に異なるというのは、そういう事情を知っていれば便利なのですが知らないと混乱の元ですよね。でも、きっとこれはAndroid Studioの利点なのだと思いましょう。
Version Controlツールウィンドウ
Git連携と同じく Mercurial連携時も「Version Controlツールウィンドウ / Consoleタブ」にAndroid Studioが内部で実行したhg
コマンドのログが出力されます。
図1 「 Version Controlツールウィンドウ / Consoleタブ」
Changesツールウィンドウ
「Local」タブはどのバージョン管理システムと連携しても違いはありません。以前からMercurial連携を使っていた人は気付いたと思いますが、コミットログを表示するタブは v0.3.5 から「Logタブ」になりました(以前は「Repositoryタブ」 ) 。
「Logタブ」に表示する内容や機能もGit連携時のそれ と類似しています。
図2 「 Changesツールウィンドウ / Logタブ」
コミットログにはロググラフとブランチの位置を示すラベルが表示されます。Git連携のものと似ていますが、リモートリポジトリのブランチやタグは表示されませんので注意してください。ラベルの色の意味は 図3 のとおりです。
図3 コミットログのラベルの意味
「HEAD」と表示しているラベルはブランチヘッドの事ではなく、どうやらtip を指しているようです。
ステータスバー
Git連携と同じく現在のブランチを表示するエリアが追加されます。当然、クリック可能です。ブランチ名の脇にカッコ書きで表示している数字は直前のコミット番号です。
図4 ステータスバーの状態(その1)
「Changesツールウィンドウ / Logタブ」でリビジョンの現在位置を知ることができないため、ステータスバーに表示しているコミット番号だけが唯一の頼りになります。
また、デフォルトではOFFになっていますが、「 Preferences / Version Control / Mercurial」の「Check for incoming and outgoing changesets」をONにするとステータスバーに「Incoming」と「Outgoing」の通知アイコンが表示されます。これらの見方や使い方については、後ほど説明します。
リポジトリを最新の状態に保つ
リモートリポジトリが設定されている前提で説明します。いわゆるhg pull
ですが、メニューバーの「VCS → Mercurial → Pull...」から実行します。
図5 「 Pull」ダイアログ
図5 が「Pull」ダイアログです。defaultのリモートリポジトリがプリセットしてあるので、そのまま「Pull」ボタンを押すとhg pull
を実行します。
Gitしか知らない人には「?」な事を言いますが、このコマンドはホントウにhg pull
しかしません。リモートから取り込んだ変更を今のプロジェクトに反映するには、別途メニューバーから「VCS → Mercurial → Update To...」を選びhg update
を実行します。
つまり、hg pull
はGitでいうgit fetch
相当なので、git pull
に相当する操作をするにはhg pull & hg update
を実行する必要があります。ただでさえMercurial連携時の「Changesツールウィンドウ / Logタブ」がどこを指しているのかわかりづらいため、正直 hg pull
のみの"Pull... "操作はオススメしません。
説明が回りくどくなりましたが、メニューバーの「VCS → Update Project...」を使うと、図6 のようなダイアログが表示されます。
図6 「 Update Project」ダイアログ
「Update Project」ダイアログのチェックボックスの指定に応じて実際の操作は変化しますが、デフォルトですべてONになっているため、表1 の操作を一括して行います。
表1 「 Update Project」ダイアログのオプション
コマンド 意味
pull リモートの変更を取得(hg pull
)
update ローカルに変更を反映(hg update
)
merge ローカルの変更とマージ
commit after merge without conflicts マージでコンフリクトがなければ、そのままコミット
筆者はMercurialの文化的背景に明るくないので断定はできませんが、中途半端に見える "Pull... " より、"Update Project... " のオプション全部のせのほうが便利に思えます。
リポジトリの変更通知について
Git連携と異なり「Changesツールウィンドウ / Logタブ」にはリモートリポジトリの様子がわからず、自身が最新の状態なのかどうかを把握しづらいです。それを知ってか知らずかMercurial連携では固有の通知機能があります。
デフォルトではこの通知機能はOFFになっているので、まず通知機能を有効(「 Preferences / Version Control / Mercurial」の「Check for incoming and outgoing changesets」をON)にします。
図7 「 Preferences / Version Control / Mercurial」設定画面
するとステータスバーに図8 のようなアイコンが表示されます。
図8 Mercurialの通知アイコン
左から順に「Incoming」と「Outgoing」の通知アイコンになります。それぞれが hg incoming
、hg outgoing
の結果を通知します。hg incoming
、hg outgoing
の実行間隔は「Preferences / Version Control / Background」の「Refresh changes every」で設定します。
図9 「 Preferences / Version Control / Background」設定画面
※第29回 で紹介したSubversionのIncoming監視と同じ設定項目です。
実際に通知を検知すると、図10 や図11 のようになります。Incomingはリモートリポジトリ側に変更があったとき、Outgoingはローカルに未プッシュの変更があったときに通知されます。
図10 Imcomingのポップアップ通知の例
図11 Outgoingのポップアップ通知の例
※このスクリーンショット、同じ変更を変更した側(Outgoing)と変更を受け入れる側(Incoming)で見てるので、パッと見、違いがわかりづらいです。
この通知ですが、変更を検知したら即座にポップアップで通知するでもなく、ステータスバーのアイコンが変化するでもありません。戯れにアイコンにマウスカーソルを乗せたときだけ表示されるという、非常に控えめなものです。ちなみにクリックしても何も起こりません。
SubversionのIncomig通知 では、編集中のファイルが更新されたことを検知するとエディタに「そのファイルをどうする?」と問い合わせてきましたが、Mercurial連携ではウンともスンともでした。
この通知機能、やる気があるのか/やる気はあったけど実装する手間を惜しんだのかよくわかりませんが「あるにはあるけど、便利とは言えない」というAndroid Studioにしては珍しい類の機能です。
それでも、Outgoingは自分で把握できるとして、Incomingについてはプル前に把握できると精神衛生上よろしいので、控えめな機能がらも覚えておくと良いと思います。
コミット&プッシュ
コミットですが、GitやSubversionと異なり「Commit Changes」ダイアログには Mercurial固有の設定は登場しません 。ということは、Android Studioからhg commit --amend
はできないのです。
図12 「 Commit Changes」ダイアログ
プッシュはGitと同じく「Commit Changes」ダイアログでコミット直後に即行うか、メニューバーの「VCS → Mercurial → Push...」で別途行うかを選べます。プッシュ実行時のダイアログは図13 のとおりです。
図13 「 Push」ダイアログ
「Push」ダイアログのそれぞれのチェックボックスは表2 のとおり、hg push
コマンドのオプションに対応しています。
表2 「 Push」ダイアログのオプション
ダイアログのオプション 対応するhg push
コマンドのオプション
Revision -r, --rev
Branch -b, --branch
push as new remote branch --new-branch
Force push -f, --force
ファイルの移動やリネーム
Gitの時 もSubversionの時 も確認していたファイルの移動やリネームです。「 Projectツールウィンドウ」から2つのファイル(bar.txt
とfoo.txt
)をそれぞれ以下のように操作してみました。
bar.txt
を別のディレクトリに移動
foo.txt
をhoge.txt
にリネーム("Rename..."リファクタリングを実行)
Mercurial連携時も「Version Controlツールウィンドウ / Consoleタブ」にhg
コマンドが記録されるので、その時の内容を抜き出したのがリスト1 です。
リスト1 ファイルと移動とリネームの実行ログ
hg.exe rename --after bar.txt MyFirstApp\bar.txt
hg.exe rename --after foo.txt hoge.txt
ログを見るとどちらもhg rename
で移動とリネームを実行していました。コミット後の「Changesツールウィンドウ / Logタブ」でコミットログを確認すると、それぞれ「移動した(moved) 」と「リネームした(renamed) 」と記録されていました。
図14 ファイルの移動とリネーム結果
ブランチ&マージ
Mercurialでのブランチ&マージについてです。Android Studioからの操作はGitの時とほとんど同じですが、Gitとくらべてだいぶ機能が劣ります。
ブランチの作成
メニューバーの「VCS → Mercurial → Branches...」にメニューがありますが、ステータスバーのブランチ名をクリックしたときと結果は同じく「Hg Branches」ポップアップが表示されます。
図15 「 Hg Branches」ポップアップ
ここで「New Branch」を選択すると「今のブランチ」から枝分かれしたブランチを作成します。
図16 「 Create New Branch」ダイアログ
Git連携時とは異なり、ブランチのサブメニューに「そのブランチから枝分かれしたブランチを作成する」機能がないことがわかります。
現在のブランチからではなく「特定のリビジョン」からブランチを作成したい場合ですが、Git連携の時は「Changesツールウィンドウ / Logタブ」のコミットログから操作できたのですが、Mercurail連携ではそれができません。あくまで「今の場所から 」しかブランチを作成できないようです。
「今の場所 」の切り替え方は次の節で説明しますが、正直この手の細かなブランチ操作はAndroid Studioで行わない方が賢明だと思います(要するに面倒なだけ) 。
[補足]ブックマークについて
「Hg Branches」ポップアップからわかるとおり、一応ブックマークの登録もサポートしています。ブックマークの登録はブランチと同じく「New Bookmark」を選択して、任意のブックマーク名を登録します。
図17 「 Create Bookmark」ダイアログ
※「Inactive」はhg bookmarks
コマンドの--inactive
オプションに相当します。
Android Studioではブランチもブックマークも機能的に差がありません。以降のブランチの説明はそのままブックマークに読み替えても問題ありません。
図18 「 Hg Branches」ポップアップのブックマークのサブメニュー
ブランチの切り替え
先ほどの「Hg Branches」ポップアップから任意のブランチを選択し、そのサブメニューから「Update To」を実行します。
図19 「 Hg Branches」ポップアップからブランチを切り替える
もしくは、メニューバーの「VCS → Mercurial → Update To...」から切り替える方法もあります。
図20 「 Switch working directory」ダイアログ
この「Switch working directory」ダイアログからは、ブランチ(Branch)やタグ(Tag)にブックマーク(Bookmark) 、リビジョン(Revision)とさまざまな方法でスイッチすることができます。
Mercurial連携では「Changesツールウィンドウ / Logタブ」のコンテキストメニューは非常にシンプルで、Git連携時のように任意のリビジョンに切り替える事ができません。仮に「特定のリビジョンに切り替えたい」場合はどうするかというと、多少面倒になりますが「Changesツールウィンドウ / Logタブ」でコミットハッシュ値をコピーしてから"Update To... "を実行。「 Switch working directory」ダイアログで「Revision」を選択して、そこにコピーしたハッシュ値を貼り付けます。
図21 きわめて機能が少ない「Changesツールウィンドウ / Logタブ」のコンテキストメニュー
マージ
ブランチときたらマージです。マージはメニューバーの「VCS → Mercurial → Merge...」から行う方法と「Hg Branches」ポップアップから行う方法の2通りあります。
まずは"Merge... "の場合です。コマンドを実行すると図22 のようなダイアログが表示されます。
図22 「 Merge」ダイアログ
ここでマージしたいブランチやブックマークをを指定して実行します。
もう一方の「Hg Branches」ポップアップの場合、「 マージしたいブランチ」を選び、サブメニューから「Merge」を実行します。
図23 「 Hg Branches」ポップアップからマージを実行する
マージの方向は、Git連携の時と同じで、現在のブランチ(ステータスバーに表示しているブランチ名)に対して、指定したブランチの内容をマージします。つまり常に次の関係になります。
「指定したブランチ」を 「 現在のブランチ」 に マージする
メニューバーの"Merge... "コマンド、ステータスバーの「Hg Branches」ポップアップ、どちらの方法でマージを実行してもコミットまでは行いません 。コミットは利用者の意志で行います。マージ→コミットまでセットだったGit連携と操作感が異なりますので、両方使う人は覚えておいてください。
なお、今の状態がマージ処理中なのかどうかはステータスバーをみると辛うじてわかります。
図24 ステータスバーに表示される「マージ中」の状態
通常ならブランチ名の右隣に現在のリビジョン番号が1つ表示しているのですが、マージ処理中は図24 のように現在のリビジョン番号に加えてマージしてきたリビジョン番号の2つが表示されます。この表示はコミットするまでそのままです。恐ろしい(?)事に"Revert "しても元には戻りませんでした。
Git連携の時「せっかくのGitなのでばんばんマージしましょう!でもいきなりは怖いからブランチ間の差分を確認してからマージしましょう」と「Git Branches」ポップアップの「Compare 」を紹介しましたが「Hg Branches」ポップアップのサブメニューには「Compare」はありません。
つまり、Mercurial連携ではブランチ間の差分を確認することはできません。だいぶ、イマイチです。
コンフリクトした場合
マージ処理中にコンフリクトが発生すると「Files Merged with Conflicts」ダイアログにその旨が表示されます。このあたりの動作はバージョン管理システムに関わりなく共通しています。
図25 「 Files Merged with Conflicts」ダイアログ
※このダイアログの操作については第26回 を参照してください。
マージ処理中に何からの理由でコンフリクトが未解決のままダイアログを閉じた場合、メニューバーから「VCS → Mercurial → Run Conflict Resovler」を実行すると、再度「Files Merged with Conflicts」ダイアログが開きます。
もしくは「Projectツールウィンドウ」や「Changesツールウィンドウ / Localタブ」でコンフリクトを起こしたファイルを選び、"Mark as Resovled "を実行すると(実態はさておき)ステータス上「コンフリクトを解決した」ことになります。
図26 コンフリクト中のファイルの表示例
その他のMercurial操作
というほど残りの機能はありません。せいぜいタグを打つくらいです。Mercurialのタグ打ち(hg tag
)は、メニューバーの「VCS → Mercurial → Tag Repository...」から行います。
図27 「 Tag」ダイアログ
なんというか、切なくなるほどあっさりです…。「 Tag」ダイアログからも想像できるように設定できるのはグローバルタグだけで、ローカルタグは設定できません。
まとめ
今まで紹介したGitやSubversionと比べると、Mercurial連携は「とりあえずサポートしといた」感が満載です。それでもファイルを操作したり、リファクタリングをしたり、Android Studioでプログラム開発をする分には用が足りているので、必要最低限 のサポートはできているとは言えるでしょう。
ただし、Mercurialのリポジトリ操作を主体に行うのは力不足です。すでに気付いているかも知れませんが、ブランチやタグを作ることはできても削除する ことはできません。あんまりですね。
逆にここまで機能がシンプルだと、悪あがきせず素直にhg
コマンドかSourceTreeなどの専用ツールを利用する気になるのが良い点とも言えます。