バージョン管理の設定

Unity Learnでバージョン管理についてのチュートリアル[^1]があったので，「個人的に」メモしておく．

[^1]: [Unity Learn Tutorial Set up version control](https://learn.unity.com/tutorial/set-up-version-control?labelRequired=true&pathwayId=5f7e17e1edbc2a5ec21a20af&missionId=5f751af7edbc2a0022cdbbb6)

# 概要

このチュートリアルの終わりには，できるようになっていること：

- プロジェクトを維持するために使用できる様々なバージョン管理ソリューションを確認すること．
- プロジェクトのメンテナンスにバージョンコントロールがどのように使われるかを説明すること．

## はじめに

プロジェクト開発において重要なことは，いかなる場合でも，プロジェクトファイルをどのように管理するかということ．
チーム開発のとき，全員がプロジェクトにアクセスする方法を決め，
ある人が行っている作業が他の人の作業に上書きされたり損害を与えたりしないようにする方法を決めなければならない．

幸い，これらの問題の解決策は，非常にシンプルで，**バージョン管理**である．

バージョン管理は敷居が高いと思われるかもしれませんが ，
多くの人が，初めて開発をはじめるときに，バージョン管理のアイデアに圧倒されるので，ご安心ください．

## バージョン管理とは？

**バージョン管理**とは，情報を管理と追跡するシステムのこと．

バージョン管理システムはクラウドストレージサービスと連携しているので，以下の便利な機能が利用できる：

- バックアップ用ストレージ
- リビジョントラッキング
- プロジェクト管理

このチュートリアルでは，ローカルストレージを使用するバージョン管理システムとは対照的に，
特殊なチーム事情に適したクラウドストレージを使用するバージョン管理システムについて学ぶ．

## バージョン管理は誰が使うの？

複数のチームメンバーが協調してプロジェクトやソフトウェアの開発に携わる場合，
バージョン管理システムを導入しないと管理が難しくなる．

みんなに必要なもの！

プロジェクトが複雑になればなるほど，チームメンバーは仲間の行う変更に常に対応する必要がある．
もし，一貫した調整を行わなければ，非効率，ボトルネック，コードの紛失，手直し，
そして，多くのフラストレーションに直面することになる．
バージョン管理の目的は，このような問題を回避することである．

## バージョン管理ツールの選択

Unityには，**Collaborate**という独自のバージョン管理ソリューションがあり，パッケージとして提供されている．
ここでは，非常にポピュラーなバージョン管理ソリューションである**Github**を使用する．
特にバージョン管理初心者の方にもおすすめ．

さらにシンプルにするために，Gitコマンドを使ったコマンドラインからではなく，
GitHubのプロジェクトにGUIでアクセスできる使いやすいアプリケーション，**GitHub Desktop**の使い方を案内する．

Unity CollaborateとHelix Core Perforceの紹介は割愛．

## GitHub Desktopを使い始める

GitHubのリポジトリを作成するには，GitHubの無料アカウントにサインアップし，
GitHub Desktopをインストールする必要がある.

設定する：

1. まだお持ちでない方は，[github.com](https://github.com/)で無料のGitHubアカウントにサインアップする．
1. [desktop.github.com](https://desktop.github.com/)でGitHub Desktopをダウンロードし，インストールする．  
(一応，お使いのOSに対応しているものをダウンロードすることに注意してください．)
1. インストール後，GitHub Desktopのアカウントにサインインする．
 - Windowsの場合， **File** > **Options** > **Account** を選択
 - Macの場合， **GitHub Desktop** > **Preferences** を選択

ログインやアカウントの認証についての詳細は，[GitHub documentation](https://docs.github.com/en/desktop/installing-and-configuring-github-desktop/installing-and-authenticating-to-github-desktop/authenticating-to-github)を参照してください．

まだ自分のアカウントにリポジトリが関連づけられていない場合は，このような画面が表示される．

![Let's get started!](https://connect-prd-cdn.unity.com/20210602/learn/images/36bb5893-9fe1-4ee1-84e2-d4add49cddef_36.png.2000x0x1.png "Let's get started!")

## ハードディスクに新しいレポを作成する

GitHubのリポジトリ(略称：レポ)とは，プロジェクトがあるフォルダのこと．
まず最初に，Unityプロジェクト用に設定された空のレポを作成する．

1. GitHub Desktopのウェルカム画面から， **Create a New Repository on your Hard Drive** を選択  
![Create a New Repository on your Hard Drive](https://connect-prd-cdn.unity.com/20210602/learn/images/6764e7d0-f47f-482c-8408-bafdc77b3b33_35.png.2000x0x1.png "Create a New Repository on your Hard Drive")  
GitHub Desktopのトップメニューから， **File** > **New Repository** をクリックすることもできる．

1. 表示される**Create a New Repository**ウィンドウで，リポジトリの設定を行う．
 - "Jr-Programmer-Project"のような**名前**を付ける．
 - レポを保存する**ローカルパス**を選択する．  
そこに先ほど入力した名前のフォルダが作成される．  
<br/>
**Git Ignore**ドロップアウトから，**Unity**オプションを選択する．  
これは，バージョン管理に保存したくないすべてのファイルタイプをリストアップした.gitignoreファイルを，
リポジトリにあらかじめ設定したもの．  
<br/>
(補足)  
この段階で無視したいファイルタイプを.gitignoreに追加しておくことを強く推奨します．  
後から追加するとちょっと面倒なことになるからです．  
僕の場合，.gitignoreに.logを追加しています．  
他にも無視したほうがよさげなファイルタイプがあればコメントで教えてくださると助かります．  
![Create a New Repository](https://connect-prd-cdn.unity.com/20210602/learn/images/c6b7b572-aab5-4686-8518-9265d07e61e1_34.png.2000x0x1.png "Create a New Repository")

1. **Create Repository** を選択する．
これで**Current Repository**ドロップダウンが新しいリポジトリに設定される．
メインウィンドウで，現在"No local changes"と表示されているのは，まだ編集していないから．  
![Create Repository](https://connect-prd-cdn.unity.com/20210602/learn/images/ea6959ff-1698-4531-bfaa-b35f29aeeddd_33.png.2000x0x1.png "Create Repository")

1. 先ほど作成したフォルダーを開いてみる．
以下の3つの隠しファイルが含まれている：
 - .git folder
 - .gitattributes
 - .gitignore  
![Jr-Programmer-Project](https://connect-prd-cdn.unity.com/20210602/learn/images/7ba075e3-b5f9-4756-9d53-8e228387eec1_32.png.2000x0x1.png "Jr-Programmer-Project")  
.gitフォルダはこれがGitHubのレポであることをGitHubに伝えるもの．  
.gitignoreと.gitattributresは，レポの設定を指定するもの．  
<br/>
GitHubに追跡させるために，次のステップでは，このフォルダに実際のUnityプロジェクトを配置する．

## ダウンロードし，開いて，プロジェクトの追跡を開始

Unityプロジェクトを追加して，初めて開いてみよう．

1. [プロジェクトのzipフォルダをダウンロード](https://learn.unity.com/tutorial/set-up-version-control?labelRequired=true&pathwayId=5f7e17e1edbc2a5ec21a20af&missionId=5f751af7edbc2a0022cdbbb6#60b7e980edbc2a0021573640)して解凍して開いてみてください．
(ファイルのダウンロードは怖いと思うので，このリンクから元記事にとんでダウンロードしてきてください．)
その中に，以下のフォルダが含まれる：
 - Assets
 - Packages
 - ProjectSettings

1. **Ctrl + A**(Windows)または**Cmd + A**(Mac)を使って3つのフォルダをすべて選択し，コピペしてください.
これで，このフォルダをUnityのプロジェクトとして開くことができる．  
![Ctrl + A](https://connect-prd-cdn.unity.com/20210602/learn/images/479a21ec-b495-4cd4-8e1a-cfce7b195274_31.png.2000x0x1.png "Ctrl + A")

1. プロジェクトのレポフォルダをUnity Hubに追加し，Unity Editorでプロジェクトを開く．
<br/>
なお，Unityの正しいバージョンをインストールするように促される場合がございますので，ご了承ください．
![Add your project repo folder to Unity Hub](https://connect-prd-cdn.unity.com/20210602/learn/images/b122f80e-f704-4ffa-b84a-1b62c1dd552b_30.png.2000x0x1.png "Add your project repo folder to Unity Hub")

1. Github Desktopウィンドウの**Changes**パネルに新しいファイルの長いリストが表示され，
各ファイルの横に新しいファイルであることを示す小さな緑のプラス(+)アイコンが表示されるようになった．  
![Changes](https://connect-prd-cdn.unity.com/20210602/learn/images/a6883d48-b760-4e86-b888-a70abc96f953_29.png.2000x0x1.png "Changes")

これでプロジェクトのバージョン管理ができるようになった．
このプロジェクトに加えたすべての変更は，GitHubによって追跡される．

## 最初のコミットを行い，レポを公開する

レポにコミットする最初のファイル群は，**イニシャルコミット**に含まれることになる．
通常最初のコミットはプロジェクトを最初にセットアップした後に行うので，やっていく．

1. レポに表示された変更の下にある**Summary**フィールドに，"Initial commit"と入力し，**Description**を記入する．  
それから，**Commit to main**ブランチに変更が保存される．  
ブランチについては後述する．
![Summary](https://connect-prd-cdn.unity.com/20210602/learn/images/f2b914bf-ab34-4f3b-834d-fe2a599ccc6a_28.png.2000x0x1.png "Summary")  
**Commit**をクリックすると，バージョンコントロールに安全に格納されたので，リストにあるすべての変更が消えるはず．
<br/>
万が一に備えて，プロジェクトをクラウド上にバックアップしておく．

1. GitHub Desktopのインターフェースから，**Publish Repository**を選択する．
![Publish Repository](https://connect-prd-cdn.unity.com/20210602/learn/images/3837f369-9417-4d22-a0cf-39aaeded3584_27.png.2000x0x1.png "Publish Repository")

1. 開いたウィンドウで，プロジェクトの名前と，コードを公開するか非公開にするかを確認する．
そして，**Publish Repository**を選択する．
![Publish](https://connect-prd-cdn.unity.com/20210602/learn/images/7cc3c958-388e-432f-906b-b6a216bd9090_26.png.2000x0x1.png "Publish")

1. GitHub.comにバックアップされ公開された自分のリポジトリを見るには，GitHub Desktopのトップメニューから
**Repository** > **View on GitHub**を選択する．

他にもさまざまなことができるので，探索してみてはいかがでしょうか．

## バージョン管理はどのように行われるの？

### プッシュとプル

プロジェクトに加えた変更をクラウドのリポジトリ経由で保存し，その変更内容を記録したメモを添付する．

つまり，プロジェクトの最新バージョンを**プル**(ダウンロード)して開き，ローカルで変更を加え，
その変更をクラウドリポジトリに**プッシュ**(アップロード)することができるようになる．

### 変更点のマージ

複数人が同じプロジェクトで同時に作業している場合，同じファイルに対して異なる変更を加えることがある．
バージョン管理では，プロジェクトファイルを管理し，**マージ**と呼ばれる処理ですべての変更点を結合し，統一する．
時には，**マージの競合**が発生し，開発者は，競合を解決する必要がある．

### 以前のバージョンに戻す

バージョン管理の大きなメリットの一つは，時間の経過に伴うすべての変更点を把握できること．
何らかの変更が競合するときや，以前のバージョンに戻すことが最善であると判断されたとき，
いつでもプロジェクトの以前のバージョンに戻り，復元することができる．

## 最後に

バージョン管理は，あらゆる開発者にとって，大きなメリットがある．
敷居が高いと思われるかもしれませんが，
バージョン管理システムは，作業しながらプロジェクトを維持するための強力なツールである．

学んだこと：

- バージョン管理の基本的な理論
- GitHubのエコシステムの中で働くために自分自身をセットアップすることで，
その理論を実装した．

僕も，はじめは，とっつきにくいなと感じていましたが，初心者の僕でさえちょっとは使えていると思うので，
まだGitHubでバージョン管理をしていない方はぜひやってみてください！
このチュートリアルで説明されていないことも多くあるので，興味のある方はGitHubをいろいろいじってみてください！