バージョン管理システムとは自分、もしくはプロジェクトのメンバーたちが開発しているシステムやアプリケーションのプログラムを日時や変更履歴によって管理する仕組みです。

そもそも「バージョン管理」とは…

 現在では、利用者に対して提供された順番を明示するためにバージョンという語を用いることが多く
引用:Wikipedia

つまり、物が出来上がるたびにその成果物に対して番号を振るということです。成果物は必ずしも完成品ではありません。進捗(以前の物から変化)があれば、それは成果物と呼べます。

パソコンで作ったファイルどうしてる?

 皆さんはパソコンで何かをファイルとして保存するとき一般的には「上書き保存」をするでしょう。

 毎回毎回、「保存前のファイル」を保持していたらフォルダ(ディレクトリ)の中のファイル数が膨大になって目的のファイルを探しづらいですよね。

 例えば下記のように2ファイル(a.txt,b.txt)であれば

git1

 とは言え、「上書き保存」してしまえばそのファイルの以前のデータは失われます(追記している場合は残っていますが、どこが変更されたかは分からなくなります)。もし、以前のデータを残しておきたければ「別名で保存」によって以前のデータを残しておくしかありません。そういう問題を解決するのがバージョン管理です。

ファイル管理の問題解決

今困っていることは
・フォルダ内に「保存前のファイル」がたくさんあると見づらい
・ファイルの過去の状態に遡りたい
ということです。

 バージョン管理で上記の問題を解決します。

解決方法:
 ユーザが指定したファイル(もしくはフォルダ内の全ファイル)の修正内容を
 バージョン管理システムに伝えると、
 「前回との差分」を「前回の次の番号」で管理します。

 この解決策により、表(フォルダ内)には最新のファイルのみですっきりしていて、なおかつ、システムを呼び出すとファイルの過去の状態を確認できることになります。便利ですよね。ここで、バージョン管理システムに伝えるということを「コミット」と言います。

 ただし、注意したいのが、バージョン管理システムに伝えない限りは修正内容を管理してくれませんので、あるファイル(状態1)を作業をして「上書き保存」した(状態2)あと、バージョン管理せずに作業して「上書き保存」した(状態3)ときは(状態2)に戻すことができません。

 戻る作業が多いときは小まめにコミットするように心がける必要があります。

バージョン管理システムの種類

 バージョン管理システムには大きく分けて2つの方法があります。「分散型」と「集中型」です。

 両者の違いを理解するためには、まず「リポジトリ」を理解する必要があります。

リポジトリとは

 リポジトリは前述している全てのバージョンとその差分を管理しているデータベースのことを指します。分散型と集中型はこのリポジトリの扱いが異なります。

「集中型」バージョン管理システム:Subversion,CVS

 先に、集中型バージョン管理システムについて説明します。集中型はリポジトリをサーバーのみに設置させる方法です。つまり、自分のPCがネットに繋がっていないとバージョン管理(前のバージョンに戻す、コミットするなど)ができません。

 そのため、オフラインで作業をしていると、オンラインでコミットするまで差分が取れないため、ファイルを更新してしまうと、ファイルを以前の状態に戻せなくなります。

 また、1つのサーバーで集中管理しているため、ある開発プロジェクトでリポジトリを他メンバーと共有した場合、全てのコミットを他メンバーに見られることになります。

 つまり、試しに作ってみただけのプログラムも他メンバーが知ることになります。用途が合っていれば構いませんが、成果が出ているプログラムだけをリポジトリに共有したいときは適切ではありません。

「分散型」バージョン管理システム:Git

 一方、分散型バージョン管理システムはリポジトリを各ローカルPCとサーバ上の両方に設置します。開発者(システム利用者)は毎回、ローカルPCのリポジトリに差分を記録することができるため、オフラインでも差分をバージョン管理することができます。プログラムが良い感じに仕上がったら、サーバ上のリポジトリにコミットすることで、他メンバーにプログラムを公開するタイミングを開発者が決めることができます。

 この内容だけだと、「分散型」が絶対的に良いように思いますが、難点も少しあります。
 
 たとえば、Subversion(集中)とGit(分散)のWikipediaを見るとわかりますが、Gitは5年程度歴史が浅く、資料についてはSubversionの方が多いです。とはいえ、GitもGitHubが普及して敷居は下がっていると思います。

 もう一つ、Gitはリポジトリの一部(ディレクトリ)だけをチェックアウト(サーバからローカルに落としてくる)ことができません。リポジトリを丸ごと、チェックアウトするしかないので、リポジトリは細分化するように注意しないといけません。

まとめ

バージョン管理システムは

 ・フォルダ内に「保存前のファイル」がたくさんあると見づらい
 ・ファイルの過去の状態に遡りたい

 という場合に、ユーザが指定したデータの修正内容をバージョン管理システムに伝えることで「前回との差分」を「前回の次の番号」を管理できます。

 そして、「分散型」と「集中型」では両方に善し悪しがあり、開発内容を明確化してどちらを使用するか判断することが重要です。