彷徨えるフジワラ

年がら年中さまよってます

"Android Studio最速入門" 第32回に関する指摘

連載 "Android Studio最速入門〜効率的にコーディングするための使い方" における "第32回 バージョン管理─Mercurial連携の使い方" での Mercurial 連携に関する説明で、気になる点があったので、まとめておこうと思います(筆者の方には報告済み)。

ある程度 Mercurial を使い込んでいる人であれば、多分言うまでもない話かもしれませんが、Git と併用しているような人や、Mercurial 初学者の誤解を防ぐことができれば幸いです。

あちらの記事の読者が、こちらのエントリに辿りつけるのかは、微妙なところではありますが、まぁ、そこはネット(+検索)の力を信じることにしましょう(笑)。

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

1ページ目の「リポジトリを最新の状態に保つ」での:

つまり,hg pullはGitでいうgit fetch相当なので,git pullに相当する操作をするにはhg pull & hg updateを実行する必要があります。

筆者はMercurialの文化的背景に明るくないので断定はできませんが,中途半端に見える "Pull..." より,"Update Project..." のオプション全部のせのほうが便利に思えます。

という記述に関しては、以下の点を補足しておきます。

コマンドラインの方針は「機能単純化」ではありますが、TortoiseHg も pull 時には色々なオプションが指定可能になっていますので、この辺は「各自の運用方法に応じて、適宜選択してください」といったところですね。

リポジトリの変更通知について

本エントリを書く際に改めて読み直していて、「リポジトリの変更通知について」にも気になる点があることに 気づきました。

2ページ目の「リポジトリの変更通知について」には、以下のように記述されています。

SubversionのIncomig通知では,編集中のファイルが更新されたことを検知するとエディタに「そのファイルをどうする?」と問い合わせてきましたが,Mercurial連携ではウンともスンともでした。
この通知機能,やる気があるのか/やる気はあったけど実装する手間を惜しんだのかよくわかりませんが「あるにはあるけど,便利とは言えない」というAndroid Studioにしては珍しい類の機能です。

Subversion では、ワーキングディレクトリ中の未コミット成果ベースのマージしかできないため、現時点での変更内容を失わない(=作業成果の安全性)ためには、即座にワーキングディレクトリでの対応が必要となります。

その一方で、Mercurial でのマージは、基本的には「コミット済み成果ベースのマージ」が推奨されています。「コミット済み成果ベースのマージ」の場合、作業成果は既に履歴に記録済みですから、他の変更によって損なわれる心配はありません。

また、機能上は Mercurial も「未コミット成果ベースのマージ」が可能ですが、その場合でも、作業成果の安全性は確保されています。詳細に関しては、拙著「入門 TortoiseHg + Mercurial」の「7.3 CVS/Subversion的なマージ操作」を参照してください。

入門TortoiseHg+Mercurial

入門TortoiseHg+Mercurial

そのため、「作業成果の安全性」という点からは、「編集中のファイルが更新」された場合であっても、リモートリポジトリとの連携において、その旨を通知をする必要性は低いわけですね。

また、先述したように、Mercurial では「リモートリポジトリからの履歴取り込み(pull)」と「作業領域の更新(update)あるいはマージ(merge)」は、独立した操作とみなされます。

このことも、「編集中のファイルが更新」に対して、通知機能が特に何もしていない要因だと思われます。

なお、Mercurial では「未コミット成果ベースのマージ」は基本的に推奨されていません。どうしても「履歴を直線的に保ちたい」というニーズに対しては、rebase エクステンションを使用する方が良いでしょう。

ブランチ&マージ

3ページ目での:

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

という記述に関しては、Git と Mercurial での「ブランチ」に対するモデルの違いから来る誤解だと思われます。

また、4ページ目の「まとめ」では:

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

とありますが、実際には:

Mercurial 的なブランチ」の観点で見れば、ブランチ周りの操作性等に関しても、もうちょっと評価が違うかもしれませんね。IntelliJ IDEA + Mercurial(hg4idea) を常用している方に、補足して頂けるとありがたいです(笑)。

マージ

4ページ目の「マージ」には:

なお,今の状態がマージ処理中なのかどうかはステータスバーをみると辛うじてわかります。
通常ならブランチ名の右隣に現在のリビジョン番号が1つ表示しているのですが,マージ処理中は図24のように現在のリビジョン番号に加えてマージしてきたリビジョン番号の2つが表示されます。この表示はコミットするまでそのままです。恐ろしい(?)事に"Revert"しても元には戻りませんでした。

とありますが:

ということではないかと思われます。