初心者にgitの概念を説明してみる

# 趣旨

GitやSVNなどバージョン管理システムを使ったことがない初心者にGitについて説明する機会がありましたのでその資料用として「Gitとは？」を、初心者にわかりやすく専門用語をなるべく使わずに説明し用語を覚えてもらいたいと思います。



# Gitとは
<img alt="リポジトリ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109122/e2a3e935-3299-039e-6181-87e9ede62d64.png" width="30%">

Git【ぎっと】とは、簡単に行ってしまうとプログラムや画像などといったファイルを、「いつ」「誰が」「どんな変更を行った」等といった情報（以降、変更履歴）を管理するソフトウェアです。

この様なソフトウェアは**バージョン管理システム**（Version Control System）と呼ばれ**VCS**【ぶいしーえす】と略されます。

VCSにはGitの他にも**Subversion**【さぶばーじょん】（略はSVN【えすぶいえぬ】）などが有名です。

他にもVCSはありますが、紹介は省きます。



## 管理方式

VCSは、ファイルの変更履歴をデータベースに保存しておりそのデータベースを**リポジトリ**と呼びます。


<img alt="リポジトリ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109122/f6da5ae0-7e60-2172-dcf2-985bf19bf05d.png" width="70%">



VCSのリポジトリには集中型と分散型の２種類存在します。

### 集中型
１つのリポジトリで集中して管理しているためそう呼ばれています。先程紹介したSubversionは集中型バージョン管理システムです。
<img alt="集中型" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109122/f91d1f21-5075-b9a8-e646-b4e90e4811e2.png" width="70%">

### 分散型
Gitは分散型バージョン管理システムです。集中型との違いは、自分のPC上にもリポジトリを持つ点です。自分のPC上のリポジトリを**ローカルリポジトリ**といいサーバ上にあるリポジトリを**リモートリポジトリ**といいます。

<img alt="分散型" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109122/ec7f7f2a-47ec-7d2e-af47-efdee62a9e0c.png" width="70%">

## 基本的な利用方法

**※これまではSVNも紹介してきましたがここからはGitのみの説明になります。**



### 基本的な操作

Gitの基本的な操作は以下の様になります。

1. リモートリポジトリを複製しローカルリポジトリを作成 (clone【くろーん】)
2. ファイルの変更し変更履歴の登録対象にする（add【あど】)
3. ローカルリポジトリに変更履歴を登録（commit【こみっと】）
4. 他人の修正を取得（pull【ぷる】)
5. 保存した変更履歴をリモートリポジトリへ反映（push【ぷっしゅ】）

基本的に１のcloneは１度実行したらあとは不要ですので作業としては2から5の繰り返しになります。

#### clone【くろーん】
リモートリポジトリからコピーしてローカルリポジトリを作成します。
この行為を**clone【くろーん】**と呼びます。また、同時に管理されているファイルも展開されます。
![git_anime.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109122/f5d45760-c0a5-529b-f5ee-5a928ea0ef3b.gif)

#### add【あど】
ファイルに変更を加えたファイルを後に出てくる登録（コミット）する対象にします。
この行為を**add【あど】**と呼びます。内部的にはステージングエリアと呼ばれる（インデックスとも呼ばれる）場所に登録されますが、見た目上は変化ありません。
![git_add.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109122/4913df12-121b-a7b5-e935-660894380611.gif)

#### commit【こみっと】
ステージングエリアに登録されている情報をローカルリポジトリに登録します。
この行為を**commit【こみっと】**と呼びます。

<img alt="GitLab logo" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109122/f4f9b285-1bb1-2cfc-43ad-c8898d6518fa.png" width="70%">

#### pull【ぷる】
他人の修正が入り更新されたリモートリポジトリの情報をローカルリポジトリに反映させます。
この行為を**pull【ぷる】**と呼びます。
<img alt="GitLab logo" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109122/a56beaaf-a633-3d18-74c4-a942ac2a2a7e.gif" width="90%">
#### push【ぷっしゅ】
ローカルリポジトリの更新された情報をリモートリポジトリに反映させます。
この行為を**push【ぷっしゅ】**と呼びます。
<img alt="Github logo" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109122/06109671-0535-df8b-2ac1-8b9b6cf91d6b.png" width="70%">
以上が、基本的なGitの操作の流れになります。

