はじめに
前回 はGit連携とGitHub連携のとっかかりまでだったので、今回はもう少しGit連携の使い方に迫ってみます。結構量があるので前後編です。
Git連携時のユーザインターフェイスの特徴
Android StudioでGit連携を設定したときに変化するユーザインターフェイスのうち特徴的な部分について説明します。
Versionツールウィンドウ
常設しているツールウィンドウではありませんが、ログの参照、コミットなどGitコマンドを実行すると登場します。主に特定のファイルやディレクトリの変更履歴の確認に使いますが「Console」タブには、Android Studioが内部で実行したGitコマンドのログが出力されます。
図1 「 Versionツールウィンドウ / Consoleタブ」
「Console」タブはAndroid Studioの内部デバッグ的要素に見えるのですが、実際どのようなコマンドを実行したのか確認できるのは精神衛生上悪くはないので、筆者は密かに気に入っています。
Gitに詳しい人ほど「Console」タブの出力内容に興味が湧くのではないでしょうか。ここの内容をみれば、Android StudioがGit連携でやっていることが丸わかりなので、Git使いとしていただけないコマンドを使っているようであれば、その部分はAndroid Studioの機能を使わず、直接コマンドを叩く/他の専用クライアントを用いるなどの判断に使うことができます。
Changesツールウィンドウ
「Local」タブはどのバージョン管理システムと連携しても違いはありませんが、「 Log」タブはGit連携の時に登場し、その表示内容もGitに最適化(?)されています。
図2 「 Changesツールウィンドウ / Logタブ」の外観
コミットログにはロググラフとブランチの位置を示すラベルが表示されます。Gitを常用されている方にとってはお馴染みのインターフェイスだと思います。覚えておくべきは「HEAD」というラベルが付いている部分が現在のリポジトリの位置になっているということです。ラベルの色の意味は図3 のとおりです。
図3 コミットログのラベルの意味
またコミットログ上部にあるツールバーで、コミットログのフィルタリングやコミットログに伴う若干のGit操作が可能です。
図4 「 Changesツールウィンドウ / Logタブ」のツールバーの意味
※ 操作の実際はこちら
ステータスバー
ステータスバーの右端に現在使っているブランチ名が表示されます。
図5 Git連携中のステータスバーの様子
実はこれ、クリックすることができ、クリックすると図6 のような「Git Branches」ポップアップが表示されブランチの切り替え/作成/マージなどさまざまな事ができます。結構便利で筆者はこのインターフェイスを密かに気に入っています。
図6 「 Git Branches」ポップアップ(クリックすると動きがわかります)
[コラム]リモートリポジトリの場所はどうやって確認するの?
この回の執筆にあたり気になって確認してみたのですが、Android StudioでGitのリモートリポジトリの場所(URL)を確認する手立てはありませんでした。あらためて調べてみるまで、この機能がないことに気付かなかったくらいなので、そもそもリモートリポジトリの場所を知りたい用事はそうないのかも知れません。
とはいえ、それはそれで気持ちの悪い事なので、一応「こうやると確認できたよ」という方法を2つほど紹介します。
ひとつは万能「Terminalツールウィンドウ」を用いる方法です。次のコマンドを実行してリモートリポジトリの場所を確認しましょう。
図7 リモートリポジトリの確認コマンド
$ git remote -v
ただし「Terminalツールウィンドウ」は、ある意味反則技なので、これを頼る時点で負けなんだと思ってます。
もうひとつの方法は、この後説明するフェッチやプルといったリモートリポジトリとの連係時にステータスバーに表示されるメッセージから確認する方法です。
図8 ステータスバーに一瞬リモートリポジトリURLが表示される(クリックすると動きがわかります)
これはすでに確認方法というより「たまたま見えた」だけでしかありませんね。
リポジトリを最新の状態に保つ
いわゆるフェッチとプルの方法です。( そんなケースは稀ですが)リモートリポジトリを使わずローカルリポジトリのみで運用している場合は、この辺の説明は不要です。
フェッチ
リモートリポジトリの内容を確認します(ローカルリポジトリとのマージは行いません) 。リモートリポジトリの変更を確認だけしたい場合に実行しますが、メニューバーの「VCS → Git → Fetch」でしかフェッチを実行できません。あっても良さそうなんですが、"VCS Operations popup... "には "Fetch "が登録されていません。
「Changesツールウィンドウ / Logタブ」のツールバーにある「Refreshアイコン 」でもできそうに思えるのですが、こちらはフェッチではなくログの更新(git log
& git show
)になります。
フェッチを実行し、リモートリポジトリ側に変更があれば、図9 のようにローカルとの違いを確認することができます。
図9 フェッチの結果、リモートの変更が確認できた例
アップデート(プル)
リモートリポジトリの変更を取り込みます。フェッチと異なり、アップデートはいくつか方法があります。Android StudioのVCS連係の流儀に沿えば総合コマンドの"Update Project... "を使う事をオススメします。
"Update Project... "を実行すると、図10 のようなダイアログが表示されます。
図10 「 Update Project」ダイアログ
ここでは更新方法(Update Type)と更新前のローカル変更の待避方法(Clean working tree before update)を問い合わせてきます。それぞれの意味は表1 と表2 の通りです。
表1 Update Typeの意味
指示名 意味
Merge git pull --no-rebase
相当を実行します。
Rebase git pull --rebase
相当を実行します。
Branch Default .git/config
の [branch]
セクションの設定に従います。
表2 Clean working tree before updateの意味
指示名 意味
Using Stash git stash
でローカルの変更を一時待避します。
Using Shelve Android Studioが独自に持っている git stash
相当の一時待避機能(Shelve)を使ってローカルの変更を一時待避します(Shelveについては、後の回で紹介します) 。
Stash、Shelveのどちらを選択しても、( ローカルに変更があれば)アップデート前に一時待避を行い、アップデート後にその差し戻しを行います。そのため、アップデート前の状態によってはコンフリクトが起こり得ますので、その時は自力で解決してください(無難なのはローカルの変更が何もない状態でアップデートを実行することです) 。
風の噂に聞いたのですが、リモートリポジトリの変更取り込みをプル(fetch & merge)にするか、リベース(fetch & rebase)するかは、それぞれ強い主張があるようです。その点、この "Update Project... " は都度、どの方法にするか問い合わせてくるのでフェアで良いなと、個人的に思っています。
"Update Project... "を使わずに、直接プルまたはリベースを実行する場合は、それぞれ専用のコマンドを用います。
プルの場合は、メニューバーの「VCS → Git → Pull...」から行います。コマンドを実行すると図11 のようなダイアログが表示されます。
図11 「 Pull Changes」ダイアログ
Gitに使い慣れた方ならば、画面下部のStrategyや各種オプションもお手のものあkと思いますが、筆者のようなGit弱者にとっては、先ほどの "Update Project... " のほうが使いやすくみえます(実際に使いやすいです) 。
リベースはメニューバーの「VCS → Git → Rebase...」で行います。
図12 「 Rebase branch」ダイアログ
図12 の「Rebase branch」ダイアログのオプション「Show Remote Branches」をONにしないと、リモートリポジトリを指定できませんので注意してください。その点がプルと比べて少々面倒臭いです。リベースは元々の用途があって、ついでにリモートリポジトリも対象にできるから、このようなインターフェイスになっているのかなと推測します。
リベースについては次回にもう少しだけ詳しい使い方を説明します。
コミット&プッシュ
コミットの手順は前回 紹介したとおりです。何通りかありますので、各自気に入った方法でコミットを実行してください。「 Commit Changes」ダイアログの詳細は後の回でまとめて説明するので、今回はGitに関係のある部分のみ補足します。
図13 「 Commit Changes」ダイアログ
このダイアログでGit固有のものは右上にある「Author」と「Ament commit」の2つです。
Author
コミットするユーザ名を指定します。省略すると <HOME>/.gitconfig
の user.name
, user.email
が採用されます。
「Author」の指定方法はgit commit --author=<author>
オプションの指定に従います。git-commit
コマンドのヘルプ を読むとわかりますが「A U Thor <author@example.com>
」形式で指定します。つまり、次のような指定はNGで、
以下のような指定がOKになります。
John Doe <john.doe@example.com>
john.doe@example.com <>
「Author」を指定して図14 のようなエラーになった場合は、「 Author」に指定した形式が間違っていたことを疑ってください。
図14 「 Author」の形式間違いによるコミットエラー
Amend commit
ここをONにすると、コミットのやり直し(git commit --amend
)を行います。
「Amend commit」にはAndroid Studioの仕組み的な欠陥があります。コミット指示を行う「Commit Changes」ダイアログですが、ローカル環境に何かしらの変更がないと"Commit Changes "を実行しても表示されません。
図15 何の変更もない状態で "Commit Changes"を実行した場合
そのため「コミットログだけ書き直したい」という用途には使えません(とても残念です) 。
コミット後すぐにプッシュを行うのであれば、このダイアログの「Commit and Push...」ボタンを押します。コミットとは関係なくプッシュのみを行いたい場合は、"VCS Operations Popup... "かメニューバーの「VCS → Git」から"Push... "を実行してください。
[コラム]改行コードについて
どうもGitの流儀ではリポジトリ上の改行コードは「LF」であることが望ましいようです。WindowsやMac, Linuxなど異なるプラットフォームが混在してる環境では改行コードのポリシーを決めることが大事になります。
Android Studioは自身が作成するファイルの改行コードを「Preferences / Code Style / General」で指定する事ができますが、Gitリポジトリから取得するファイルの改行コードに影響を与えることができません。それはリポジトリ操作をAndroid Studio自身ではなくgit
コマンドが行っているためです。
図16 「 Preferences / Code Style / General」設定画面の改行コードの指定
そのため、たとえばWindowsで「Preferences / Code Style / General」の「Line separator (for new files)」に「Unix or OS X(\n)」と設定していても改行コードが「CR/LF」で取得される事があります。
Gitにおける改行コードの設定は<HOME>/.gitconfig
のautocrlf
で指定します。くわしくは以下のリンクを参照してください。
Android Studioでは「Preferences / Version Control / Git」の「Warn if CRLF line separators are about to be committed」で改行コードが「CR/LF」のままコミットしようとしているかをチェックできます。
図17 「 Preferences / Version Control / Git」設定画面
たとえばWindowsで <HOME>/.gitconfig
がリスト1 のような設定で、改行コードに「CR/LF」を含むファイルをコミットしたとします。
リスト1 .gitconfigの例
autocrlf = false
すると、図18 のような警告ダイアログが表示されます。
図18 「 Line Separators Warning」ダイアログ
ここで「Fix and Commit」を選択すると、対象ファイルの改行コードを「LF」に変換してコミットし、<HOME>/.gitignore
をリスト2 のように書き換えます。
リスト2 .gitconfigの書き換え例
autocrlf = true
プッシュを実行すると、図19 のようなダイアログが表示されます。
図19 「 Git Push」ダイアログ
前回の手順でGitHubに公開している場合はすでにローカルのmasterブランチはリモートのorigin/masterブランチのトラッキングブランチに設定してあるため、なにもせずに「Push」ボタンを押すだけで良いです。
新しくブランチをプッシュする場合は、ダイアログ下部にある「Push current branch to alternative branch」をONにして、隣のドロップダウンリストからリモートリポジトリを選び、さらにその隣のテキストフィールドに作成したいブランチ名を入力します(ローカルブランチ名がプリセットされます) 。
図20 プッシュ先のリモートブランチを指定する例
ローカルのブランチがリモートのトラッキングブランチになると「ローカルブランチ名 -> リモートブランチ名 」というように表記されます。これは「Git Branches」ポップアップからも確認できますので覚えておいてください。
図21 トラッキングブランチかどうかの確認
[前回の補足]自力でGitHubをリモートリポジトリに登録した場合
前回のコラム のように、Android StudioのGitHub連係機能を用いず自力でリモートリポジトリを追加した場合、当然のようにローカルのmasterブランチは追跡ブランチにはなっていません。
そのため初回のプッシュ処理では、先ほどと同様に「Push current branch to alternative branch」をチェックし、リモートブランチと紐付けるようにしてください。
GitHub以外のリポジトリをリモートリポジトリに登録した場合も同様です。
後編の予定
前編では紹介できなかったブランチ・マージや、その他のGitコマンドの実行方法について紹介します。
[コラム]最近のAndroid Studio
ここ最近のアップデートで気になるインターフェイスが追加されたので、ちょっと紹介しておきます。Anroid Studio v0.3.0かv0.3.1のどちらかからだと思うのですが、ツールバーの右端に「Search Everywhere」という機能が追加されました。
図22 ツールバーの「Search Everywhere」アイコン
ツールチップからもわかるとおり「クラス」「 ファイル」「 ツールウィンドウ」「 アクション(コマンド) 」 「 ( Preferencesの)設定項目」を横串で検索できるようです。ツールバーのアイコンをクリックすると図23 のように「最近使ったファイル一覧(Recent Files) 」が表示され、テキストフィールドにタイプした文字に応じて該当項目が絞り込まれていきます。
図23 ツールバーの「Search Everywhere」アイコンの実行例
いちいちマウスを使うのは面倒だと思いますが、同機能は「SHIFTキーを2回押す」ことでも実行されます。
図24 SHIFTキーの2回押しで"Search Everywhere"を実行する(クリックすると動きがわかります)
"Find Action "や「Navigate」メニューの"Class..."、" File... "が統合されて一見便利そうにも思えるのですが、いろんな種類の結果が一度に出てくるため目的の項目に絞り込むのが面倒くさいという弊害もありました。
とはいえ「SHIFTキー2回押し」は覚えやすいショートカットキーなので、これから洗練されて使い勝手が良くなることを期待します。