【Git】Git+GitLabでホストマシン(Windows)と仮想マシン(Ubuntu)でコードを共有する

# はじめに
今回はホストマシンの「Windows」と仮想マシンの「Ubuntu」とのコード共有のために「Git」導入してみようと思い、また、今後新たに構築するときもすぐ思い出せるように覚え書き用に書いてみます。
ローカル環境で動く仮想マシンなので、直接共有する方法（フォルダ/ファイル受け渡しなど）もありましたが、以前より「Git」を使いたかったこともあり、今回導入を行いました。
また、ホスティングサービスを利用したかった為、無料でPrivateリポジトリが作成できる「GitLab」を使用しています。

なお、ホストマシンのWindowsと仮想マシンのUbuntu共にGit 2.18.0が導入済みとなり、アカウントの登録は済んでいる状態となります。予めご了承願います。

# 環境
* ホストマシンOS  ：Windows8.1 64bit
* 仮想マシンOS    ：Ubuntu 18.04 LTS 64bit
※前述の通り、どちらもGit 2.18.0が導入済み

# GitLabへの登録
以下のGitLab公式サイトにアクセスし、登録を行います。
[GitLab](https://about.gitlab.com/)

右上の「Sing in/Register」をクリック
![SnapCrab_NoName_2018-8-15_11-51-51_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/243240/9f64623d-710d-4bdd-d903-6c8d775702ff.png)


「Register」のタブをクリック、
FullName、UserName、EMail、EMail confirmation、Passwordに必要な情報を入力、
「I Accept the Terms of Service and Privacy Policy」にチェック。
必要であれば「I'd like to receive updates via email about GitLab.」にチェックを入れます（GitLabの更新情報をEmailで受け取るか）。
![SnapCrab_NoName_2018-8-15_11-57-36_No-00_edit.png](https://qiita-image-store.s3.amazonaws.com/0/243240/1eed988a-ecce-5aba-4adf-c48f43bac2f4.png)
情報の入力が済んだら、「Register」をクリックします。

「EMail」に入力したメールアドレスに承認要求のメールが送られるので、
メール内の「Confirm your account」をクリックします。
![SnapCrab_NoName_2018-8-15_12-0-17_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/243240/671a1c83-1e7a-c1cf-f9ab-1c6e4378f3c7.png)


ログイン画面で先ほど入力した「UserName」と「PassWord」でログイン。
![SnapCrab_NoName_2018-8-15_12-1-15_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/243240/18dae0d0-5f38-20be-1b97-218896a62960.png)

Welcome to GitLabの画面が表示されれば、登録とログインは完了です！
![SnapCrab_NoName_2018-8-15_12-1-43_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/243240/7ada7680-85c2-080c-2ca8-0df276039755.png)


# GitLabを使用する
## リポジトリ（プライベート）を作る
登録が完了したので早速リポジトリを作ります。
先ほど出てきたWelcome to GitLabの画面から「Create a Project」をクリックします。

「Project path」にはGitLabのアドレスとユーザー名を含んだアドレスが表示されます。編集はできません（でした）。
「Project name」に作成したいリポジトリの名前（今回はTest-Projectとしました）、
「Project description (optional)」にリポジトリの説明（任意）を入力します。
![SnapCrab_NoName_2018-8-15_14-10-23_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/243240/00af13cd-4d4f-981f-070b-bf2e3188842b.png)


「Visibility Level」はリポジトリの可視範囲を設定します。
設定できる項目は以下となります。

* Private - アクセスが許可されたユーザーだけが見れる
* Internal - GitLabにログインしているユーザーが見れる
* Public -  誰でも見れる

今回は自分だけで使ってみたいので、「Private」に設定しました。

「Initialize repository with a README」はREADME.mdを作ってくれるようです。
今回は初めて作るため、チェックを入れておきましょう。
（別リポジトリやGitHubなどからImportする場合は外しておいた方が良さそうです。）

最後に「Create project」をクリックします。

作成が完了するとプロジェクト管理の画面が表示されます。
![SnapCrab_NoName_2018-8-15_14-20-5_No-00_edit.png](https://qiita-image-store.s3.amazonaws.com/0/243240/fdf510e7-c6c3-e646-72dc-927814927655.png)


## Cloneする
### ホストマシン(Windows)側
筆者の環境ではコマンドプロンプトでGitを使用できるようにしましたので、
Gitコマンドはコマンドプロンプト上での操作となります。(Git Bashなどでも同様かと思います。)

1. コマンドプロンプトを起動します。
2. 先ほど作成したリポジトリのページの中央部にあるURLをコピーします。（右側にあるボタンをクリックでもコピーできます）
![SnapCrab_NoName_2018-8-15_14-26-41_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/243240/8ac3a1c2-de6a-8bb8-1c11-8add7bb0bbeb.png)

3. 1.で起動しているコマンドプロンプトで以下のコマンドを入力します。

## 
    git clone (2.でコピーしたURL)
## 
4. GitLabへのログインを求められるので、UserNameとPassWordを入力し「OK」をクリック
5. コマンドプロンプト上で以下のようになればClone成功です。

## 
    Cloning into 'Test-Project'...
    remote: Enumerating objects: 3, done.
    remote: Counting objects: 100% (3/3), done.
    remote: Total 3 (delta 0), reused 0 (delta 0)
    Unpacking objects: 100% (3/3), done.
## 
念の為、エクスプローラー上でも確認します。
`git clone`を用いて作成した場合は、
`コマンドプロンプト上のカレンドディレクトリ\リポジトリ名`にフォルダが作成されます。
以下のように作成されていればClone成功です。
![SnapCrab_NoName_2018-8-15_14-29-4_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/243240/084aad60-a542-e81d-ba37-8d53940bfdbb.png)


### 仮想マシン(Ubuntu)側
Ubuntuの場合はコマンドプロンプトで行うことをターミナル上でやるだけなので、
手順としてはほとんど同じです。

1. ターミナルを起動します。
2. ホストマシン(Windows)側と同様に`git clone (コピーしたURL)`を実行する
3. ターミナル上でGitLabへのログインを求められるので、UserNameとPassWordを順に入力しする。
4. 入力後、ターミナル上で以下のようになればクローン成功です。 

##
    Cloning into 'Test-Project'...
    remote: Enumerating objects: 3, done.
    remote: Counting objects: 100% (3/3), done.
    remote: Total 3 (delta 0), reused 0 (delta 0)
    Unpacking objects: 100% (3/3), done.
## 
Ubuntuでも同じく、念の為、ファイル上で確認します。
`ターミナル上のカレンドディレクトリ\リポジトリ名`にフォルダが作成されます。
以下のように作成されていればクローン成功です。
![SnapCrab_NoName_2018-8-15_15-1-58_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/243240/52eb1ee2-4ae9-558e-1ba9-681550657e69.png)


## ファイルを変更/追加する
cloneがちゃんと出来たので問題はないと思いますが、
ファイルを追加や変更をしたりして、本来の目的である「コード共有」をしてみたいと思います。

仮想マシン(Ubuntu)側に別で作っていたPythonの練習ソースがあったので、今回はそれを追加したいと思います。
先ほどクローンしたリポジトリに*hello.py*というファイルを追加しました。
![SnapCrab_NoName_2018-8-15_15-10-34_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/243240/2a6fb140-8d6f-aefb-940b-82cb9c45c5e2.png)
*hellp.py*には簡単なソースコードが書かれています。

```python:hello.py
print("Hello World!")
```

ファイル追加後、クローンしたリポジトリのディレクトリでターミナルを開き、
以下のように`add`を使用します。
## 
    git add hello.py
##
`add`は対象のファイルをGitの管理対象として追加するコマンドで、
上記を行うことで、*hello.py*が管理対象として追加されました。
※今回は直接ファイルを指定しましたが、ディレクトリやワイルドカードを用いた複数指定も可能です。
##
    git add Lib
##
    git add *.py

追加されたかどうかは、 `git status`を実行することで確認できます。
実際にターミナルで`git status`を実行してみます。
## 
    ブランチ master
    Your branch is up to date with 'origin/master'.

    コミット予定の変更点:
      (use "git reset HEAD <file>..." to unstage)

    	new file:   hello.py
## 
上記のように「コミット予定の変更点:」というところに先ほど追加した*hello.py*がいますので、
管理対象として追加ができています。

さて、管理対象として追加ができたのでコミットします。
コミットには`commit`を使用します。
## 
    git commit -m "Hello Python!"
##
`-m`は**その後につづく文字列をコメントとして追加**します
この場合は**Hello Python!**がコメントになります。

`commit`までしましたが、ここまでではまだローカルでの変更にしか過ぎない為、
`push`で実際にリモートリポジトリに対して変更内容を反映します。
以下のように行います。
##
    git push origin master
##
※`origin`はレポジトリの場所(URL)の別名となり、`master`はブランチの名前となります。
　今回は作成したリポジトリをそのまま使うため、`origin master`で指定しています。

実行後は以下のようにリモートへの反映が行われます。
## 
    Enumerating objects: 4, done.
    Counting objects: 100% (4/4), done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (3/3), 304 bytes | 304.00 KiB/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To https://gitlab.com/(ユーザー名)/Test-Project.git
       1a54c46..751dcbf  master -> master
##

ここまでの追加操作は、`log`を使用して確認できます。
##
    git log
実行後は以下のように表示されます。

## 
    commit （コミットした際のHash値) (HEAD -> master, origin/master, origin/HEAD)
    Author: (コミットした人のユーザー名) <(コミットした人の登録メールアドレス)>
    Date:   (コミット日時)
    
    Hello Python!


`log`でも変更されたことは確認できましたが、
実際にファイルを取り込んで変更を確認するため、ホストマシン(Windows)側で`pull`を使って変更点を取り込みます。
## 
    git pull origin master
##
実行後は以下のようにリモートの内容がローカルへ反映されます。
##
    remote: Enumerating objects: 4, done.
    remote: Counting objects: 100% (4/4), done.
    remote: Compressing objects: 100% (2/2), done.
    remote: Total 3 (delta 0), reused 0 (delta 0)
    Unpacking objects: 100% (3/3), done.
    From https://gitlab.com/(ユーザー名)/Test-Project
    1a54c46..751dcbf  master     -> origin/master    
    Updating 1a54c46..751dcbf
    Fast-forward
    hello.py | 1 +
    1 file changed, 1 insertion(+)
    create mode 100644 hello.py
##
これも念の為、エクスプローラーで確認します。
無事*hello.py*が追加されています
![SnapCrab_NoName_2018-8-15_17-28-52_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/243240/f0a7c4f1-f9a1-e1ca-f6e1-2dcfd515b169.png)

中身も確認してみます。
![SnapCrab_NoName_2018-8-15_17-59-42_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/243240/dc60946e-6baf-cf23-87af-b22171d8c2e4.png)

Ubuntu側で追加したコードと同じものが追加されているので、念願の「コード共有」が出来ました。

変更の場合は追加よりも簡単で、管理対象のファイルを変更後、
`commit`→`push`でローカル→リモートでの変更が可能です。

# 最後に
今回はGitとGitLabを使って実際に登録からリモートリポジトリを作って別環境からのコード共有を実現しました。
Gitには難しそうな印象を持っていましたが、意外とサクっと使えたのでこれからもぜひ活用したいです。
また、今回は個人で使う為masterブランチを直接変更するような形となってしまいましたが、
ブランチを作成して切り替えて作業…など機会があればまとめてみたいと思います。

Qiita初投稿かつGit初心者なので内容など、ご指摘あればどんどんコメントいただけますと幸いです。

# 参考元
GitおよびGitLabの使い方には以下を参考いたしました。

* [GitLab.comの使い方紹介！無料で限定公開リポジトリを作成する](http://okakacacao.wpblog.jp/technology/gitlab-com-introduction)
* [いまさら聞けないgitの使い方](https://qiita.com/mountcedar/items/682743c95fd3b8fc274b)
* [【メモ】GitHubでgit clone〜git pushまで](https://qiita.com/nt_tn/items/c5ea999a2638e03ee418)

また、WindowsとUbuntuでのGitの導入に以下を参考いたしました。

* [コマンドラインからGitを使う（for Windows）](https://qiita.com/taiponrock/items/632c117220e57d555099)
* [Ubuntu 16.04 (Xenial) なのに最新の git を使いたい](https://www.talkwithdevices.com/archives/1337)