Android Studio最速入門~効率的にコーディングするための使い方

第32回バージョン管理─Mercurial連携の使い

はじめに

いつものように解説編です。Mercurial連携はGit連携やSubversion連携と異なり、そんなに機能豊富ではないので1回でおしまいです。

Mercurial連携時のユーザインターフェイスの特徴

今まで紹介したGitやSubversionの時と同じようにMercurial連携時もユーザインタフェースが変化します。

ある程度はバージョン管理システムに関わりなく共通で、特定のバージョン管理システムによって部分的に異なるというのは、そういう事情を知っていれば便利なのですが知らないと混乱の元ですよね。でも、きっとこれはAndroid Studioの利点なのだと思いましょう。

Version Controlツールウィンドウ

Git連携と同じくMercurial連携時も「Version Controlツールウィンドウ / Consoleタブ」にAndroid Studioが内部で実行したhgコマンドのログが出力されます。

図1 ⁠Version Controlツールウィンドウ / Consoleタブ」
図1

Changesツールウィンドウ

「Local」タブはどのバージョン管理システムと連携しても違いはありません。以前からMercurial連携を使っていた人は気付いたと思いますが、コミットログを表示するタブは v0.3.5 から「Logタブ」になりました(以前は「Repositoryタブ⁠⁠。

「Logタブ」に表示する内容や機能もGit連携時のそれと類似しています。

図2 ⁠Changesツールウィンドウ / Logタブ」
図2

コミットログにはロググラフとブランチの位置を示すラベルが表示されます。Git連携のものと似ていますが、リモートリポジトリのブランチやタグは表示されませんので注意してください。ラベルの色の意味は 図3 のとおりです。

図3 コミットログのラベルの意味
図3

「HEAD」と表示しているラベルはブランチヘッドの事ではなく、どうやらtipを指しているようです。

ステータスバー

Git連携と同じく現在のブランチを表示するエリアが追加されます。当然、クリック可能です。ブランチ名の脇にカッコ書きで表示している数字は直前のコミット番号です。

図4 ステータスバーの状態(その1)
図4

「Changesツールウィンドウ / Logタブ」でリビジョンの現在位置を知ることができないため、ステータスバーに表示しているコミット番号だけが唯一の頼りになります。

また、デフォルトではOFFになっていますが、⁠Preferences / Version Control / Mercurial」「Check for incoming and outgoing changesets」をONにするとステータスバーに「Incoming」「Outgoing」の通知アイコンが表示されます。これらの見方や使い方については、後ほど説明します。

リポジトリを最新の状態に保つ

リモートリポジトリが設定されている前提で説明します。いわゆるhg pullですが、メニューバーの「VCS → Mercurial → Pull...」から実行します。

図5 ⁠Pull」ダイアログ
図5

図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」ダイアログ
図6

「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」設定画面
図7

するとステータスバーに図8のようなアイコンが表示されます。

図8 Mercurialの通知アイコン
図8

左から順に「Incoming」「Outgoing」の通知アイコンになります。それぞれが hg incominghg outgoing の結果を通知します。hg incominghg outgoingの実行間隔は「Preferences / Version Control / Background」「Refresh changes every」で設定します。

図9 ⁠Preferences / Version Control / Background」設定画面
図9
第29回で紹介したSubversionのIncoming監視と同じ設定項目です。

実際に通知を検知すると、図10図11のようになります。Incomingはリモートリポジトリ側に変更があったとき、Outgoingはローカルに未プッシュの変更があったときに通知されます。

図10 Imcomingのポップアップ通知の例
図10
図11 Outgoingのポップアップ通知の例
図11
※このスクリーンショット、同じ変更を変更した側(Outgoing)と変更を受け入れる側(Incoming)で見てるので、パッと見、違いがわかりづらいです。

この通知ですが、変更を検知したら即座にポップアップで通知するでもなく、ステータスバーのアイコンが変化するでもありません。戯れにアイコンにマウスカーソルを乗せたときだけ表示されるという、非常に控えめなものです。ちなみにクリックしても何も起こりません。

SubversionのIncomig通知では、編集中のファイルが更新されたことを検知するとエディタに「そのファイルをどうする?」と問い合わせてきましたが、Mercurial連携ではウンともスンともでした。

この通知機能、やる気があるのか/やる気はあったけど実装する手間を惜しんだのかよくわかりませんが「あるにはあるけど、便利とは言えない」というAndroid Studioにしては珍しい類の機能です。

それでも、Outgoingは自分で把握できるとして、Incomingについてはプル前に把握できると精神衛生上よろしいので、控えめな機能がらも覚えておくと良いと思います。

コミット&プッシュ

コミットですが、GitやSubversionと異なり「Commit Changes」ダイアログには Mercurial固有の設定は登場しません。ということは、Android Studioからhg commit --amendはできないのです。

図12 ⁠Commit Changes」ダイアログ
図12

プッシュはGitと同じく「Commit Changes」ダイアログでコミット直後に即行うか、メニューバーの「VCS → Mercurial → Push...」で別途行うかを選べます。プッシュ実行時のダイアログは図13のとおりです。

図13 ⁠Push」ダイアログ
図13

「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.txtfoo.txtをそれぞれ以下のように操作してみました。

  • bar.txtを別のディレクトリに移動
  • foo.txthoge.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 ファイルの移動とリネーム結果
図14

ブランチ&マージ

Mercurialでのブランチ&マージについてです。Android Studioからの操作はGitの時とほとんど同じですが、Gitとくらべてだいぶ機能が劣ります。

ブランチの作成

メニューバーの「VCS → Mercurial → Branches...」にメニューがありますが、ステータスバーのブランチ名をクリックしたときと結果は同じく「Hg Branches」ポップアップが表示されます。

図15 ⁠Hg Branches」ポップアップ
図15

ここで「New Branch」を選択すると「今のブランチ」から枝分かれしたブランチを作成します。

図16 ⁠Create New Branch」ダイアログ
図16

Git連携時とは異なり、ブランチのサブメニューに「そのブランチから枝分かれしたブランチを作成する」機能がないことがわかります。

現在のブランチからではなく「特定のリビジョン」からブランチを作成したい場合ですが、Git連携の時は「Changesツールウィンドウ / Logタブ」のコミットログから操作できたのですが、Mercurail連携ではそれができません。あくまで今の場所からしかブランチを作成できないようです。

今の場所の切り替え方は次の節で説明しますが、正直この手の細かなブランチ操作はAndroid Studioで行わない方が賢明だと思います(要するに面倒なだけ⁠⁠。

[補足]ブックマークについて

「Hg Branches」ポップアップからわかるとおり、一応ブックマークの登録もサポートしています。ブックマークの登録はブランチと同じく「New Bookmark」を選択して、任意のブックマーク名を登録します。

図17 ⁠Create Bookmark」ダイアログ
図17
※「Inactive」hg bookmarksコマンドの--inactiveオプションに相当します。

Android Studioではブランチもブックマークも機能的に差がありません。以降のブランチの説明はそのままブックマークに読み替えても問題ありません。

図18 ⁠Hg Branches」ポップアップのブックマークのサブメニュー
図18

ブランチの切り替え

先ほどの「Hg Branches」ポップアップから任意のブランチを選択し、そのサブメニューから「Update To」を実行します。

図19 ⁠Hg Branches」ポップアップからブランチを切り替える
図19

もしくは、メニューバーの「VCS → Mercurial → Update To...」から切り替える方法もあります。

図20 ⁠Switch working directory」ダイアログ
図20

この「Switch working directory」ダイアログからは、ブランチ(Branch)やタグ(Tag)にブックマーク(Bookmark⁠⁠、リビジョン(Revision)とさまざまな方法でスイッチすることができます。

Mercurial連携では「Changesツールウィンドウ / Logタブ」のコンテキストメニューは非常にシンプルで、Git連携時のように任意のリビジョンに切り替える事ができません。仮に「特定のリビジョンに切り替えたい」場合はどうするかというと、多少面倒になりますが「Changesツールウィンドウ / Logタブ」でコミットハッシュ値をコピーしてから"Update To..."を実行。⁠Switch working directory」ダイアログで「Revision」を選択して、そこにコピーしたハッシュ値を貼り付けます。

図21 きわめて機能が少ない「Changesツールウィンドウ / Logタブ」のコンテキストメニュー
図21

マージ

ブランチときたらマージです。マージはメニューバーの「VCS → Mercurial → Merge...」から行う方法と「Hg Branches」ポップアップから行う方法の2通りあります。

まずは"Merge..."の場合です。コマンドを実行すると図22のようなダイアログが表示されます。

図22 ⁠Merge」ダイアログ
図22

ここでマージしたいブランチやブックマークをを指定して実行します。

もう一方の「Hg Branches」ポップアップの場合、⁠マージしたいブランチ」を選び、サブメニューから「Merge」を実行します。

図23 ⁠Hg Branches」ポップアップからマージを実行する
図23

マージの方向は、Git連携の時と同じで、現在のブランチ(ステータスバーに表示しているブランチ名)に対して、指定したブランチの内容をマージします。つまり常に次の関係になります。

「指定したブランチ」 ⁠現在のブランチ⁠ マージする

メニューバーの"Merge..."コマンド、ステータスバーの「Hg Branches」ポップアップ、どちらの方法でマージを実行してもコミットまでは行いません。コミットは利用者の意志で行います。マージ→コミットまでセットだったGit連携と操作感が異なりますので、両方使う人は覚えておいてください。

なお、今の状態がマージ処理中なのかどうかはステータスバーをみると辛うじてわかります。

図24 ステータスバーに表示される「マージ中」の状態
図24

通常ならブランチ名の右隣に現在のリビジョン番号が1つ表示しているのですが、マージ処理中は図24のように現在のリビジョン番号に加えてマージしてきたリビジョン番号の2つが表示されます。この表示はコミットするまでそのままです。恐ろしい(?)事に"Revert"しても元には戻りませんでした。

Git連携の時「せっかくのGitなのでばんばんマージしましょう!でもいきなりは怖いからブランチ間の差分を確認してからマージしましょう」「Git Branches」ポップアップのCompareを紹介しましたが「Hg Branches」ポップアップのサブメニューには「Compare」はありません。

つまり、Mercurial連携ではブランチ間の差分を確認することはできません。だいぶ、イマイチです。

コンフリクトした場合

マージ処理中にコンフリクトが発生すると「Files Merged with Conflicts」ダイアログにその旨が表示されます。このあたりの動作はバージョン管理システムに関わりなく共通しています。

図25 ⁠Files Merged with Conflicts」ダイアログ
図25
※このダイアログの操作については第26回を参照してください。

マージ処理中に何からの理由でコンフリクトが未解決のままダイアログを閉じた場合、メニューバーから「VCS → Mercurial → Run Conflict Resovler」を実行すると、再度「Files Merged with Conflicts」ダイアログが開きます。

もしくは「Projectツールウィンドウ」「Changesツールウィンドウ / Localタブ」でコンフリクトを起こしたファイルを選び、"Mark as Resovled"を実行すると(実態はさておき)ステータス上「コンフリクトを解決した」ことになります。

図26 コンフリクト中のファイルの表示例
図26

その他のMercurial操作

というほど残りの機能はありません。せいぜいタグを打つくらいです。Mercurialのタグ打ちhg tagは、メニューバーの「VCS → Mercurial → Tag Repository...」から行います。

図27 ⁠Tag」ダイアログ
図27

なんというか、切なくなるほどあっさりです…。⁠Tag」ダイアログからも想像できるように設定できるのはグローバルタグだけで、ローカルタグは設定できません。

まとめ

今まで紹介したGitやSubversionと比べると、Mercurial連携は「とりあえずサポートしといた」感が満載です。それでもファイルを操作したり、リファクタリングをしたり、Android Studioでプログラム開発をする分には用が足りているので、必要最低限のサポートはできているとは言えるでしょう。

ただし、Mercurialのリポジトリ操作を主体に行うのは力不足です。すでに気付いているかも知れませんが、ブランチやタグを作ることはできても削除することはできません。あんまりですね。

逆にここまで機能がシンプルだと、悪あがきせず素直にhgコマンドかSourceTreeなどの専用ツールを利用する気になるのが良い点とも言えます。

おすすめ記事

記事・ニュース一覧