【超初心者向け】UnityをGitHubで共同管理したい！【ざっくりGUI】

# 今日やること
* [今回の環境](#今回の環境)
* [Unityを共同で管理するということ](#unityを共同で管理するということ)
* [そもそもGitやGithubって何？](#そもそもgitやgithubって何)
* [ざっくりGitHubの使い方(共同使用を前提に)](#ざっくりgithubの使い方共同使用を前提に)
 - [リポジトリの作成](#リポジトリの作成)
 - [.gitignoreを使って容量削減](#gitignoreを使って容量削減)
 - [Unityでプロジェクトを作成、プロジェクトをリポジトリに](#unityでプロジェクトを作成プロジェクトをリポジトリに)
 - [ブランチを切る、Mergeする](#ブランチを切るmergeする)
* [作ったリポジトリを別環境でcloneする](#作ったリポジトリを別環境でcloneする)

(Unity自体の使い方については一切触れません。ご了承ください。）
雑談すっ飛ばして本質だけ知りたい方は[ざっくりGitHubの使い方(共同使用を前提に)](#ざっくりgithubの使い方共同使用を前提に)から下だけ読んでください。
なお、今回はUnityを使う人はGUI好きかな〜という偏見で[GitHub Desktop](https://desktop.github.com/)を使用した最も視覚的な方法で説明します。

## 今回の環境
* Gitをインストール済みのPC, Mac(ここは各自でお願いします)
* Unity 2019.1.2f1(何でもいいので共同管理する人たちの間でバージョンを揃えておいてください)
* Unity Hub 2.0.0

# Unityを共同で管理するということ
これからみなさんには、物理エンジンUnityを用いて共同開発を行ってもらいます。その際にGitHubを用いてUnityのプロジェクトを共同管理して欲しいのですが、GitHubを使って共同で管理すればどのようなメリットがあると思いますか？

* 複数の環境で同時に開発できる
* ブランチを分けて開発することで安全に変更できる
* 進捗や課題を互いに把握できる

こんな感じでいいことしか無いんですよね。こんな魔法みたいなことを実現することができるのがGitでございます。

# そもそもGitやGithubって何？
で、結局何やねんと。順を追って説明していきますね。  
## Git
GitというのはLinuxカーネルの生みの親、リーナス・トーバルズが元々Linuxのバージョン管理のために開発したバージョン管理システムです。　　
プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムで、リモートサーバ上にあるオリジナルのリポジトリを各々の環境にコピー(git clone)し、ローカル環境で開発、変更履歴を記録していく。そしてオリジナルのリポジトリに変更を反映(git push)したり、他の人の変更した元々のリポジトリの変更をローカル環境に反映(git pull)して使います。
その際、お互いの変更が衝突することもあり、Gitが自動で直してくれるものもあれば、自分で直す必要が出てくることもあります。(git merge) 
参考:[Wikipedia](https://ja.wikipedia.org/wiki/Git)

とりあえずこんな"呪文"を使えば共同管理ができるというくらいでいいでしょう。次はGitHub。

## GitHub
GitHubはGitHub社が開発したソフトウェア開発用のウェブプラットホームで、コードのバージョン管理に先ほど述べたGitを使用しています。GitHubは最もポピュラーなGitホスティングサイトで、リポジトリを視覚的に把握できたり、SNS機能を持っていて、よりチームでの開発に使いやすくなっているものですね。
参考:[Wikipedia](https://ja.wikipedia.org/wiki/GitHub)

# ざっくりGitHubの使い方(共同使用を前提に)
とりあえずUnity関係なくGitHubの使い方を超ざっくりと説明していきます。
上でも述べましたが、以下では[GitHub Desktop](https://desktop.github.com/)を使った最も視覚的なやり方で全て説明します。gitコマンドを叩きたい方は予めご了承ください。

## リポジトリの作成
GitHub Desktopのアプリを起動し、"Create New Repository"を選択。
<img width="430" alt="スクリーンショット 2019-05-21 11.44.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/f98acd97-fcab-65aa-9dbe-488b51e0440a.png">
適当にリポジトリの名前をつけて、どこにディレクトリを作るか決める。
決めたら、今回はGit Ignoreの欄からUnityを選んでください。
Git Ignoreについては次の項で説明します。
<img width="398" alt="スクリーンショット 2019-05-21 11.54.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/1d2ebe3a-dbc7-fd31-4669-85b683bdaa48.png">

で、ライセンスって何やねん。公開を前提としていない場合はNoneでいいです。公開したい場合は、いい記事があったので割愛で。[ライセンスについての参考記事](https://qiita.com/shibukk/items/67ad0a5eda5a94e5c032)

できたリポジトリは現在ローカルにあります。これをGitHubにアップしましょう！
どっちでもいいので、`Publish repository`ってのをクリック。
<img width="895" alt="スクリーンショット 2019-05-21 12.03.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/11f492e7-b7c4-8838-843c-f1b943ee1385.png">
ここで注意する点は１つだけ。リポジトリを公開したくない場合は、`Keep this code private`欄にチェックを入れる、公開したい場合はチェックを外す。それだけです。

* 公開リポジトリ = `Public`
* 非公開リポジトリ = `Private`  

ですので、覚えておきましょう。ちなみに、公開非公開の設定はGitHubのサイト上でいくらでもできます。
リポジトリをPrivateにした場合は、inviteされたメンバーだけしかGitHubのサイト上でリポジトリを見ることができなくなります。されていないアカウントでログインした状態でURLを入力すると、404 Not Foundとなりますね。
(GitHub社を買収した後から、無料のアカウントでもPrivateのリポジトリが作り放題になったので、公開非公開は各自の目的や好みに合わせてください。)
<img width="445" alt="スクリーンショット 2019-05-21 12.04.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/063d422c-de95-7e1a-c696-2909176078ad.png">


## .gitignoreを使って容量削減
先ほど述べたGit Ignoreの説明をしますね。.gitignoreとは、**Gitの管理に含めないファイルを指定するためのファイル。** 先ほどのリポジトリ作成でGit Ignore欄でUnityを選ぶと、Unity用の.gitignoreのテンプレが作成されるわけです。これでUnityの大きなプロジェクトを毎回全部出したり入れたりしなくてもよくなります。
また、このファイルは書き込み可能で、ローカルで設定していてGitで管理したくないファイル等があれば、逐次追記することも。
具体的に先ほどのhogefugaリポジトリの.gitignoreを見てみましょう。

```txt:.gitignore
 [Ll]ibrary/
 [Tt]emp/
 [Oo]bj/ 
 [Bb]uild/ 
 [Bb]uilds/ 
 Assets/AssetStoreTools* 
  
 # Visual Studio cache directory 
 .vs/ 
  
 # Autogenerated VS/MD/Consulo solution ad project files |
 ExportedObj/ 
 .consulo/ 
 *.csproj 
 *.unityproj 
 *.sln 
 *.suo 
 *.tmp 
 *.user 
 *.userprefs 
 *.pidb 
 *.booproj 
 *.svd 
 *.pdb 
 *.opendb 
 *.VC.db 
  
 # Unity3D generated meta files 
 *.pidb.meta 
 *.pdb.meta 
  
 # Unity3D Generated File On Crash Reports
 sysinfo.txt 
  
 # Builds
 *.apk
 *.unitypackage
```
読み方ですが、

### コメントアウト
```
# "#"で始まる行はコメント
```

### ファイルを無視
```
# どのディレクトリかを問わず、hoge.txtを無視
hoge.txt
# .gitignore が置かれたディレクトリ内のhoge.txtを無視
/hoge.txt
```

### 特定のディレクトリ以下を無視
```
#bin以下を無視
bin/
```

### ワイルドカードを使った無視
.gitignoreでは、ワイルドカード「*」を使った書き方もできます。

### 特定の拡張子のファイルを全て無視する
```
#.exeファイルを無視
*.exe

# .htaccessと.htpasswdなど、.ht で始まるファイルを追跡しない
.ht*
```

上の.gitignoreファイルについての説明としてはこれくらいでしょうか。他にも、正規表現を利用して記入したり、一部のファイルだけを逆に含んだりすることもできます。
(参考：http://www-creators.com/archives/1662)

### 追記: gitignore.ioを使ってサボろう
[gitignore.io](https://www.toptal.com/developers/gitignore)にUnityと入力するだけ。
これだけでUnity用に網羅された.gitignoreファイルを作成してくれます。

## Unityでプロジェクトを作成、プロジェクトをリポジトリに
さあ、ここからが本題ですね。Unityを起動して、プロジェクトを作成してください。
(筆者がUnity Hubを使用しているため、以下はUnity Hubのスクリーンショットです。)
<img width="858" alt="スクリーンショット 2019-05-21 15.58.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/54d825b0-9a4f-4277-7c15-eb5cd29829bc.png">
もう一度GitHub Desktopに戻ると...めちゃくちゃ増えてる！
<img width="703" alt="スクリーンショット 2019-05-21 16.01.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/409a7e8a-5a02-1f66-68bb-192b51fcf31f.png">
これを下のSummaryに適当な名前をつけて`commit to master`してください。
そしてGitHubのリポジトリのページを開くと、先ほど作ったnew_projectが増えていますね。
<img width="745" alt="スクリーンショット 2019-05-21 16.08.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/ee6ffe79-890b-0100-d271-4d4332b2148c.png">

以下では、上画像の`Current Branch master`の意味も含めて解説します。

## ブランチを切る、Mergeする
ブランチとは、履歴の流れを分岐して記録するものです。master ブランチを幹として、枝のように生やしていきます。
分岐したブランチは他のブランチの影響を受けないため、同じリポジトリ中で複数の変更を同時に進めていくことができます。[ブランチについての参考記事](https://backlog.com/ja/git-tutorial/stepup/01/)
本番環境にそのままcommitするのは危険なので、修正を行う際は、各自で新しいブランチを作り、修正が終わればmasterブランチに合流`Merge`させてください。その際masterブランチと衝突`conflict`することがあります。Gitが自動で直してくれる場合とそうでない場合があるので、そうでない場合はGitHubのサイト上で自分でmasterの記述を削除する等して解決してください。

### ブランチを切る
では、新しいブランチを作る方から。新しいブランチを作って別作業を行うことを、慣例的に**ブランチを切る**と言います。
以下では、new_projectに赤い球体を追加する例を元に説明します。
画面上`Current Branch master`をクリック後、`New Branch`をクリック。
目的に合った感じの名前をつけたら、`Create Branch`をクリック。これで新しいブランチに切り替わります。
ここでは、masterブランチから切ります。
<img width="401" alt="スクリーンショット 2019-05-21 16.23.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/249136eb-1fdd-cbe3-976d-5a137c9de479.png">
あとは適当に赤いボールをUnity上で置いて...
<img width="1111" alt="スクリーンショット 2019-05-21 17.04.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/f64518f2-ae7a-1f5f-3057-7e15e8c49290.png">
そしたらGitHub DeskTopに何やら変更が記録されているので、さっきみたいに適当にSummaryを書いて、Commit to add/red/ballをクリック。
そしたらPublish Branchをクリック。ここまでの一連の流れを`push`と言います。
### マージする
GitHubのサイトに移りましょう。hogefugaリポジトリのトップページへいくと、先ほどのpushがサイト上に表示されていますね。今度はこの`Compare & pull request`をクリックし、masterブランチにadd/red/ballブランチの変更を取り込んでもらうように依頼します。これを`pull request`といいます。
<img width="985" alt="スクリーンショット 2019-05-21 17.08.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/7f6620a4-253d-b42b-8417-9608ab60d219.png">
Compare & pull requestをクリックすると先ほどGitHub Desktop上で記入したSummaryとDescriptionが反映されていると思います。追記しても構いませんが、まあ変更がわかるように書けたら画面右下`Create pull request`をクリックで。

あとは、作成されたpull requestのページを下までスクロールして、masterブランチとの衝突がないなら、`Merge pull request`をクリック。
<img width="767" alt="スクリーンショット 2019-05-27 13.49.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/af18aebc-bba6-5d93-a652-144b3a01881d.png">
これでmasterブランチに変更が反映されました!
<img width="776" alt="スクリーンショット 2019-05-27 13.50.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/e2bc03ff-ecfe-71fd-c0e1-fb1838a7cedd.png">

# 作ったリポジトリを別環境でcloneする
先ほどの管理しているリポジトリを他の場所にダウンロード`clone`してみましょう。
リポジトリのページを開いて、画面右`Clone or Download`をクリック。今回はGitHub Desktopを入れているので、`Open in Desktop`を選択するのが1番楽です。
<img width="439" alt="スクリーンショット 2019-06-08 16.08.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359997/a85b456a-14a5-5629-9177-0fa09aa8d578.png">
その後自分のローカル環境でリポジトリを置く場所を決めるだけ。
そしてUnityを起動してみましょう。hogefugaリポジトリ下のnew_projectがあるはずです。そして起動すると少し時間がかかりますが、開いて`Scenes/SampleScene`を選択。先ほど作った赤い球が!

あとは先ほどまでの説明の通り、ブランチを切って作業し、マージしての繰り返しです。
これだけでUnityを用いた共同開発ができます! それでは良い開発ライフを。