バージョン管理されていないシステムをバージョン管理していく

--------------------

0. はじめに
--------------------

こちらのドキュメントは [事業者向けホームセンター モノトス](http://www.monotos.co.jp/) の開発を進めるにあたり、コードのバージョン管理を行う必要があり、
社内メンバにバージョン管理の仕組みについて説明するために作成したものです。


1.バージョン管理の目的
--------------------

<a href="http://qiita.com/MasayaMizuhara/items/9503eb66d3125d8c5f41" target="_blank">svn - バージョン管理の目的 - Qiita</a> より引用させていただきました。

> バージョン管理システムを使う ( 主な ) 目的は下記の 4 つだと思う。
> 
> * 以前の状態に戻る
> * 変更履歴を調査する
> * プロジェクトを管理する
> * 変更者と変更理由を知る
> 
> 以下で順を追って説明する。

元々は航空機の部品管理に由来。  
（ネジの装着ミスによりフロントガラスが吹っ飛んだ事件の教訓だったと思います。。）


2.バージョン管理のためのツール
--------------------

ファイル名に **.yyyymmdd** など、変更日をつけて履歴管理することもできますが、すぐに履歴ファイルでいっぱいになってしまいます。
そのため、多くの場合はツールを利用します。

2016-01-08 現在、よく利用されている（あるいはいた）ツールをあげておきます。

* vss（Microsoft）
* CVS
* Subversion
* Mercurial
* **Git**

**LinuxやPHP、その他有名なOSSのソースコードがGitで管理されるようになってきており、
今後よく利用されるツールはGitでほぼ間違いありません。**
**バージョン管理の一般常識として覚えておくべきツールです。**


3.バージョン管理に必要なもの
--------------------

1. サーバー
    * すべての変更履歴を中央集中管理するためのサーバー。
    * **リポジトリサーバー** と呼ばれる
    * 公開しても問題ないアプリケーションの開発でよく利用されるのが [GitHub](https://github.com/) というサービスになります。
2. クライアント
    * ソースコードやイメージファイル、設計書などをバージョン管理の対象として追加したり削除したりするために必須
    * 導入には [Atlassian SourceTree](http://sourcetreeapp.com/) というツールがおすすめ
        - GUI
        - 変更の履歴がツリーで表示され、見やすい
        - Windows、Macなど、クライアント環境を選ばない
3. アカウント
    * リポジトリサーバーにだれでもアクセスできてしまうとソースコード資産が他者に利用されてしまう
    * 閲覧権限を絞るために、アカウントごとに**閲覧の可否**を設定する
    * **編集の可否**も設定する


4.モノトスのソースコードはどうやってリポジトリサーバーから取得するの？？
--------------------

_以降の操作では、基本的にSourceTreeを利用し行うものとしました。_

**clone** と呼ばれる操作を行います。  

GUI上は、**「＋新規リポジトリ」**というボタンを押します。

<img src="http://lh5.ggpht.com/-at5wFK04QJ4/VGA9dJV82YI/AAAAAAAAau4/2u39K6lPYAo/s800/vcm00.png" width="800px" />


**ソースURL**（あるいは、リポジトリURLと呼ばれる）には、リポジトリサーバーが提供する**プロジェクト**ごとのURLを設定します。  
**詳細は後述。**

<a href="http://lh5.ggpht.com/-xQG_jYbWZ68/VGA9hSlj9XI/AAAAAAAAavA/azo4ycEKiDc/s800/vcm01.gif" target="_blank">
<img src="http://lh5.ggpht.com/-xQG_jYbWZ68/VGA9hSlj9XI/AAAAAAAAavA/azo4ycEKiDc/s800/vcm01.gif" width="800px" />
</a>


5.ソースURLはどうやって確認するの？？
--------------------

<a href="http://codebreak.com" target="_blank">codebreak;</a> にアクセスし、確認します。

*2016-01-08 現在、 codebreak はサービス提供終了間近となっています。残念です。* 


事前にアカウントを取得し、ログインが出来るようにしておきましょう。

<a href="http://lh6.ggpht.com/-C8bCpC6W2bk/VGA9k30C3jI/AAAAAAAAavI/6mP_S34tlJY/s800/vcm02.png" target="_blank">
<img src="http://lh6.ggpht.com/-C8bCpC6W2bk/VGA9k30C3jI/AAAAAAAAavI/6mP_S34tlJY/s800/vcm02.png" width="800px" />
</a>


6.新規にプロジェクトを作成するにはどうするの？？
--------------------

1. <a href="http://codebreak.com" target="_blank">codebreak;</a>にログインし、**新規リポジトリの作成**を行う
2. **リポジトリ一覧**ページに表示されていることを確認し、**設定**ページヘ
3. ソースURLをコピー
4. **SourceTree**にて、作業用PCに**clone**する

*2016-01-08 現在、 codebreak はサービス提供終了間近となっています。残念です。* 

_はじめは空っぽ_

<a href="http://lh6.ggpht.com/-d6PP4QcVuMA/VGA9rL7ZFaI/AAAAAAAAavY/2MqkfZgC4_M/s800/vcm03.png" target="_blank">
<img src="http://lh6.ggpht.com/-d6PP4QcVuMA/VGA9rL7ZFaI/AAAAAAAAavY/2MqkfZgC4_M/s800/vcm03.png" width="800px" />
</a>


7.ファイルを追加するには？？
--------------------

**add** + **push**という操作を行います。

* **add** : ファイルに対して、間違いなく追加（あるいは変更、削除）を行ったことを確認する操作
* **push** : addマークを付けたファイルを**リポジトリサーバー**にアップ

**push**の際には、必ずどのような目的で変更を行ったかをコメントとして入力しましょう！   
（この点がバージョン管理で成功するプロジェクト、失敗するプロジェクトの命運を分ける）


<a href="http://lh5.ggpht.com/-22OCz8F0AY0/VGA9wV2LjZI/AAAAAAAAavg/QA4mBwV5_M0/s800/vcm04.png" target="_blank">
<img src="http://lh5.ggpht.com/-22OCz8F0AY0/VGA9wV2LjZI/AAAAAAAAavg/QA4mBwV5_M0/s800/vcm04.png" width="800px" />
</a>

**masterブランチ**を見ると、追加されていることがわかります。

* **masterブランチ** : メインブランチとも呼ばれる。変更履歴のメインストリーム。。
    - master以外のブランチ（幹）を作成することも可能
    - 中二病風に言うと、**複数の世界線**が作成できる

<a href="http://lh3.ggpht.com/-E5_9ia4i6Vk/VGA9zIR-PhI/AAAAAAAAavc/SdVarzMrBrk/s800/vcm05.png" target="_blank">
<img src="http://lh3.ggpht.com/-E5_9ia4i6Vk/VGA9zIR-PhI/AAAAAAAAavc/SdVarzMrBrk/s800/vcm05.png" width="800px" />
</a>


8.ファイルを変更するには？？
--------------------

**add** + **push**という操作を行います。

<a href="http://lh5.ggpht.com/-GYDVtqIdDMA/VGA91j8qK0I/AAAAAAAAavw/OsYFpwLn6sU/s800/vcm06.png" target="_blank">
<img src="http://lh5.ggpht.com/-GYDVtqIdDMA/VGA91j8qK0I/AAAAAAAAavw/OsYFpwLn6sU/s800/vcm06.png" width="800px" />
</a>



9.変更を取り消すには？？
--------------------

**revert**という操作を行います。

<a href="http://lh5.ggpht.com/-9ERWQQtKitI/VGA94c6fTJI/AAAAAAAAav0/lsMkLNP3zX4/s800/vcm07.png" target="_blank">
<img src="http://lh5.ggpht.com/-9ERWQQtKitI/VGA94c6fTJI/AAAAAAAAav0/lsMkLNP3zX4/s800/vcm07.png" width="800px" />
</a>


10.その他（機能の一部紹介）
--------------------

**branch** 、 **merge** 機能を利用して、複数の世界線を活用します。


<a href="http://lh5.ggpht.com/-ceHq2hwvoOA/VGA9-UgPF9I/AAAAAAAAav8/Sh3SwcgCqAQ/s800/vcm08.png" target="_blank">
<img src="http://lh5.ggpht.com/-ceHq2hwvoOA/VGA9-UgPF9I/AAAAAAAAav8/Sh3SwcgCqAQ/s800/vcm08.png" width="800px" />
</a>