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

第25回バージョン管理 ─Git連携の使い方[前編]

はじめに

前回はGit連携とGitHub連携のとっかかりまでだったので、今回はもう少しGit連携の使い方に迫ってみます。結構量があるので前後編です。

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

Android StudioでGit連携を設定したときに変化するユーザインターフェイスのうち特徴的な部分について説明します。

Versionツールウィンドウ

常設しているツールウィンドウではありませんが、ログの参照、コミットなどGitコマンドを実行すると登場します。主に特定のファイルやディレクトリの変更履歴の確認に使いますが「Console」タブには、Android Studioが内部で実行したGitコマンドのログが出力されます。

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

「Console」タブはAndroid Studioの内部デバッグ的要素に見えるのですが、実際どのようなコマンドを実行したのか確認できるのは精神衛生上悪くはないので、筆者は密かに気に入っています。

Gitに詳しい人ほど「Console」タブの出力内容に興味が湧くのではないでしょうか。ここの内容をみれば、Android StudioがGit連携でやっていることが丸わかりなので、Git使いとしていただけないコマンドを使っているようであれば、その部分はAndroid Studioの機能を使わず、直接コマンドを叩く/他の専用クライアントを用いるなどの判断に使うことができます。

Changesツールウィンドウ

「Local」タブはどのバージョン管理システムと連携しても違いはありませんが、⁠Log」タブはGit連携の時に登場し、その表示内容もGitに最適化(?)されています。

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

コミットログにはロググラフとブランチの位置を示すラベルが表示されます。Gitを常用されている方にとってはお馴染みのインターフェイスだと思います。覚えておくべきは「HEAD」というラベルが付いている部分が現在のリポジトリの位置になっているということです。ラベルの色の意味は図3のとおりです。

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

またコミットログ上部にあるツールバーで、コミットログのフィルタリングやコミットログに伴う若干のGit操作が可能です。

図4 ⁠Changesツールウィンドウ / Logタブ」のツールバーの意味
図4
操作の実際はこちら

ステータスバー

ステータスバーの右端に現在使っているブランチ名が表示されます。

図5 Git連携中のステータスバーの様子
図5

実はこれ、クリックすることができ、クリックすると図6のような「Git Branches」ポップアップが表示されブランチの切り替え/作成/マージなどさまざまな事ができます。結構便利で筆者はこのインターフェイスを密かに気に入っています。

図6 ⁠Git Branches」ポップアップ(クリックすると動きがわかります)

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

いわゆるフェッチとプルの方法です。⁠そんなケースは稀ですが)リモートリポジトリを使わずローカルリポジトリのみで運用している場合は、この辺の説明は不要です。

フェッチ

