
GitとGitHubの使い方からプロジェクトの管理、開発現場での運用まで体験しながら学ぶ入門書『図解! Git&GitHubのツボとコツがゼッタイにわかる本[第2版]』より 第3回
GitとGitHubについて系統だてて学べる『図解! Git&GitHubのツボとコツがゼッタイにわかる本[第2版]』から書籍内容を抜粋してご紹介。第3回は「Capter01 Git&GitHubのイメージをつかもう」から「Gitでできること」です。
Gitでできること
バージョン管理する場所を作成する - リポジトリ
Gitは、プロジェクト全体(=ファイルの集合)を1つのスナップショットとして記録していきます。スナップショットは、ある時点におけるファイルやディレクトリ構造すべてを保存したものです。そのスナップショットや、バージョン管理に必要なその他のファイルを保存する場所をリポジトリ(repository)といいます。リポジトリは通常プロジェクトのルートディレクトリ(プロジェクトを構成するディレクトリ階層において最上層のディレクトリ)に.gitという名前で配置されます。

ファイルの変更履歴を記録する - コミット
記録したスナップショットのそれぞれをコミット(commit) といいます。また、スナップショットを記録する操作のこともコミット(commit)といいます(日本語ではコミット操作を行うことをコミットすると言うことが一般的です)。
コミット操作を行うと、プロジェクト内のファイルのすべてがスナップショットとしてリポジトリ内に保存されます。このとき、作成したコミットや保存したファイルにはハッシュ値(コミットやファイルを一意に識別するための値)が割り当てられ、コミットはファイルへのハッシュ値の参照を持つことになります。
どれか一つのコミットを選択すれば、瞬時にプロジェクト全体をそのスナップショットの状態に戻すことができます。

記録されたコミットはプロジェクト全体のスナップショットであり、またコミット操作は頻繁に行う操作のため、大量のコミットをリポジトリが保持することになりますが、コミットはあくまでファイルへの参照であり、変更がないファイルについては以前の参照から変化しないため、変更のないファイルまでもがコミットごとに重複して保存されるということはありません。ファイルに変更がない限り、複数のコミットが同一のハッシュ値を持つファイルを参照することになります。このように無駄がない仕組みになっています。

変更履歴を分岐させる - ブランチ
全てのコミットには、その一つ前のコミットがどのコミットであるかを指し示すハッシュ値が記録されています(すべてのスナップショットは、他のどのスナップショットの次に作られたものなのかがわかる、と言い換えることができます)。ですので、コミットをたどっていけば、一番最初に行ったコミットまで遡ることが可能です。
また、コミットは枝分かれさせることができます。あるコミットの次に作られるコミットが一つとは限らないのです(並行世界を作るかのように、スナップショットを枝分かれさせることができます)。
この枝分かれをブランチ(branch)と呼びます。ブランチは複数作成することができ、それぞれが特定のコミットを指し示します。そして、コミットは前のコミットを先祖までたどることができるため、ブランチはコミットとコミットを線でつないだかのような形を構成します。

また、まったく枝分かれしない状況であっても必ず一つブランチが存在します(その場合コミットを繋ぐ線は1本線になります)。Gitを使用してバージョン管理する際は、常にいずれかのブランチ上で作業を行います。コミット操作は、この作業中のブランチに対して行われます。

また、枝分かれしたブランチは統合することができます。この統合操作のことをマージ(merge)といいます(並行世界をひとつの世界にまとめるようなイメージです)。別々に枝分かれしたそれぞれのスナップショットが一つにまとまって新しいスナップショットが作られるため、マージの際にはコミットが作られます(特定の条件下では作られないこともあります)。
このため、さまざまな状態の記録を作成することができます。

複数人でリポジトリを共有する − リモートリポジトリ
Gitは分散バージョン管理システムであるため、スナップショットや、バージョン管理に必要なその他のファイルを保存するリポジトリを、インターネット上あるいはその他のネットワーク上に作成することができ、複数人により共同でバージョン管理を行うことができます。このようなインターネット上またはその他のネットワーク上のリポジトリをリモートリポジトリといいます。また、リモートリポジトリに対して、自分の手元の環境にあるリポジトリをローカルリポジトリといいます。
一つのリポジトリに対して、リモートリポジトリを複数設定することができます。

通常のシステム開発では、作成したリモートリポジトリをローカルリポジトリにコピーしてきたあと、ローカルリポジトリに対して行ったコミットをリモートリポジトリに反映させます。また、他の人がリモートリポジトリに対して行った変更をローカルリポジトリに反映させることも通常行います。
それぞれの操作には名前がついており、リモートリポジトリをローカル環境にコピーする操作をクローン(clone)、ローカル環境(ブランチ)に加えた変更をリモートリポジトリ(のブランチ)に反映させることをプッシュ(push)、リモートリポジトリの変更を取得し、ローカル環境(ブランチ)に反映させることをプル(pull)、といいます。
それぞれの操作についての詳細は、後の章で説明します。

リモートリポジトリを作成する場合、自前でサーバを用意し、そこに作成することもできますが、一般的にはGitホスティングサービスを利用することが多いです。Gitホスティングサービスとは、自前でサーバを用意せずとも、クラウド環境でGitによるバージョン管理を提供してくれるサービスのことを指します。このGitホスティングサービス上でリモートリポジトリを作成し、Gitによる分散バージョン管理を行います。
本書で紹介するGitHubはGitホスティングサービスです。また、他にもBitbucket やGitLab、backlog など、様々なサービスが存在します。

次にGit の概要を4 つの図にわけて説明します。
Git 概要図
● Git 図解1
Git
Gitは、プロジェクト全体を1つのスナップショットとして記録していく。スナップショットはプロジェクト内に作成されるリポジトリ(.gitディレクトリ)に保存される。

● Git 図解1
ブランチ・マージ
記録の枝分かれのことをブランチという。コミットの作成は作業中のブランチに対して行われる。ブランチの作成とマージを繰り返して、さまざまな状態の記録を作成していく。

● Git 図解3
リモートリポジトリ
インターネット上あるいはその他ネットワーク上のどこかに存在するプロジェクトのこと。3種類の操作を行うことで作業を分担し、共同作業を行う。

● Git 図解4
リモートへの操作

書籍目次
Chapter01 Git & GitHubのイメージをつかもう
Chapter02 Gitをはじめる準備をしよう
Chapter03 Gitを使ってファイルの変更を管理してみよう
Chapter04 GitHubを利用してプロジェクトを管理してみよう
Chapter05 開発現場でのGit/GitHubの運用を体験してみよう