実際は、余計なファイルまでaddしてしまって取消（reset)を行ったり、他人と修正ファイルが被って衝突（コンフリクト）が発生して１つにまとめる（マージ）などの作業が必要になったりしますが、そうなった時に調べて対処すれば大丈夫です。
## 応用

今まで基本的な説明をしてきましたが、ここからは応用編です。

Gitを使う開発は複数人で同時並行に作業する場合が殆どです。基本操作で伝えた内容では、困った事が起きます。

### branch【ぶらんち】

例えば、複数人で開発していると未完成の状態でもプッシュして別の開発者に連携したい場合があります。

さらに複数チームで未完成のソースをリモートリポジトリにプッシュし合うとリモートリポジトリの管理が煩雑化してしまいます。

そこで多くのVNCではbranch【ぶらんち】と呼ばれる機能を使ってリポジトリ内でコピーをしてお互いのチームで干渉し合わない様にすることが出来ます。

<img alt="Github logo" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109122/62f7059a-075e-f9cf-be98-536fe279d3c6.png" width="70%">

#### Masterブランチ【ますたぶらんち】
先ほどの図でコピーされた大元のブランチは、リポジトリに最初のコミットを行ったmasterという名前のブランチでMasterブランチと呼びます。

Masterブランチから作成されたブランチは、役割を終えるとMasterブランチに合流しこの合流作業をマージと呼びます。

## リモートリポジトリ


今までリモートリポジトリと言ってきましたがリモートリポジトリはどうやって作るのでしょうか？

自分でサーバを立ててそこに作成する方法もありますが、インターネット上にリモートリポジトリを作成・運用出来るサービスもあります。

またこの様にインターネット上で公開し顧客に機能を利用させるサービスを**ホスティングサービス**と呼びます。

主なGitのホスティングサービスは以下の３つです。


### Github【ぎっとはぶ】
<img alt="Github logo" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109122/9ac3fdfb-b600-e818-2c7d-379bd5178a5b.png" width="30%">


Gitのホスティングサービスで最も有名なのがGithubです。

無料プランではソースコードを公開しないといけないため、公開したくないリポジトリの場合には不向きです。

逆に、利用者の多くはソースコードを公開しているため、プログラムの書き方など勉強になります。



特徴

- Gitのホスティングサービス最大手。

- 有料プランでないと非公開なリポジトリが使えない。

  

### Bitbucket【びっとばけっと】

<img alt="Bitbucket logo" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109122/59287e4b-28dd-d762-abbc-748f1d53d143.png" width="30%">

無料でリポジトリを公開しない設定に出来るGitのホスティングサービスです。そのかわり１プロジェクトに対して５人までの制限があります。

５人以降は、有料プランです。

小規模開発でソースを公開したくない場合によく利用します。



特徴

- 公開／非公開なリポジトリを無制限で作成可能
- １リポジトリに対して５人までの制限あり



### GitLab【ぎっとらぼ】

<img alt="GitLab logo" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109122/96fc0c78-d612-e1b5-e930-33d23f4d7c9c.png" width="30%">
Githubを元の作られたサービスです。GitHuｂとは違い非公開のリポジトリも無料で作れますが、１リポジトリで10GBまでの容量制限があります。

特徴

- 公開／非公開なリポジトリを無制限で作成可能
- １リポジトリに対して10GBまでの制限あり


以上の３つが主なGitのホスティングサービスです。
Google Trendsで人気の動向を調べると圧倒的にGitHubが人気があるのがわかりますね。

<img alt="GitLab logo" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109122/2525e63e-b7c5-173a-b830-bcf8c6e22d5e.png" width="80%">


以上で、Gitの説明は終わります。
今回は、初心者に概念を伝えるをテーマに話しましたので詳細な説明は省きました。