【初心者向け】GITとは何か？GITの概念を解説

##GITとは？
難しい言い方をすれば「**分散型バージョン管理システム**」です。
と言ってもややこしいので、一旦言葉だけでも頭の片隅に置いておき、もっとわかりやすく解説します。

簡単な言い方に変えると、「**ファイルのバージョン管理が簡単にできるツール**」です。
バージョンとは、ファイル（htmlファイルやcssファイルjsファイル etc...）を編集して、更新した履歴だと思ってください。
![グループ 97.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/927e453b-1303-37e1-43e7-37387baa74ce.png)

```text:ポイント
・ GIT = ファイルのバージョン管理が簡単にできるツール
・ バージョン管理 = 履歴の管理のこと
```


**誰が、どのファイルに、何を書き込んだのか、何を削除したのか、編集前とどう変わったのか**を**バージョン（履歴）**として残しておき、それをずっと残しておき、いつでも確認し、必要であればそのバージョンまで戻すことも可能です。
つまり、バックアップなどを取る必要もなくなります。

##Gitで何ができるのか？
Gitを導入することで得られるメリットは多くありますが、わかりやすい例でいうと以下になります。

```text:メリット
・以前のバージョンにファイルを戻せる = いつでもバックアップに復元できる
・複数人で同じファイルを編集して、それを統合できる = 同じファイルを触っても上書きにならない
・履歴を複数人で共有できる = 誰が、いつ、どのファイルに、どんな編集をしたかが管理できる

```

##Gitの概念
Gitの管理構造は下記の図のようになっています。
![グループ 95.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/3513e12b-c675-7164-576a-b7f7409b6a50.png)


##リポジトリについて
Gitを知る上で必ず覚えておく必要があるのが、「**リポジトリ**」という言葉です。
リポジトリとは、ファイルや履歴を保存するための**ストレージ**のことで、簡単に言うと**保管庫**のようなものです。

Gitにはこのリポジトリが２種類あります。

・**リモートリポジトリ**（webサーバー上に存在）
・**ローカルリポジトリ**（ローカルのPC上に存在）

![グループ 105.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/bc86d149-54da-6cbf-fe46-2ff6e9c2af37.png)


リモートリポジトリはWeb上に置かれており、一つのGitシステムに一つ設置して、各ユーザー共通で使用します。
ローカルリポジトリは各ユーザーがPC上に持っています。

```text:ポイント
・ リポジトリ = ファイルや履歴を保存するための保管庫のこと。
・ Gitにはリモートリポジトリとローカルリポジトリが存在する。
・ リモートリポジトリはWebサーバーに置かれており、共有で使用する。
・ ローカルリポジトリは各PCの中に置かれており、各ユーザーごとに使用する。
```

##基本の4つのアクションを覚えよう（add・commit・pull・push）
「**add**」「**commit**」「**pull**」「**push**」
GITを扱う上で、この4つのアクションとその意味を覚えておけば、GITの基礎は60%くらい理解したことになります。
なので、この3つの言葉の意味について説明します。

![グループ 95.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/3513e12b-c675-7164-576a-b7f7409b6a50.png)

###add
addとは上の図にあるように、コミットを行う前の準備みたいなもので、ファイルを編集したことをインデックスに登録する作業です。
簡単に言うと履歴を残す前の仮登録のようなものです。
ツールを使ってGitを操作する場合は、このaddの作業は自動で勝手にやってくれる事がほとんどです。
まあ、履歴を残す前の準備みたいに捉えてください。

###commit
commitは、addを行ったと後に、自分のローカルリポジトリに作業内容の履歴を保存する作業のことです。
コミットを実行するとファイルを編集した内容・日時・作業者を記録したファイルが生成されて保存されます。

###pull
pullは、共有している**リモートリポジトリ**に保存されているファイルの中で、自分のローカルリポジトリに存在しないファイルや、他のユーザーが更新したファイルのみをダウンロードする機能です。
つまり他の人の作業した履歴を自分のローカルリポジトリのファイルに反映させる作業です。

###push
pushは、自分の**ローカルリポジトリ**にあるファイルを**リモートリポジトリ**にアップして保存する作業です。
自分のローカルリポジトリにある内容を、リモートリポジトリにアップ・反映させる感じです。

自分がpushして、更新したリモートリポジトリを、他のユーザーがpullして落としてくるといった形で、リモートリポジトリを共有しています。

