チャチャチャおもちゃの抹茶っちゃ

ゲームのこととかプログラミングのこととか。気が向いたら書く。ブログタイトルは友人が考えました。

【Git】Visual Studio Community 2017でGitを利用する。

目次

Gitって何?

開発しているものをバージョン管理するためのやつ。詳しくは別記事を書いてるのでそちらもどうぞ!(宣伝)

mattyan1053.hatenablog.com

この記事の概要

Gitの基本的な昨日をVisual Studio Community 2017を使って利用する方法を、コンソールで操作するGitと比較しつつ説明する。「コミット」「マージ」などの言葉はすでに多少は理解している前提で進むので注意。仕組み概要図は「Git入門」のほうに図で説明してあるのでそちらを参照してほしい。

本記事の対象

本記事ではGitの機能をVisual Studioで使いたい方が対象だ。Gitの大まかな仕組みを理解していて、かつVisual Studioの使い方がだいたいはわかるくらいであれば読めると思う(というよりそれでわかる記事を目指している)。

Gitの理解度については、コンソールで実際に操作できなくても、「コミット」や「マージ」、「ブランチの切り替え」など、言葉をきいて何するかわかっていれば問題ない。何かの操作についてそれぞれ対応するコンソール操作も比較のため掲載するが、わからなければ読み飛ばしてOK。

本記事で使用する環境

  1. Windows10 Home
  2. Visual Studio Community 2017
  3. Git for Windows version 2.18.0.windows.1
  4. Github

OSについてはあまり問題ではない。Visual Studioがまともに動けばいいのではないだろうか。
今回使用するVisual Studio(以下VS)はCommunity 2017だ。学生とか個人開発者であれば無償で使うことができる。これ以前のVSでも機能がついてたりするようだけど筆者がVisual Studio Express 2013とこの2017しか使ったこと無いので割愛。まあ新しい方で許して。 Gitはまあメジャーなやつ。CygwinのやつとmsysGitのどちらを使うかということだけれどVSなら後者一択。まあGit for Windowsで問題ない。
VSならリポジトリサービスはVisual Studio Onlineというのがあるのだけど、ここでは有名で利用者の多いGitHubを採用。まあみんながみんなVS使ってるとは限らないしね(当然VS以外からも利用できるけどVS以外からの利用がメジャーでない)。

前準備

実際にVSでのGit操作を説明するにあたり、今回Git管理したいプロジェクトと、GitHubにリモートリポジトリを作成しておく。

新規プロジェクトの作成

普通に新規作成すればOK。途中、「新しいGitリポジトリの作成(G)」というのがあるけれど、今回はあとから作成する(途中まで作業を進めたプロジェクトでもあとからGit管理する方法もわかるため)。
f:id:mattyan1053:20180729165908p:plain
今回はC++で例を進めていく(自分の都合)。

リモートリポジトリの準備

GitHubで新しくリポジトリを作成しておく。今回は「vs-git-test」という名前で作成した。
詳しいやり方はここでは説明を省く。詳しくはここへ

mattyan1053.hatenablog.com

Git設定

VSを起動して、Gitの設定をしておく。具体的に言うとユーザー名とか。メニューバーの「表示」から「チームエクスプローラー」を開いて、「設定」から各情報を記入する。
f:id:mattyan1053:20180729172527p:plain
差分、マージツールはとりあえずVisual StudioでOK。もしほかのものを使いたい場合はGitの「.gitconfig」とかのほうから設定してみるとかしよう。

これで前準備は完了。

プロジェクトにローカルリポジトリを設定する

まずはこのプロジェクトにローカルリポジトリを設定しなければならない。コンソール時は次のようにした。

$ git init

VSでプロジェクトにローカルリポジトリを設定するには、「ソリューション名のところを右クリック」→「ソリューションをソース管理に追加」とする。
f:id:mattyan1053:20180729171120p:plain
これでローカルなGitリポジトリが作成され、更に最新の状態がコミットされた状態になる。ソリューションエクスプローラーにはファイルなどに鍵マークのようなものがついていることが確認できるだろう。実際にVSの作業ディレクトリを見てみると
f:id:mattyan1053:20180729171432p:plain
と、「.git」フォルダが作成されており、更に「.gitignore」や「.gitattributes」までもが追加されている。「.gitignore」の中身を見てみると、「Debug」フォルダや一時ファイルなど管理しなくて良いものは既に記入された状態になっている。とてもありがたい。
更に、コミット履歴を見てみると(確認の仕方は後述)、
f:id:mattyan1053:20180729171945p:plain
と、既に二度コミットされており、最初は「.gitignore」、「.gitattributes」のコミットがされた後、プロジェクトがコミットされていることが確認できる。また、ブランチは当然「master」であることもわかる。

