Git / Gitホスティングサービスとは

# 【Gitとは】
Gitは、「分散型バージョン管理システムというツール」である。

複数人で開発をする場合は、誰が、いつ、どの部分を、どのように変更したのか、分からなければならない。
Gitを使いバージョンを管理することで、それが解消される。
ある機能を加えたり、修正を行った段階ごとにGitで記録をしていくことで、あのときの状態に戻したい！と思った場合も簡単に戻すことが出来る。

::: note
Gitで出来ることは…
・ファイルの変更履歴（いつ、誰が、どこを）が管理できる。
・過去のファイルに戻せる
・プログラムのソースコードだけではなく、Excelファイル、画像などあらゆるファイルを管理出来る。
・チームで共有できる。
:::

Gitには**ローカルリポジトリ** と **リモートリポジトリ**と呼ばれる2つのリポジトリがあり、このリポジトリに変更した履歴をどんどん追加していく。
各自のマシンにはローカルリポジトリがあり、ここに変更を追加したあと、一つのサーバーにあるリモートリポジトリを、ローカルリポジトリと同じ状況にする。そうすることで、複数人で開発をしている場合でも、同じソースコードを扱いながら作業が出来るようになる。
※リポジトリ：ファイルやフォルダの１つ１つの情報を保存しておく場所のこと。

::: note
整理すると…
・「リモートリポジトリ」：複数のメンバーで「共有する」リポジトリ。リモートリポジトリは、Gitのホスティングサービスである、例えばGithub上に作成する。

・「ローカルリポジトリ」：ローカル環境で編集するリポジトリ。自分のPC側で作成して管理する。
:::

＜Gitのメリット＞
・フリーのライセンスであること。
・データを分散しているので、バクアップの役割も果たしている。



# 【Gitの機能】
- クローン
クローンをするとリモートリポジトリをコピーしてローカルリポジトリを作ることが出来る。誰かが作ってあったり、これから開発する準備として用意されたリモートリポジトリをクローンすることで、実際の開発に取り組むことが出来る。
自分でリポジトリを作らない場合は、このクローンが最初の作業になることも多い。

- コミット
クローンが出来たら、コードを削除したり、追加したりする。その変更したコードに一区切りがついたら、次はコミットをする。コミットは、ローカルリポジトリに変更したファイルを保存することを言う。
コミットするファイルはインデックスと呼ばれる部分に登録されるのだが、クライアントによってはコードに変更を加えると自動的に登録される。
コミットには「コミットメッセージ」と呼ばれる、どこをどのように変更したのかを記録するメッセージが必要になる。

- プッシュ
先程コミットしたファイルは、ローカルリポジトリの中に保存されている状態である。ローカルリポジトリで保存した内容をリモートリポジトリに保存するためにはプッシュをする。
プッシュを行うことで、リモートリポジトリで変更した内容と、ローカルリポジトリの内容を同じものにすることが出来る。

- マージ
マージとはブランチとともによく使われる操作。
ブランチと呼ばれる変更履歴の一連の流れがあり、それぞれ別のブランチの変更履歴を、一つのブランチにまとめてしまうことをマージと言う。マージをすると両方のブランチに残していた変更履歴がどちらも反映される。

- プル
先程プッシュされて最新の状態になったリポジトリにあるコードを、また誰かに開発してほしい場合、すでにそのローカルリポジトリがあれば、プルをしてもらうとよい。プルをすることでローカルリポジトリとの差分を取得することが出来る。
ただし、プルでは差分を取得するだけでなくマージをしてしまうので、マージをしたくない場合は後述するフェッチを使うよい。

- フェッチ
先程のプルを使うと差分をマージしてしまう。そこでフェッチを使うと、リモートリポジトリの内容をマージせずに確認だけをすることが出来る。確認してマージをしたい場合は、もう一度プルをすることでマージをすることが出来る。



# 【そもそもバージョン管理システムとは…】
バージョン管理システム：ソースコードなどの変更履歴を管理してくれるシステムのこと。
現在主流となっているバージョン管理システムの種類は、**「分散型」** と **「集中型」** である。

・分散型：リモートリポジトリだけでなく、ローカルマシンのローカルリポジトリにもバージョンを保存できる。メリットは、ブランチを活用できる。オンラインオフライン問わず複数人が並行して作業できる。デメリットは、マージ作業にコストがかかる。
例）「Git」、Mercurial (マーキュリアル)

・集中型：バージョンがリモートリポジトリに保存される。メリットは、導入コストの低さ。デメリットは、ローカルにコミットできないため、影響範囲が広い。
例）「Subversion」、CVS

（補足）
ブランチ：変更履歴の流れを枝のように分岐して記録していくためのもの。



# 【GitとGitホスティングサービスの違い】
Gitは、分散型バージョン管理システムというツールそのものを指す。
Gitのホスティングサービスは、Gitの機能を使うサービス。これにより、複数人で共同作業ができる。また、リモートリポジトリはホスティングサービス上に作成する為、必要不可欠なサービスである。

（補足）
ホスティングサービス：通信事業者が提供するレンタルサーバーサービス。これを利用すると、自社でサーバ資産を抱えることなくWebサーバやメールサーバを運用できるため、システム運用保守の手間・コストを大幅削減できる。



# 【Gitが使えるホスティングサービス】
・GitHub：リモートリポジトリを提供するWebサービス。クラウド上で運営されるので、サーバ構築は不要。
・GitLab：GitHubに似たホスティングサービス。
・Bitbucket
・CloudForge
・SauceTree
・Tower



# 【GitLab(ギットラボ)】
GitLabとは、
オープンソースのリモートリポジトリアプリケーション。インストールするためのサーバーとの契約や、その後の保守はユーザーが自分でおこなう。


＜Gitlabに備わっている3つの機能＞
①ソースコードの管理
　・ソースコードの閲覧および、変更履歴の確認
　・リポジトリへのアクセス管理
　・ブランチの閲覧、操作

②コードレビュー
　・コードへの注釈コメント
　・レビュー済みコードのマージ
　・競合の解消

③バグ（チケット）管理
　・TO-DOリストの作成
　・優先順位のラベル付け



＜GitLabの導入条件＞
●サポートOS
GitlabがサポートしているOSは、64bit版以下のLinuxである。
・Ubuntu / Debian
・CenOS / Red Hat Enterprise Linux / Scientific Linux / Oracle Linux
・Open SUSE
・Raspbian

Windows環境下でGitlabを導入したい場合は、LinuxのVMやコンテナ環境を利用してGitlabを別途構築する。

（補足）
VM(仮想マシン)：コンピュータの中に作られた、疑似的なコンピュータのこと。

●ハードウェア
ユーザー数によってハードウェアの最低条件が変わってくる。
例）100ユーザーの場合は、最低でも下記の条件が必要である。
・CPU：最低2Core以上を用意。（1CoreのCPUで稼働した場合、著しく動作が遅くなるため非推奨）
・メモリ：4GB以上のRAM、2GB以上のSwap領域を確保。
・ストレージ：応答時間を減らしたい場合は、SASのような高速HDD（7200PRM以上）やSSDの利用を検討する。