Gitの基本

## Git
Gitは、プログラムのソースコードなどの変更履歴を記録・追跡するためのバージョン管理システムです。バージョン管理とは、その名の通り、複数存在するソースコードのバージョンを管理するためのものです。このGitを使用することによって、変更履歴をさかのぼってソースコードを元の状態に戻す事ができ、複数人での共同開発も可能になります。

チームでの共同開発をする上で、もはやGitは欠かせない存在となっています。プログラマーというとコードを書いているイメージがあるかと思いますが、それ以前にGitなどのバージョン管理ツールが無ければ仕事になりません。ぜひ、ここで基礎を押さえておきましょう。

### Gitにおける開発の流れ
まずは基本的な用語から押さえておきましょう。Gitがバージョン管理下におく場所を「リポジトリ」と言います。リポジトリには「ローカルリポジトリ」と「リモートリポジトリ」があります。ローカルリポジトリは自分のパソコン内にあるリポジトリ、リモートリポジトリはネット上にあるリポジトリと覚えておきましょう。リモートリポジトリに関しては、後ほど詳しくご説明いたします。

ユーザが変更の履歴を保存することをコミット（commit）と言います。これはGitの持つ機能の中でも特によく使用するので、ぜひ覚えておいてください。コミットは実行した順番で記録されるので、時系列に沿って変更履歴を追う事ができます。そのため、過去にどういう変更を行ったのかを簡単に確認する事ができるのです。

また、コミットをする際にはコミットメッセージという形でメモを残す事ができます。例えば、「デザインの変更をしました」とか「データベースへの登録処理を追加しました」といったメモを残す事ができるというわけです。それによって、より変更履歴の理解が容易になります。

複数人での開発を行う際は、この「コミット」と「コミットメッセージ」を利用し、誰がみても理解できるような変更履歴を作成し、任意の履歴に遡ることができるよう心がけましょう。

### 同時並行で複数の開発を可能にする機能
Gitには、複数の開発を同時並行することができる機能があります。例えば、Aさんはデータの登録を行う処理を実装し、Bさんはデータの表示形式を綺麗にするという実装をするとします。そのとき、2人で同じファイルを編集すると、とても効率が悪くなります。その問題を解決するための機能が「ブランチ」です。ブランチとは、文字通り開発を枝分かれさせる機能のことで、これを使用することによってAさんとBさんの開発を別々のものとして扱うことができます。

例）
Aさん　→ ブランチA
Bさん　→ ブランチB

### ローカルリポジトリとリモートリポジトリ
前述でGitのバージョン管理下にある場所をリポジトリというというお話をしました。その中でも、ネットを介してどこからでも利用できるようにしたリポジトリのことをリモートリポジトリと言います。それとは逆に、自分のパソコン内にあるリポジトリのことろローカルリポジトリと言います。複数人での開発を行うときは、リモートリポジトリを複数のプログラマーで共有し、そのリモートリポジトリのクローンをそれぞれのプログラマーがローカルリポジトリにコピーして開発を行うというスタイルになります。これによって、１つのプロジェクトを複数人で開発することが可能になるわけです。

### SourceTree
通常、GitはターミナルやコマンドプロンプトなどのCUIで操作をするものです。つまり、コマンドだけを打ってバージョン管理を行うということですね。しかし、それだと初心者の方にはハードルが高い。というわけで、視覚的にGitを操作できるようにしたのがSourceTreeというツールです。こちらを使用すれば、初心者の方でも簡単にGitでのバージョン管理を行えるようになります。ちなみに、SourceTreeのようにグラフィックが充実していて視覚的に操作できる画面のことをGUIと言います。今回は、このSourceTreeを利用してGitを操作し、バージョン管理の方法を練習していきましょう。

### バージョン管理の流れ
Gitでのバージョン管理は基本的に以下のような流れになります。

- ローカルリポジトリの作成（git init）
- 変更ファイルをインデックスにあげる（git add）
- 変更履歴を保存する（git commit）

### ローカルリポジトリを作る
まずターミナルを開き、リポジトリを作成したいディレクトリに移動しましょう。その際、`cd`コマンドを使用し、ディレクトリ間の移動を行います。

```
cd 移動したいディレクトリ名
```

ホームディレクトリ直下の`sample`ディレクトリに移動したい場合は以下のコマンドを実行します。