リモートリポジトリの内容を確認します(ローカルリポジトリとのマージは行いません⁠⁠。リモートリポジトリの変更を確認だけしたい場合に実行しますが、メニューバーの「VCS → Git → Fetch」でしかフェッチを実行できません。あっても良さそうなんですが、"VCS Operations popup..."には "Fetch"が登録されていません。

「Changesツールウィンドウ / Logタブ」のツールバーにある「Refreshアイコンでもできそうに思えるのですが、こちらはフェッチではなくログの更新git log & git showになります。

フェッチを実行し、リモートリポジトリ側に変更があれば、図9のようにローカルとの違いを確認することができます。

図9 フェッチの結果、リモートの変更が確認できた例
図9

アップデート(プル)

リモートリポジトリの変更を取り込みます。フェッチと異なり、アップデートはいくつか方法があります。Android StudioのVCS連係の流儀に沿えば総合コマンドの"Update Project..."を使う事をオススメします。

"Update Project..."を実行すると、図10のようなダイアログが表示されます。

図10 ⁠Update Project」ダイアログ
図10

ここでは更新方法(Update Type)と更新前のローカル変更の待避方法(Clean working tree before update)を問い合わせてきます。それぞれの意味は表1表2の通りです。

表1 Update Typeの意味
指示名意味
Mergegit pull --no-rebase 相当を実行します。
Rebasegit pull --rebase 相当を実行します。
Branch Default.git/config[branch]セクションの設定に従います。
表2 Clean working tree before updateの意味
指示名意味
Using Stashgit stash でローカルの変更を一時待避します。
Using ShelveAndroid Studioが独自に持っている git stash 相当の一時待避機能(Shelve)を使ってローカルの変更を一時待避します(Shelveについては、後の回で紹介します⁠⁠。

Stash、Shelveのどちらを選択しても、⁠ローカルに変更があれば)アップデート前に一時待避を行い、アップデート後にその差し戻しを行います。そのため、アップデート前の状態によってはコンフリクトが起こり得ますので、その時は自力で解決してください(無難なのはローカルの変更が何もない状態でアップデートを実行することです⁠⁠。

風の噂に聞いたのですが、リモートリポジトリの変更取り込みをプル(fetch & merge)にするか、リベース(fetch & rebase)するかは、それぞれ強い主張があるようです。その点、この "Update Project..." は都度、どの方法にするか問い合わせてくるのでフェアで良いなと、個人的に思っています。

"Update Project..."を使わずに、直接プルまたはリベースを実行する場合は、それぞれ専用のコマンドを用います。

プルの場合は、メニューバーの「VCS → Git → Pull...」から行います。コマンドを実行すると図11のようなダイアログが表示されます。

図11 ⁠Pull Changes」ダイアログ
図11

Gitに使い慣れた方ならば、画面下部のStrategyや各種オプションもお手のものあkと思いますが、筆者のようなGit弱者にとっては、先ほどの "Update Project..." のほうが使いやすくみえます(実際に使いやすいです⁠⁠。

リベースはメニューバーの「VCS → Git → Rebase...」で行います。

図12 ⁠Rebase branch」ダイアログ
図12

図12「Rebase branch」ダイアログのオプション「Show Remote Branches」をONにしないと、リモートリポジトリを指定できませんので注意してください。その点がプルと比べて少々面倒臭いです。リベースは元々の用途があって、ついでにリモートリポジトリも対象にできるから、このようなインターフェイスになっているのかなと推測します。

リベースについては次回にもう少しだけ詳しい使い方を説明します。

コミット&プッシュ

コミットの手順は前回紹介したとおりです。何通りかありますので、各自気に入った方法でコミットを実行してください。⁠Commit Changes」ダイアログの詳細は後の回でまとめて説明するので、今回はGitに関係のある部分のみ補足します。

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

このダイアログでGit固有のものは右上にある「Author」「Ament commit」の2つです。

Author

コミットするユーザ名を指定します。省略すると <HOME>/.gitconfiguser.name, user.emailが採用されます。

「Author」の指定方法はgit commit --author=<author>オプションの指定に従います。git-commitコマンドのヘルプを読むとわかりますがA U Thor <author@example.com>形式で指定します。つまり、次のような指定はNGで、

  • john.doe@example.com

以下のような指定がOKになります。

  • John Doe <john.doe@example.com>
  • john.doe@example.com <>

「Author」を指定して図14のようなエラーになった場合は、⁠Author」に指定した形式が間違っていたことを疑ってください。

図14 ⁠Author」の形式間違いによるコミットエラー
図14
Amend commit

ここをONにすると、コミットのやり直しgit commit --amendを行います。

「Amend commit」にはAndroid Studioの仕組み的な欠陥があります。コミット指示を行う「Commit Changes」ダイアログですが、ローカル環境に何かしらの変更がないと"Commit Changes"を実行しても表示されません。

図15 何の変更もない状態で "Commit Changes"を実行した場合
図15

そのため「コミットログだけ書き直したい」という用途には使えません(とても残念です⁠⁠。

コミット後すぐにプッシュを行うのであれば、このダイアログの「Commit and Push...」ボタンを押します。コミットとは関係なくプッシュのみを行いたい場合は、"VCS Operations Popup..."かメニューバーの「VCS → Git」から"Push..."を実行してください。

プッシュを実行すると、図19のようなダイアログが表示されます。

図19 ⁠Git Push」ダイアログ
図19

前回の手順でGitHubに公開している場合はすでにローカルのmasterブランチはリモートのorigin/masterブランチのトラッキングブランチに設定してあるため、なにもせずに「Push」ボタンを押すだけで良いです。

新しくブランチをプッシュする場合は、ダイアログ下部にある「Push current branch to alternative branch」をONにして、隣のドロップダウンリストからリモートリポジトリを選び、さらにその隣のテキストフィールドに作成したいブランチ名を入力します(ローカルブランチ名がプリセットされます⁠⁠。

図20 プッシュ先のリモートブランチを指定する例
図20

ローカルのブランチがリモートのトラッキングブランチになるとローカルブランチ名 -> リモートブランチ名というように表記されます。これは「Git Branches」ポップアップからも確認できますので覚えておいてください。

図21 トラッキングブランチかどうかの確認
図21

後編の予定

前編では紹介できなかったブランチ・マージや、その他のGitコマンドの実行方法について紹介します。

おすすめ記事

記事・ニュース一覧