~バージョン管理を始めよう~gitの導入からバージョン管理を行うまで

## はじめに
プログラミングをしていて、こういう時があると思います。

* プログラムを書いていて、ちょっと前の状態に戻りたい！ってなっても手遅れ...
* 複数人での開発でソースコードをどうやって管理しよう？
* 機能別に担当を分けたけど、ソースコードを合わせる時に手間がかかる...

そういう時にgitを使うと、とても便利になります。

この記事で扱う内容は以下の通りです。

* gitのインストール
* GitHubのアカウント作成
* gitでバージョン管理
* ソースコードをリモート環境にあげる

## gitとは
まずはgitとは何か説明します。

> gitは、プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムである。
[git|Wikipedia](https://ja.wikipedia.org/wiki/Git)

ちょっとよくわかりませね。

**「一言で言うと」**：ソースコードのバージョンを管理できて、さらにソースコード同士を合わせることができるシステムです。

### gitにおけるバージョン管理の概念
それではgitの概念を図を使って説明します。
![Untitled Diagram2 (1).png](https://qiita-image-store.s3.amazonaws.com/0/107472/74b2b921-4615-b63d-5d76-93879821e919.png "Untitled Diagram2 (1).png")
ソースコードは、ファイル作成を行い、コードを書き、各種機能を実装する。このような流れで現在のソースコードが生み出されていると思います。

**この中におけるソースコードのバージョンとは**

 * 日本語入力に対応した
 * 〜の関数を追加した
 * 〜する機能を実装した
 * コードが汚かったのでリファクトした

などなど色々な状態があると思います。
gitのバージョン管理はこのような変更点をコミットという区切りでバージョンを作っています。
図で言うと、現在のソースコードはVersion4 のコミットの状態です。
**もしリファクトが失敗してリファクト開始時にコードを戻したい時**にはVersion3のコミットに戻るとそれができます。
gitではコミットを自分で付与することで、ソースコードのバージョンを生み出し、それを管理することができます。

### gitにおけるローカル環境とリモート環境
次はgitにおける重要な概念であるローカル環境とリモート環境について説明します。

![Untitled Diagram.png](https://qiita-image-store.s3.amazonaws.com/0/107472/051b941f-38fa-1025-cfd2-c0ad15f3504a.png "Untitled Diagram.png")

* ローカル環境は自分のPC
* リモート環境はWeb上

という認識で問題ありません。
コードを書いているということは、主にディレクトリの中にソースコードが複数ファイル入っている状態だと思います。(一つだけのファイルでも考え方は同じです。必ずディレクトリに入っているはずです)
gitでは、ディレクトリを対象にバージョン管理が行われます。その対象を
**リポジトリ**と呼びます。

gitはローカル環境(自分のPC)だけでもリポジトリを対象に作業はできるのですが、バックアップやオープンソース、チーム開発を簡単にできるなどの利点からリモート環境(ネット上)を使って作業をすることが多いです。
gitは簡単にリモート環境にローカル環境にあるリポジトリをあげることができます。

**これまでの内容を復習しましょう。**

**「一言で言うと」**：gitを使ったバージョン管理では、ソースコードに対してコミットを行うことでバージョンを管理して、それをリモート環境にあげることで管理を行っている。

## gitの導入
ではさっそくgitを導入する手順を踏んでいきます。
### gitのインストール
まずはgit自体をインストールしましょう！

Windowsの人は以下のリンクからgitをダウンロードしてインストールしましょう。
[git for windows](https://git-for-windows.github.io)

Macの人は元からgitがインストールされています。

```
$ git --version
```

上記コマンドでバージョンが確認できたらgitの導入は完了です。

### GitHubのアカウント作成
gitにはリモートリポジトルを管理するgitのホスティングサービスがいくつか用意されていて、便利です。
普通はどれかのサービスを使います。

* [GitHub](https://github.com)
* [Butbucket](https://bitbucket.org)
* [gitLab](https://about.gitlab.com)

以上の3つが代表的な例です。

それぞれ特徴があるので、自分たちのチームに合わせて使い分けましょう。一番有名なのはGitHubです。
[参考](http://www.find-job.net/startup/5-git-hosting)

**今回はGitHubで管理をします。**

以下のリンクを参考にGitHubのアカウントを作成しましょう。
[GitHubの登録について](http://qiita.com/kooohei/items/361da3c9dbb6e0c7946b)

これでgitでのソースコード管理の準備は整いました。

## gitコマンド
実際にgitはWindowsならgit bashまたはコマンドプロンプト(コマンドプロンプトを利用する場合はgitインストール時に設定をする必要があります)、macならターミナルを用いてgitコマンドを入力してgitの機能を利用します。

以下のリンクを参考にいくつかコマンドを見てみてください
[gitコマンド](https://osdn.jp/magazine/09/03/16/0831212)

非常にコマンドが多くて覚えれない！と思うと思いますが実際に使うのは一部です。
次で実際に使うコマンドを混ぜながら、gitでのバージョン管理を行いましょう！

## gitでのバージョン管理
さっそくgitでソースコードを管理しましょう。
![Untitled Diagram3.png](https://qiita-image-store.s3.amazonaws.com/0/107472/17e56497-a806-5bc8-889a-4802c8f5a3fa.png "Untitled Diagram3.png")


簡単な流れを上記の図に示します。
**「一言で言うと」**：リポジトリを作成して、コミットを重ねる、ある程度コミットがたまるとプッシュする。

gitはローカル環境に3つの段階にソースファイルが存在する場所が分けられています。
変更を加えたファイルは最初ワークツリーに存在します。

* (ワークツリー)変更を加えたファイルをステージングエリアに追加 (add)
* (ステージングエリア)addされたファイルをローカルリポジトリに登録 (commit)
* (ローカルリポジトリ)コミットで登録された情報をリモートリポジトリに追加(push)

addとcommitは主に連続で行うので、セットと考えてください。

それでは詳しい流れを見せていきます。

1.GitHubでリモートリポジトリ作成(GitHubのページ)
![kobito.1479090942.868435.png](https://qiita-image-store.s3.amazonaws.com/0/107472/fe775539-153c-d313-f12d-78901b2c7c3e.png "kobito.1479090942.868435.png")

2.コマンドでローカル環境にリポジトリ作成(ターミナル、GitBash)

```
$: git init
```

3.管理するフォルダをGitHubのリモートリポジトリに登録(ターミナル、GitBash)

```
$: git remote add origin https://github.com/[ユーザー名]/[リポジトリ名].git
```

4.ソースファイルを変更する

5.ファイルの作成/変更/削除など、変更を加えたファイルをステージングエリアに追加(ターミナル、GitBash)

```
$: git add .
```

6.addされたファイルをローカルリポジトリに登録(ターミナル、GitBash)
※コミットにはどのようなバージョンなのかを分かりやすくするためにコメントを付けます。

```
$: git commit -m "コメント"
```

7. 4.→5.→6.の作業を繰り返す(ある程度作業が一区切りついた場合は8.へ)

9.ローカルリポジトリをプッシュしてリモートリポジトリへ反映させる(ターミナル、GitBash)

```
$: git push -u origin master
```

GitHub上の自分のリポジトリを確認してみるとソースコードが上がっていますね。
以上の作業で無事にバージョン管理されたソースコードをリモート環境にあげることができました！

以上