```
cd sample
```

以下のように入力すると、複数のディレクトリ感を一気に移動できます。

例）ホームディレクトリから`hoge→fuga→hogehoge→fugafuga`と一気に移動したい場合

```
cd hoge/fuga/hogehoge/fugafuga
```

cdコマンドを利用してローカルリポジトリを作成したいディレクトリに移動できたら、`git init`というコマンドを実行します。このコマンドで、ディレクトリ内に中身が空のローカルリポジトリを作成します。また、すでにリポジトリが存在している場合に`git init`を実行しても、既存のリポジトリがリセットされるわけではないので心配ありません。

```
git init
```

## gitの構成
詳細な説明に入る前に、まずはGitがファイルの状態を保存する場所についてご説明します。実は、Gitにはファイルを保存するための場所がいくつかあります。その構成は以下の通りです。

1. ワーキングツリー（今作業しているファイルのある場所）
2. インデックス（コミットするためのファイルを登録する場所）
3. ローカルリポジトリ（リモートリポジトリに変更内容を送信するための場所）
4. リモートリポジトリ（複数人でファイルを共有するための場所）

`git init`実行後、現在作成したファイルの変更履歴を保存するために`git add .`を実行します。このコマンドは、現在開発しているプロジェクトの中で変更があったファイルを見つけてインデックスに上げ、変更履歴を保存するための準備をしてくれます。要するに、「変更した全てのファイル」を「Gitによってバージョン管理するための対象」に入れるということです。それでは、`git add .`を実行しましょう。

```
git add .
```

ちなみに、`git add .`は変更したファイルをまとめてインデックスにあげるためのコマンドになります。そのほかにも、特定のファイルのみをインデックスに上げるコマンドもあります。その場合は、以下のコマンドを実行します。

```
git add ファイル名
```

`git add`コマンドは、後ろに`ファイル名`を入力することによって、特定のファイルのみをインデックスに上げることもできます。

例） sample.rbというファイルのみをインデックスに上げる場合のコマンド

```
git add sample.rb
```

### 変更履歴を保存する
変更履歴を保存するには、`commit`というコマンドを実行します。このコマンドを実行すると、ローカルリポジトリの変更内容を保存します。

また、`commit`を実行する際には`git add`において変更済みのファイルがインデックスにあることが必須となります。もし変更済みのファイルがインデックスにない場合は、`commit`するものが無いというメッセージが表示されます。

```
nothing to commit, working tree clean
```

`commit`を実行する際は、以下のコマンドを入力します。`-m`や`--message`オプションをつけることによって、コミットに対するコメントを残すことができます。これにより、各コミットにおいてどのような変更が行われたのかを把握しやすくすることができます。

```
git commit -m "init commit"
```

### ブランチを作成する
ブランチとは、複数の開発を同時並行して行うために必要な仕組みです。変更履歴の管理を分岐させることによって、各プログラマーで別々の機能を実装する事ができます。「ブランチ」という名前の通り、開発を枝分かれさせるという事ですね。そのブランチを作成するには、以下のコマンドを実行します。

ブランチは、他のブランチに合体（マージ）させる事で、一つにまとめる事ができます。`master`と呼ばれるブランチが存在し、開発用に分岐させた他のブランチは、最終的にこの`master`にマージさせるというのが、一般的な開発の流れです。

```
git branch ブランチ名
```

`git branch`の後ろに任意のブランチ名をつける事によって、その名前で新しいブランチを作り出す事ができます。例えば、`sample`という名前のブランチを作成したいときは、以下のようにコマンドを入力します。

```
git branch sample
```

現在存在するブランチを確認したい場合は、`git branch`を実行するだけで大丈夫です。

```
git branch
```

### ブランチをマージする
開発が完了したブランチを他のブランチに合体することをマージと言います。今回は、`sample`ブランチから`master`ブランチへマージする例を見て見ましょう。

まず、今存在しているブランチを確かめます。

```
git branch
```

出力結果

```
* sample
  master
```

`sample`ブランチから、`master`ブランチへと切り替えます。その際、使用するコマンドは`checkout`です。

```
git checkout master
```

次に、`merge`コマンドを利用して、`sample`ブランチを`master`にマージさせます。これでマージは完了です。

```
git merge sample
```