本記事は『つくって、壊して、直して学ぶ Git&GitHub 入門』(著者:高橋あおい)の「Chapter 1 バージョン管理って何?」から抜粋したものです。掲載にあたって編集しています。

どうしてバージョン管理が必要なの?

Gitとは「バージョン管理ツール」の一種です。ではそもそも「バージョン管理」とは何でしょうか?
バージョン管理とは、作成したファイルやフォルダなどの成果物に対して変更を加えたときに、変更を加える前と加えた後のバージョン(版)が異なることを正しく管理する仕組みのことです。
たとえば、こんな経験はありませんか? あなたは、テキストファイルhello_v1.txtに「おはよう」と書きました。別の人が先ほどのファイルに「今日はいい天気ですね」と付け加えました。内容が新しくなったので、先ほどのファイルにhello_v2.txtという名前をつけて保存しました。これも一種のバージョン管理と言えるでしょう。
バージョンを管理することで次のうれしさがあります。
- 変更前と変更後の差分が確認できる
- 必要なときに特定のバージョンに戻せる
1人で同じファイルを変更する場合であれば今だとGoogle DocsなどのWebサービスを使えば良いでしょう。これらのサービスは勝手にバージョン管理をしてくれます。しかし開発の現場では「2人以上で」「同じファイルを編集したい」「複数のファイルを編集したい」といった要件が出てくるでしょう。
また、1人しかファイルを変更しないとしても、コードを書くケースを考えてみましょう。コードをローカルで書き、ローカル環境で動作確認しつつクラウド上にファイルを保存/バージョン管理したい、という要件も出てくるでしょう。
これらの要件を満たしながら利便性を向上させるためにバージョン管理ツールは進化をとげてきました。
バージョン管理ツールの歴史
Gitが今の仕組みに至るまで、さまざまなバージョン管理ツールが活躍してきました。筆者自身使ったことあるのはSubversion(以下、SVN)とGitのみですが、せっかくなのでバージョン管理ツールの歴史を少し振り返ってみましょう。

ローカルバージョン管理システムの時代
1972年に開発されたSource Code Control System(SCCS)が初の本格的なバージョン管理システムのようです。コンピュータプログラミングの歴史からすると1972年はかなり新しく感じられるかもしれませんが、それまではパンチカードなど物理的なファイルを用いていたため、バージョン管理システムが必要なかったのではないでしょうか。

SCSSはローカル(単一マシン)内で利用するシステムでした。今では考えられませんが、当時は計算機(ここではPersonal Computer=PC以外も含むためこのように表記します)が非常に高価だったため、大型計算機を複数人でシェアしていました。そのため、このような仕組みで問題なかったのでしょう。今だと考えられないですね。
SCSSが単一ファイルしか対応していないこと、複数人での利用に対応していないことなどから1982年にRevision Control System(RCS)が台頭します。RCSは広く使われ、いまだにRCSを利用しているウィキエンジンもあるようです。しかし、プロジェクト全体でバージョン管理できないという課題がありました。
集中型バージョン管理システム時代
複数開発者がLANを経由してそれぞれが所有する計算機で開発できるようになると、必然的に各個人の計算機を利用してバージョン管理したくなります。そこで登場したのが集中型のバージョン管理システムです。

RCSの後、1986年にConcurrent Versions System(CVS)が登場しましたが、その後2000年ごろに登場したSVNがより広く使われました。中央サーバーにリポジトリを置き、各計算機(クライアント)がそれぞれリポジトリを操作します。筆者は新人時代にSVNを使っていましたが、リポジトリが中央に1つだけ存在するという構成は非常にわかりやすく初心者にもとっつきやすかった記憶があります。また、今でもSVNを利用している現場はあるのではないかと推測します。
SVNは集中型であるため、すべてが中央サーバーに依存してしまうという課題がありました。インターネットがつながらなくなるとリポジトリの履歴の保存ができなくなる、同時に複数の大規模な変更を行おうとすると変更内容同士のコンフリクト(衝突)が起きてしまいコンフリクトの解消に非常に時間がかかってしまう……などは筆者自身が体験したことです。
分散管理型バージョン管理システム時代

集中型バージョン管理システムの課題を解決するために出てきたのが分散管理型バージョン管理システムです。分散管理型バージョン管理システムは中央にマスターとなるリポジトリ(リモートリポジトリ)を置きつつ、個々のローカルにリポジトリ(ローカルリポジトリ)を分散して管理するシステムです。
分散管理型バージョン管理システムとして最初に有名になったのは2000年に登場したBitKeeperです。Linuxカーネルプロジェクトに利用されていたBitKeeperですが、オープンソースソフトウェアではありませんでした。LinuxカーネルプロジェクトではBitKeeperの利用をつづけられなかったため、2005年にLinuxカーネルの創始者Linus TorvaldsがGitをつくりました。これがGitの誕生です。
当時、私がいた開発現場ではSVNからGitへの移行に手こずりました。ベテランのエンジニアもGitへの移行は苦戦していたことを記憶しています。私自身もGitのリポジトリが分散している仕組みになじむのに時間がかかりました。
このようにこれまでSVNを利用したことがあり、今からGitをはじめようとしている方はSVNとの違いに戸惑うかもしれません。使い続けるうちに手になじんでくるので安心してください。逆に、はじめてのバージョン管理システムがGitという方は比較対象がなく、すんなり受け入れられるかもしれません。
あらためてコンピュータ技術の進歩とともにバージョン管理システムが改善されていき、今のGitが誕生したことがよくわかりますね。10年後、20年後にはまた別のバージョン管理システムが普及しているかもしれません。


