Gitの概念説明

# 概要

この記事はGitの概念を理解しようという話なので具体的なコマンドなどはあえて出さずに概念の説明に留めいています。
ただ概念的な理解はGithubを使う上で必ず必要になってきます。これは初心者向けの説明なのであくまでイメージですが、個人的に分かりやすかった考え方をお伝えします。

# 対象読者
- プログラミングを学び出して日が浅い人
- チーム開発経験がない人

# Gitとは
クラウド上でコードのデータを記録し、それを複数人で作業することを可能にしたソフトウェアの名前です。**（Gitはシステムだと覚えておいてください）**
Git をwekipediaなどで調べると、
>
プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムである。

って書いてありますが、初めのうちはイメージしずらいと思うので最初はGoogleDriveやOneDriveなどのプログラミングver と想像してもらえると良いかと思います。ただあくまで入り口ですので、ここのイメージに引っ張られすぎないでください。後ほど違いもきちんと説明します。

# Gitの用語説明
概念を説明するにあたって最低限の用語を紹介します。

## ブランチ

変更記録を分岐させて記録するためのもので、ディレクトリやファイルの状態が管理されています。また枝分かれしたブランチはそのブランチの情報を持っています。この部分は文章では分かりずらいと思いますので図で見ていきましょう。

<img width="650" alt="スクリーンショット 2019-11-10 21.04.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408781/8a926ac9-7fc9-72e7-fbf8-b9c849bd3d68.png">


この３つの丸がブランチを表しています。ここにはディレクトリやファイルの状態が管理されているのです。この図では例として親元のmasterブランチ、機能を追加するfunctionブランチとバグを修正するbug_fixブランチを作りました。
２つのブランチはmasterブランチから枝分かれしていることによって、masterブランチと全く同じ状態のブランチが2つ出来たことになります。ブランチを作った時点でこの２つのブランチはmasterとは完全に独立の状態となり、与えられた作業に専念することが出来ます。

---
ではこのケースを実際の画面で見ていきましょう。

<img width="650" alt="スクリーンショット 2019-11-10 20.42.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408781/c5a2fc71-1d75-f325-f0d0-7cf8df134dbd.png">

ここにあるmasterブランチ、functionブランチ、bug_fixブランチは先ほどの図と同様にそれぞれが互いに独立した関係にあります。
これらのブランチは作業の終わったタイミングで合体（マージ）させることが出来ます。この仕組みにより複数人で同時に作業を進めることができるのです。

実際のケースで説明すると、機能追加作業をするA君とバグを修正するB君は同時に作業することが可能になります。

<img width="650" alt="A君B君.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408781/8883b32c-28cb-d440-5a53-d6eeb32cd182.png">


## リポジトリ

一言で言えばファイルやディレクトリが管理されているブランチの集まりです。このリポジトリはブランチから構成されているのでブランチが記録されている場所といってもいいかもしれません。こちらにもブランチと同じくローカルとリモートという概念があります。ローカルとリモート部分は次の概念説明の部分で紹介します。


# Gitの概念
Gitを理解する上で一番重要な概念はリモートとローカルという概念です。
これを前述したクラウドサービスに置き換えると、ローカルファイル（pcの中に保存してあるファイル）とクラウドにあるファイル（オンライン上に保存してあるファイル）になります。
これらを比較するために図式化していきます。

### クラウドを用いたファイル管理の場合
<img width="650" alt="スクリーンショット 2019-11-06 16.39.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408781/a9416dec-599d-235e-962d-163a8617d485.png">

### Gitの場合
<img width="650" alt="スクリーンショット 2019-11-06 16.40.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408781/47d92113-e8ad-4140-5ed5-cb087bb15bfa.png">

このように基本的な概念はクラウドの仕組みです。しかしこれらのサービスと大きく違う仕組みがあります。それは「各リポジトリ(ファイルの集まり)が連動している」という点です。
一般的なクラウドの仕組みでは、ローカルファイルとクラウド上のファイルのデータは完全に分離されているため、クラウド上の最新の変更をローカルに反映させるにはクラウドからダウンロードするしかありません。

しかし、Gitのリポジトリは双方が連動しておりリモートの状態をローカルが追跡しています。これにより、新たな変更状態をダウンロードすることなくコマンド一つでリモートの最新状態をローカルに反映させることができるのです。

<img width="650" alt="比較.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408781/5436f70e-2ab7-2f1d-bc73-265ced313727.png">

ここまで説明した通り、Gitには図に出てきた**「リポジトリの連動」**という特性があリます。この特性があることによって、コマンド一つでリモートの最新状態をローカルに反映することができるのです。
こちらもブランチの時と同様に、実際の画像を使ってみていきましょう。

<img width="650" alt="スクリーンショット 2019-11-10 20.42.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408781/914ed28c-3be3-df46-7f95-6193866306bc.png">


こちらの画像にはmaster というブランチとorigin/masterというブランチがあります。このmasterという方がローカルブランチで、origin/masterという方がリモートブランチです。

この特性によりローカルのブランチで作業をしてリモートに反映させたり、リモートの最新状態をローカルに反映させることが容易になっています。

ちなみにリモートの変更状態をローカルに反映させた画面がこちら。
細かいことは一旦気にせず、Fast-forward以下に注目してください。
ここではリモートのブランチとローカルのブランチの差分が、ファイル単位で数字と記号によって表されています。
この作業により、リモートの最新状態がローカルに反映されるのです
<img width="609" alt="git差分.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408781/2f463805-f1aa-13ca-a3bd-601ab943e572.png">

この具体的なコマンドは今記事では割愛しますが、概念を理解した上で自分でコマンドを打ってみると理解が早いと思うので、ぜひやってみてください。

コマンドを知りたい！！という方は、この方の記事を参考にするといいかもです。
https://qiita.com/koji_zep/items/7ceb8ccf4ba52d4760db

# GitHubとは
最後に様々な企業で導入されているGitHubを簡単に説明します。 
Githubとは前述したGitという仕組みを用いたwebサービスの名称です。
世界中の人々が自分の作品（主にプログラムのソースコード）を公開したり、チーム開発に利用されていたりします。

# GitとGitHubの違い
自分もはじめのうちは混同していました。
これは以下のように覚えると分かりやすいと思います。

### Git 
一言で表すとソフトウェアの名前です。前述した技術でソースコードの状態を管理するなどの用途があります。ソフトウェアをPCにインストールすれば使うことは出来ますが基本的にはコマンドだけの操作となります。

### GitHub 
Gitの仕組みを使ったwebサービスです。
Gitはコマンドだけの操作になりますが、GitHubではコマンドだけではなくwebの画面上からも様々な操作が出来るようになっています。
また世界中の開発者のレポジトリを見ることが出来るので、ソースコードの勉強に役立てることも出来ます。

# GitHubを使うメリット

Gitでも同じようなことが出来るならGitHubはいらないんじゃないかと思った方もいると思います。
ではなぜGitHubが使われるのでしょうか。
理由はいくつかありますが、一番の理由はソースコードの共有が容易にできることです。
Gitのソフトウェア単体でも共有することができない訳ではないですが、GitHubと比べるとやや手間がかかります。GitHubを使えば共有リポジトリの作成やユーザー招待などの作業が、Git単体でやるよりスムーズに行うことが出来るのです。

GitHubは比較的容易に使用出来るので、一人で勉強する際にはぜひ使ってみてください。初めの内は概念を掴むのが難しいと思いますが、抽象度の高いところから徐々に噛み砕いていきましょう。