はじめに
今回から数回にかけてAndroid Studioのバージョン管理システム(Version Control System:VCS)連携について説明します。初回はVCS連携の基礎的な部分を紹介します。それほどおもしろい内容ではないので、次回以降の実践編を経た後に読み返してもらえれば十分です。
Android Studioが標準でサポートしているバージョン管理システムは、CVS, Subversion, Git, Mercurialです。次回からは、それぞれのバージョン管理システムを用いた実際の操作を紹介する予定です(さすがにCVSはパスします……)。
VCS連携でできること
どのバージョン管理システムに対しても基本的な操作(最新の状態にする/コミットする/変更を取り消す/履歴をみる/などなど)を行うことができます。
細かな操作については、連携するバージョン管理システムによってできることとできないことがあるので、Android Studio上ですべての操作を完結することにこだわらないほうが良いでしょう。日常的な操作はAndroid Studioで行い、ちょっと凝った操作を行う場合は専用のツールを用いる、という二段構えの気持ちでいた方がストレスが溜まりません。
他のIDEがそうであるように、VCS連携中はAndroid Studio上でのファイル操作がシームレスにバージョン管理システムに連携されます。一番メリットを受けるのはリファクタリングの時だと思います。リネームや移動といった操作を追跡してバージョン管理システムに反映します。
ただし、そのときに連携しているバージョン管理システムのどのコマンドを叩いてファイルの移動を追跡しているかは、連携するバージョン管理システムによって異なります(移動をmoveではなく、deleteとaddの組み合わせだったり、さまざまです)。この振る舞いの違いも人によってはストレスの元になるかと思います。
VCS連携の基礎の基礎
Android StudioのVCS連携機能は、主にメニューバーの「VCS」に集約されています。
メニューの上部にバージョン管理に関する操作が集約してあります。このメニューは実際のバージョン管理システムに関わりなく共通して使える操作になっています(統合コマンド)。そのため、コマンドの用語が実際に用いるバージョン管理システムのものとずれている場合があります(Android Studioの統合コマンドで用いている用語はSubversionに由来するものが多いです)。
統合コマンドの下に連携しているバージョン管理システム固有のサブメニューが展開されます。特定のバージョン管理システムに特化した操作はこちらから行います。
「VCS」メニューには"VCS Operations Popup..."というVCS専用のクイックリストが組み込まれています。ショートカットキーを覚えると、より簡単に素早くVCS操作ができるようになるので、一応覚えておいてください。
「VCS」メニューの最上部にローカルヒストリ("Local History")に関するコマンドがあります。ローカルヒストリは、VCS連携とは直接の関わりが低いので、後の回で改めて紹介します。
サポートしているバージョン管理システム
Android Studioが標準でサポートしているバージョン管理システムは以下の通りです。
- CVS
- 当初はサポート外でしたが、Android Studio v0.2.9あたりから復活しました(元のIntelliJでサポートしていました)。
- Subversion
- (IntelliJでは)以前の主力だったのですが、最近はパッとしません。サポートしていた歴史が最も長いため、連携機能が最も安定しています。一応、Subversion 1.7もサポートしていますが、別途
svn
コマンドを必要とします(1.6までなら svn
コマンドは不要です)。
- Git, Github
- 最近流行りのGitです。Android Studioもそうですが、IntelliJも自分自身をGitで管理しているためかGitサポートが手厚いです。標準構成でGithubもサポートしています。ただ残念ながら、別途
git
コマンドが必要です。
- Mercurial
- Gitと人気を2分している分散型バージョン管理システムです。Gitサポートに比べると、それほど手厚いサポートをしていない印象があります。こちらもGitと同様、別途
hg
コマンドを必要とします。
これ以外のバージョン管理システムと連携する場合は、別途プラグインが必要になります。プラグインの説明がまだですが、その一覧を紹介しておきます(すべて動作確認したわけではありませんので、チャレンジする場合は自己責任でお願いします)。
ベースとしていたIntelliJの歴史を引きずっていますが、Android Studio単独で連携できるのはCVSとSubversionのみで、それ以外のバージョン管理システムは必ず連携用のコマンドを必要とします。
細かな設定については後の回で説明しますが、Android Studioのバージョン管理システムとの設定は「Preferences / Version Control」で行います。
VCS連携中の見た目の変化
VCS連携の設定が完了するツールバーに図4のようなアイコンが追加されます。
また「Projectツールウィンドウ」「ナビゲーションバー」や「エディタタブ」などのファイル表示部分がバージョン管理システムのステータスに連動した色が付くようになります。この見た目の変化により、現在使っているプロジェクトがVCS連携済みかどうかを判断することができます。
この色の意味は 表1 の通りです(各々の色は「Preferences / Colors & Fonts / File Status」で変更できます)。
表1 ファイルの色分けとVCS連携状態の意味(※左側がDefaultテーマ、右側がDarculaテーマの時の色です)
色 | 意味 | 詳細 |
| 更新なし(Up to date) | 変更していないファイルです。 |
| 削除(Deleted) | リポジトリから削除する予定のファイルです。 |
| 更新(Modified) | ローカルで更新しているファイルです。 |
| 追加(Added) | リポジトリに追加する予定のファイルです。 |
| マージ(Merged) | リポジトリからアップデートした結果、マージされたファイルです。 |
| 不明(Unknown) | リポジトリに登録していないファイルです(ローカルにだけ存在する)。 |
| 無視(Ignored) | VCSの無視ファイルに設定しているファイルです。 |
| 外部からの更新(Hijacked) | PERFORCEやCleaCase、VSSのようにロックするVCSを使っている場合に、チェックアウトせずに更新したファイルです(あまりお目に掛かる事はないでしょう)。 |
| コンフリクト(Merged with conflicts) | リポジトリからアップデートした結果、コンフリクトがおきたファイルです。 |
| 外部からの削除(Externally deleted) | VCSの削除コマンドを行わず、ローカルで削除したファイルです。 |
| スイッチ(Switched) | CVSやSubversoinで「今とは異なるブランチ」から取得したファイルです(と説明してありますが、よく意味をわかっていません。そして現物を見たことも無いです)。 |
Eclipseだと「パッケージエクスプローラ」あたりに、そのプロジェクトが「どのリポジトリ」からチェックアウトしたものなのかひと目でわかるようになっていますが、Android Studioの「Projectツールウィンドウ」では残念ながらそうはなりません。チェックアウトしたリポジトリの確認方法は連係するバージョン管理システムによって変わりますので、その辺も後の回で説明したいと思います。
見た目の変化はエディタにも起こります。エディタのガーターエリアに変更箇所に応じて図6のように色分けされて表示されます(目立ちませんが反対側のマーカーバーにも同じ色のマークが付きます)。
VCS連携の主立った操作を行うユーザインタフェース
バージョン管理システムに対して行う操作は、主に以下の操作だと思います。
- リポジトリから最新のファイルを取得する
- ファイルを追加・更新・削除する
- 上記操作を中止する
- 変更履歴を確認する
- リポジトリに変更した結果をコミットする
- etc.
これらの操作は主に「Projectツールウィンドウ」「エディタ」「Chagnesツールウィンドウ」から行います。Eclipseに馴れている人は(……そうでなくても一般的には)直感的に次のように使い分けようと思うはずです。
- Projectツールウィンドウ
- リポジトリとプロジェクトに対する主なVCS連係の操作を行う。
- リポジトリから最新のファイルを取得する
- ファイルを追加・削除する(または、そのキャンセル)
- 変更履歴を確認する
- リポジトリに変更した結果をコミットする
- エディタ
- 編集しているファイルに対するVCS連係操作を行う。
- ファイルを編集する(または、そのキャンセル)
- 変更履歴を確認する
特に「Projectツールウィンドウ」についてですが、これらの操作は「Projectツールウィンドウ」でもやって出来ないことはありませんが、あまり操作性はよろしくありません。そもそも、VCSメニューが数多いコンテキストメニューのサブメニューにひっそりとあるため、目的の操作を実行しづらいです(少なくとも筆者はそう感じています)。
ちょっとした昔話になりますが、Android Studioの元となったIntelliJでは長らく「Projectツールウィンドウ」ではVCS連係に関する操作ができませんでした。その間、VCS連係を担ってきたのが「Changesツールウィンドウ」です。
このような背景があるため、VCS連係については専用のツールウィンドウである「Chagnesツールウィンドウ」を介して行った方がいろいろと捗るようにできています。当然、そんな歴史をしらない新規ユーザからしてみれば「Projectツールウィンドウ」のほうが直感的なので、そちらを使い「思ったほど便利じゃないな」と落胆する罠が仕組まれています。
- Changesツールウィンドウ
- リポジトリとプロジェクトに対する主なVCS連係の操作を行う。
- リポジトリから最新のファイルを取得する
- ファイルを追加・削除する(または、そのキャンセル)
- 変更履歴を確認する
「Projectツールウィンドウ」はVCS連係で積極的に用いるというよりは、普通にファイル操作やリファクタリングに使うだけで十分だと思っています。VCS連携が設定されていれば、ファイルの移動、コピー、削除などの操作はシームレスにVCS連係されます。
実際の操作例
具体的な操作については次回以降に説明しますが、まずは「こんな感じなのか」という程度で眺めてみてください。
Projectツールウィンドウでの操作
VCS連携が設定されると、そのステータスに応じてファイルが色分けして表示されます。コンテキストメニューに連携したバージョン管理システム名に対応したサブメニューが追加されるので、そこからさまざまなVCS連携操作を行えます。
色分けによりバージョン管理システムの管理下のファイルなのか/そうでないのか/変更を行っているのかを把握できますが、一覧性には乏しいです。
新規作成、削除、移動、コピーなどのファイル操作を行うと「その操作をバージョン管理システムにも反映するか?」と問い合わせるようになります。
通常は「Yes(VCS連動する)」で良いですが。何かしらの意図でVCS連動しない場合は「No」を選択してください。その後個別にVCS操作を行えば、VCS連動の状態を復帰することもできます。
エディタでの操作
ガーターエリアの変更箇所をクリックすると変更前の状態を確認することができます。さらに、変更を元に戻すこともできます。
コンテキストメニューにもVCS連携に関するメニューが追加されます。統合コマンドではなく、連携したバージョン管理システム個別のメニューが表示されます。
エディタ上でのみ可能なVCS連携操作として、次の2つが上げられます。
- 選択範囲の履歴を確認する("Show History for Selection")
- 行ごとの変更者を確認する("Annotate")
ファイル単位の履歴の確認は「Projectツールウィンドウ」や「Changesツールウィンドウ」からもできますが「選択範囲の履歴を確認する」はエディタ上でのみ可能です。
「行ごとの変更者を確認する」は、バージョン管理システムによっては「blame」と呼ばれる事がありますが、Android Studioでは「Annotete」で統一されています。
Changesツールウィンドウでの操作
VCS連携で、もっとも多彩な操作ができるのが「Changesツールウィンドウ」です。UIが独特なので意味のわからなさも群を抜いていると思います。
細かい使い道はそのうち説明するので、まずは簡単にざっくり説明しておきます。このツールウィンドウでできることは、おおざっぱに次の2つです。
- ローカルでの変更の確認とそれに基づいた操作
- リポジトリの履歴の確認と履歴に基づいた操作
連携しているバージョン管理システムによって多少違いがありますが「Changesツールウィンドウ」に表示されている2つのタブが、それぞれ「ローカルの状況」と「リポジトリの状況」を表しています。
ローカルの変更確認タブは図13のような情報が表示されます。
「Changelist」はAndroid StudioでVCS連携を行う時の重要な概念なのですが、とりあえずはじめから表示している「Default」だけ気にしていれば良いです。みてのとおり、ここにあるのがコミットの対象です。
ツールバーについて簡単に説明します(図14)。第18回の「Findツールウィンドウ」と同じように、左側のツールバーは操作系で右側のツールバーが表示系になっています。
右側の表示系のうち、次のツールバーは「Changesツールウィンドウ」が見やすくなるので、常にONにしておくことをオススメします(不思議なことに、ツールウィンドウの初期値って、Preferencesなどで設定できないんですよね)。
- Group by Directory
- ONにすると「Changelist」=コミット対象の表示をディレクトリ別に表示します。初期値(OFF)だと、コミット対象がフラット表示されます(正直、とても見づらいです)。
- Show Ignored Files
- ONにするとAndroid StudioがVCS連携で無視するファイルが表示されます。
- 無視ファイルの指定については、あとで説明しますが、とりえあえず各バージョン管理システムの無視ファイル設定(
.gitignore
や.hgignore
など)が反映されているワケではない事だけ覚えておいてください(Android Studioは独自に無視ファイル設定を持ちます)。
- Preview Diff
- ONにするとツールウィンドウの右側に選択したファイルの変更点をプレビューするエリアが現れます。
- プレビューエリアにはさらにオプション(「Settings」アイコン)があり、差分の表示方法を上下(Top|Buttom)か左右(Left|Right)かに選択できます。ただでさえプレビューエリアは狭いので差分表示は上下にするのがオススメです。
「Group by Directory」「Show Ignored Files」「Preview Diff」をONにした例を図15に示します。このあたりも個人の好みによるところが大きいので、各自で使いやすいと思う表示方法を模索してみてください。
左側のツールバーの機能については、おいおい説明していきます。
この「Changesツールウィンドウ」の「Local」タブでも連携しているバージョン管理システムに対するファイルの操作(Add, Revert, Commitなど)を行うことができます。
コミット対象の追加(Add)は主に「Unversioned Files」から任意の「Changelist(通常は「Default」)」にドラッグ&ドロップして行います(むろん、コンテキストメニューからの「Add to VCS」でもOKですが、筆者はこちらの操作を常用しています)。
追加、変更などのキャンセル(Revert)は、「Changelist」から対象のファイルを選び、コンテキストメニューから「Revert」を実行します(ちなみに「Revert」はツールバーにもあります)。先ほどのファイルの追加のように「Changelist」から「Unversioned Files」にドラッグ&ドロップできそうに思えますが、こちらはできません。何より「Unversioned Files」はバージョン管理外のファイルがひとつもない時は出てきません。
なお、リポジトリからファイルを削除する事は「Changesツールウィンドウ」からはできません。これだけは「Projectツールウィンドウ」から行います。
改めて文章に起こしてみるとAndroid StudioのVCS連携は操作体系が多様で統一感に欠けるような気がします。(正確にはIntelliJですが)筆者は、それも特に不満も無く使っていたのだから慣れとは恐ろしいものですね。
話をリポジトリの変更確認タブに切り替えます。こちらはご覧の通りリポジトリの履歴表示をメインに、その履歴操作行います。
表示される内容は連携しているバージョン管理システムによって多少変わりますが、基本的にコミットログと、コミットごとに更新したファイルの一覧を確認することができます。
ツールウィンドウ上部にあるツールバーは一見ひと繋がりのように見えますが、その下のペイン(コミットログ、コミットしたファイル一覧)ごとに独立しています。
まとめ
いろいろゴチャゴチャと説明しましたが、次回以降に具体例を示しますので、それを元に慣れていってください。Android Studioのバージョン管理の基本として覚えておいて欲しいのは次の4つです。
- 連携するバージョン管理システムのコマンドライン版を用意しておくこと。
- 専用のクイックリスト "VCS Operations Popup..." のショートカットキーを覚えること。
- 「Changesツールウィンドウ」を意識すること(できれば使って欲しい)。
- Android Studioとは別に連携するバージョン管理システムの専用ツールを用意しておくこと。