余談であるが、当然コマンドプロンプトなどからgit loggit statusとして確認することも可能。

変更をコミットする

なにか変更を加えたとしよう。それが完了したらコミットをしてみる。
チームエクスプローラーから「変更」をクリックするとコミットメッセージ入力画面などが表示される。
f:id:mattyan1053:20180729173808p:plain
必要事項を入力し、「すべてをコミット」をクリックすると、すべての変更をコミットすることができる。コミットするブランチはコミットメッセージの上に表示されている。実質これ。

$ git add .
$ git commit

ちなみに、一部だけをコミットしたい場合は、「すべてをコミット」の下部に表示されている「変更」のところにある変更されたファイルを右クリックして個別に「ステージ」することができ、ステージしたものだけをコミットすることも可能だ。逆に、「変更」の右部に表示されている「+」をクリックすればすべての変更をステージするので、そのあと「ステージ済みのファイル」からコミットしたくないファイルを右クリックして「アンステージ」すればコミット内容から外すことができる。

ブランチの操作

ブランチの新規作成

Gitの強みであるブランチの操作について説明する。まずはチームエクスプローラーから「ブランチ」をクリック。そのあと左上の「新しいブランチ」をクリックする。
f:id:mattyan1053:20180729174449p:plain
ここで新規に作成したいブランチ名を入力し、下のプルダウンメニューでは派生元のブランチを選択する(ここではまだmasterブランチしかないので変更することはない)。その下の「ブランチのチェックアウト」にチェックをいれておけば新規ブランチを作成したあとそちらのブランチに移行してくれる。
すると、次からチームエクスプローラーで「ブランチ」を開いたときは
f:id:mattyan1053:20180729175237p:plain
となっており、新しいブランチが反映されているはずだ。現在アクティブなブランチは、ソリューション名の横に表示されている。

$ git checkout -b <newbranch>

とやってることは同じ。

ブランチの切り替え

画像を貼るのも面倒なくらい簡単で、チームエクスプローラーから「ブランチ」を選択し、アクティブにしたいブランチ名のところをダブルクリックするだけである。

$ git checkout <branchname>

と同じ。

あと実は現在のブランチは画面の右下に表示されていて、ここから変更できたりもする。
f:id:mattyan1053:20180729200141p:plain

ログの表示

ログの表示をするにあたって次のように変更し、コミットした。

  • masterブランチの「Source.cpp」
#include <iostream>

int main() {
    std::cout << "Hello World!" << std::endl;
    std::cout << "Let's commit!" << std::endl;
    std::cout << "Now branch is master!" << std::endl;
    return 0;
}
  • developブランチの「Source.cpp」
#include <iostream>

int main() {
    std::cout << "Hello World!" << std::endl;
    std::cout << "Let's commit!" << std::endl;
    std::cout << "Now branch is develop!" << std::endl;
    return 0;
}

察しのいい人ならわかってしまうかもしれないが、次のマージの説明で競合させるための下準備だったりする。
さて、まずはmasterブランチのログを表示してみる。チームエクスプローラーの「ブランチ」から「master」ブランチを選択して右クリックして、「履歴を表示」とすると、masterブランチの履歴のみが新しいウィンドウで表示される。
f:id:mattyan1053:20180729180028p:plain
同様に、他のブランチのログも表示することができる。

$ git log --oneline --graph

に近い表示。

ブランチのマージ

VSを用いてマージを行ってみる。先ほどのmasterブランチにdevelopブランチをマージしてみよう。
チームエクスプローラーから「ブランチ」をクリックして、「マージ」のところをクリックする。
f:id:mattyan1053:20180729180709p:plain
あとはマージ元とマージ先を選択しマージ。問題なくマージできればこれでマージは完了。ログを確認するとうまくいっているはずである。

$ git merge <branch>

と同じ。

マージの競合を解決する

