Git基礎

■概要

Gitバージョン管理システムの1つです。
有名なバージョン管理システムはGitやSVNがあります。

●バージョン管理システム
	バージョン管理システムとはプログラムのソースコードやプロジェクトの変更履歴を
	リポジトリなどに記録することができるシステムのことです。
	バージョン管理を使用することにより問題が発生した際に問題がないバージョンに戻したり、
	編集した部分の差分を表示することができます。

●リポジトリ
	リポジトリとはバージョン管理システムで必須となる機能で、
	ファイルの変更履歴などの保存をする場所です。
	バージョン管理システムによってプロジェクト内でリポジトリを持つ数が異なります。
	リポジトリが1つだけのバージョン管理システムを「集中型」
	複数のリポジトリをもつバージョン管理システムを「分散型」と呼びます。
	SVNが前者、Gitは後者です。

	・集中型
		集中型はプロジェクト内で1つだけリポジトリを作成し、
		そこへ各メンバーがファイルの更新を反映させます。
		集中型のリポジトリはサーバーにおかれるのでサーバー接続ができない環境では
		最新のファイルの取得や変更反映ができません。
		ただし、1つのリポジトリに対しての操作だけを覚えればいいので、
		学習コストは低いです。

	・分散型
		分散型は自分のPCにリポジトリを作成し、そのリポジトリ内で開発を行い、
		開発がある程度進んだ段階でネットワーク上にある全体のファイルを管理している
		リポジトリへ反映を行います。
		自分のPCにリポジトリがあるのでネットワークにアクセスできない場合でも
		作業を進めることができますが集中型と比べると覚えるべき操作が多いので
		学習コストが集中型よりかかります。
		※PCに作成したリポジトリをローカルリポジトリ、ネットワーク上にある
		 リポジトリをリモートリポジトリと呼びます。

■共通機能

Gitは複数の「SourceTree」や「TortoiseGit」ツールがサポートしていますが
基本的な機能は同じです。
※「SourceTree」や「TortoiseGit」は別ページで解説します。

●リポジトリ作成
	リポジトリ作成は自分のPCやネットワーク上に新しくリポジトリを作成します。
	作成されたリポジトリにファイルを追加してプロジェクト管理を行います。

●クローン作成
	クローン作成は別のリポジトリの内容を元にして新しい
	リポジトリを作成する方法です。

●コミット
	コミットは追加、編集したファイルをローカルリポジトリに反映する機能です。
	コミットをしないとファイルはリポジトリ管理下におかれずに変更履歴も残りません。

●ブランチ
	ブランチは作業履歴を分岐させる機能です。
	ブランチによる分岐を行うとそこからは他のブランチの影響を受けなくなるので
	作業がやりやすくなります。

●マージ
	マージはブランチで分岐した作業履歴を合流させる機能です。
	ブランチで行っている作業が完了したら別のブランチ(基本は本流)に合流させます。

●プル
	プルはリモートリポジトリにあるファイルをローカルリポジトリに反映する機能です。
	ローカルリポジトリにコミットを行ってもリモートリポジトリには反映されないので
	注意が必要です。
	リモートリポジトリのファイルをローカルリポジトリにダウンロードするイメージです。

●プッシュ
	プッシュはローカルリポジトリの内容をリモートリポジトリに反映する機能です。
	リモートリポジトリにファイルをアップロードするイメージです。

●プルリクエスト
	プルリクエストはローカルリポジトリでの変更を他の人に通知する機能です。
	この機能によって変更、修正した情報を他の人が知ることができ、
	レビューや、マージなどで大きな効果を発揮します。

●コンフリクト(衝突)
	コンフリクトは機能でありませんが、バージョン管理では共通で発生する
	現象なのでここで紹介しておきます。
	コンフリクトはマージするときに他者の修正と重複した場合に起きる現象です。
	重複と書いていますが、これはファイル単位ではなく修正箇所が同じ場所を指します。

	・重複するコードの例
		・ブランチA
			void main(void)
			{
				print("Hello");
			}

		・ブランチB(ブランチAから作成)
			void main(void)
			{
				// Hello => HelloWorld
				printf("HelloWorld");
			}

		・ブランチC(ブランチAから作成)
			void main(void)
			{
				// Hello => HelloGitWorld
				printf("HelloGitWorld");
			}

		・衝突までの流れ
			①.上のコードでまず、ブランチBをブランチAにマージします。
			  するとブランチAの内容がブランチBに書気変わります。

			②.ブランチCをブランチAにマージします。

		②をマージした際のブランチAはブランチCが分岐した時の内容(Hello)ではなく、
		ブランチBをマージされた状態になっているので、
		Git上では最新のブランチAとブランチCのどちらが正しいのか判断できません。
		このような状態をコンフリクトと呼びます。

■Gitのウェブサービス

リモートリポジトリを使用するにはネットワーク上にGit環境を用意する必要があります。
本来はサーバーなどを用意してそこで環境を作るのですが、
リモートリポジトリを簡単に作成することができるウェブサービスがあります。

●GitHub
	GitHubはアカウントを作れば無料かつ、数の制限なしでリポジトリを作成できます。
	ただし、リポジトリの内容を非公開にできません。
	非公開設定にするためには毎月一定の金額を払うことで設定可能になります。

●Bitbucket
	Bitbucketもアカウントを作れば無料かつ、数の制限なしでリポジトリを作成でき、
	非公開の設定も可能です。
	ただし、チームというグループの設定があり、1チームにつき5人までしか参加できません。
	こちらもお金を払うことでチームの人数制限を外すことができます。