###「add・commit・pull・push」の流れ
【1】自分の手元でファイルを編集する。
【2】編集したファイルを**add**でインデックスに登録。
【3】インデックスに登録した内容を**commit**して、履歴として、ローカルリポジトリに保存する。
【4】ローカルリポジトリをリモートリポジトリに登録する時に、他のユーザーがリモートリポジトリを更新していた場合、一旦pullでリモートリポジトリの内容を、ローカルリポジトリに落としてくる。
※リモートリポジトリが更新されていない場合は、pullは不要です。
【5】リモートリポジトリの内容をローカルリポジトリに取り込んだ後で、ローカルリポジトリの内容を、リモートリポジトリにpushして保存する。

##すでにGit管理されているところに参加する方法
すでにGit管理されているところに自分も参加するときには、上記のアクションの前に行うことがあります。
それは**clone**というアクションです。

###clone
cloneとは、簡単に言うとダウンロードのことです。
リモートリポジトリですでに保存されているファイルや、変更履歴を自分のローカルリポジトリとしてダウンロードしてくることです。
cloneをすることで、今までの履歴を自分のローカルに取り込み、管理することができます。

##Gitを更に使いこなすためには
ここまではGitの基本機能のバージョン管理について説明してきました。
ここからはGitを更に使いこなすために、もう一歩進んで説明していこうと思います。
「branch」「merge」「fetch」というアクションについてです。

![グループ 106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/cb22692f-43e8-a616-26fe-75beb5f0d263.png)


###branch
まずはbranchです。branchはGitを使う上でとても大切な概念になります。
しっかり理解しておきましょう。

**branchとはファイルを編集した履歴を分岐させて記録していく機能のことです。**

WEBサイト作成やWEBサービスなどを行う上で、バグの修正や、機能・ページの追加などのファイル編集作業は複数のユーザーが同時に行うことが多くあると思います。

同時に並行して行われる作業を正確に管理するためにbranchを使用します。

branchは大きく分けると２つに分類できます。（もっと細かく分けることもできます）

![グループ 105.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/70b87cbf-0f06-dd31-ec12-8067194c255d.png)


**マスターブランチ**は、メインのブランチのことで、本体だと思ってください。
このマスターブランチから、その他のブランチを作成することを**、ブランチを切る**と言います。
※実際にはマスターブランチからブランチを切って、さらにそのブランチからブランチを切ることもあります。
**ブランチとは現在のバージョンをコピーして、別の作業空間を作るイメージです。**


ちょっとややこしいかもしれないですが、世界に例えて説明します。

**ここはわかりにくければ、無視してください！！！**

```
マスターブランチ = 現実の世界
その他のブランチ = パラレルワールド
```

マスターブランチから、その時点をベースに別のパラレルワールドを作成して、並行して作業を行うことができます。
その他のブランチで行っている作業は、マスターブランチには全く影響を与えません。
例えば、マスターブランチから、その他のブランチを一つ切って、そのブランチでファイルを全部削除してしまうとします。
削除されたブランチではファイルは全てなくなってしまってますが、マスターブランチではファイルは消されず残っています。

このようにお互い干渉しない、別のコピーを作って、別々の世界として作業を行うことができます。
これがブランチを切るということです。

![グループ 109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/99b91edd-4e3f-35f2-27f8-4c7f926e1e6b.png)

##merge
branchがわかったところで、次はmergeについてです。
mergeとは切られたブランチで作業を行い、それを他のブランチに統合する作業のことです。
図ではマスターブランチからその他のブランチを切って、マスターブランチに再度統合しています。
この時に、同じファイルの同じ箇所を編集していた場合は、**競合エラー**というのが起こり、どっちの編集を残すかを選んでから、mergeすることができます。

##fetch
最後にfetchについてです。
リモートリポジトリからファイルの最新情報を取得してきて、リモートリポジトリが更新されていないかを確認する作業のことでです。
ちょっと似ていてややこしいかもしれませんが、プルとは違い、ローカルのファイルを更新されることはありません。

本当は違うのですが、わかりやすくするためにあえて例えると、自分が見ているリモートリポジトリのキャッシュクリアみたいなものです。
プルは、このフェッチとマージを同時に行う機能といえます。

##まとめ
以上がGitの基本概念の説明となります。
複数人で作業するときにはすごく便利で、今やどこの現場でも必須レベルのツールだと思います。
実際にGitを使うには概念だけでは扱えず、使い方や、Gitを操作するツールのことも学ぶ必要があります。
それはまた別の記事で説明しようと思います。