今回の例では競合が発生する。これの解決方法を説明する。
マージで競合が発生すると次のように表示される。
f:id:mattyan1053:20180729181656p:plain
「競合」と表示されているところをクリックすると、競合一覧が出てくるので、ひとつずつ解決していく。
競合しているファイルをクリックして「マージ」をクリックすると差分が表示されるので
f:id:mattyan1053:20180729181950p:plain
f:id:mattyan1053:20180729182024p:plain
各ファイルから残す部分、削除する部分を選択していく。完了したら左上の「マージを許可」をクリック。これを競合しているすべてのファイルに対して行っていく。それができたら
f:id:mattyan1053:20180729182155p:plain
チームエクスプローラの「マージをコミット」をクリックして、
f:id:mattyan1053:20180729182222p:plain
いつものコミットのようにメッセージを入力してコミット。これで競合を解決してマージが成功した。
実際に、ログを確認してみると
f:id:mattyan1053:20180729182517p:plain
うまくいっていることがわかる。

リベースもほぼ同様の手順で可能である。

リセット

リセットで指定のコミットに戻ることも可能である。方法は、コミットログを開いて戻りたいコミットで右クリック→「リセット」→「[option]」とするだけ。オプションは必要なものを選ぼう。
f:id:mattyan1053:20180729182926p:plain
裏では

$ git reset [option] <commit>

をやってるだけ。

--mixed--hardの違いは次を参照

mattyan1053.hatenablog.com

リモートリポジトリをリポジトリに設定する

チームエクスプローラから「設定」→「リポジトリの設定」→リモートにある「追加」でリモートリポジトリの設定を入力する。リポジトリ名は「origin」として、フェッチ、プッシュのところはGitHubに指定されたものを入力。今回の例ではSSHを使っている。
f:id:mattyan1053:20180729183535p:plain

グローバルなユーザー名を使用するかは任意。チェックを入れれば最初のほうで設定したものを利用することになる。リポジトリごとに個別に設定したい場合はここで。

$ git remote add <remotename> <adress>

と同じ。ユーザー名とかはgit configの設定に--globalをつけてるかどうかって感じ。

プッシュ

さてローカルで行った変更をプッシュしてみよう。チームエクスプローラーから「同期」を選択する。すると現在のブランチ名とプッシュ、フェッチなどが表示されるので「プッシュ」をクリック。するとリモートリポジトリに現在のブランチの内容がプッシュされる。
f:id:mattyan1053:20180729183929p:plain
他のブランチをプッシュしたいときは「ブランチ」でアクティブブランチを変更してからプッシュしよう。
当然GitHubにいけば内容が確認できる。
f:id:mattyan1053:20180729184335p:plain

コンソールで言う

$ git push origin <branch>

プル

もうお気づきだと思うがほとんどプッシュと同じでプッシュのかわりにプルをクリックするだけである。すると現在のブランチに当たる部分がプルされてくる。
f:id:mattyan1053:20180729184202p:plain
今回の例では何もせずそのままプルしたので最新ですって言われる。
コンソールで言う

$ git pull origin <branch>

にあたる。

フェッチについて
フェッチの詳しい説明は割愛するが、もしかしたら使いたい時もあるかもしれない。この場合はフェッチをクリックしたあと、ブランチからフェッチしてきたコミットをマージすることでプルができる。
f:id:mattyan1053:20180729184640p:plain

クローン

当然リモートリポジトリからリポジトリをクローンしてきて使いたいときもある。 そのときは、上の方のコンセントのようなマーク(接続)から、ローカルリポジトリの「複製」のところをクリックし、クローンしたいリポジトリのURLを入力すればOK。
f:id:mattyan1053:20180729194743p:plain
URLはGitHubの場合、リポジトリのページの「Clone or Download」のところから取得できる。

$ git clone <url> <filename>

と同じ。

コンソールでGitを扱う

これまでの操作は、あくまでGitの操作がGUI化してただけで当然コンソールからも行うことができる。このとき、操作したあとVSに戻ると
f:id:mattyan1053:20180729185708p:plain
と言われるかもしれないがおとなしくすべて適用すればOK。

最後に

以上、Visual StudioにおけるGitの使い方である。サークルのほうでC講座をやるときVisual Studio使ってるので需要あるかなとおもって書いてみた。
そんなに複雑な操作はないと思う。細かい原理理解してなくても必要な機能使えるしね。