トリコロールな猫

猫とつくばと茨城をこよなく愛するnekotricolorのブログです

バージョン管理システムとは何か〜GitとSubversionの違い

最近何かと話題のGitに食いつかずにはおれない新し物好きの@nekotricolorです。

バージョン管理とは

私はシステム開発をしたことがないので、バージョン管理というものにあまりなじみがありません。 でも昔Webアプリの教材を何人かで作っていたときに、バージョン管理ツール「Subversion」を使っていたことがあります。

バージョン管理ツールを導入すると、「リポジトリ」と呼ばれるファイルやディレクトリの状態を保存しておく場所が作成されます。 作成した文書をリポジトリに登録しておき、文書を変更したときにそれをレポジトリに保存する(「コミット」と呼ばれる)すると前回コミットした状態から今の状態の差分を記録してくれるため、何か不具合があっても簡単に前の状態に戻すことができます。プログラムの場合には、「ここ変えたら動かなくなっちゃったよ!」となってもすぐに動いていた状態まで戻せるという訳です。リポジトリをリモートサーバ上に作っておけば、複数人で文書を編集することができます。

複数人で文書を変更する場合には、編集を始める前に最新の文書をローカルにダウンロードする必要があります。これを「チェックアウト」と呼びます。

教材の作成には、SubversionのクライアントソフトであるTortoiseSVNというのを使っていました。これはWindowsのエクスプローラに統合されるため、ファイル保存->エクスプローラ上からコミットというのができてとても便利です。(DropboxのWindows版みたいな使用感)

そもそもGitってなに?Subversionと何が違うの?

ずっとGit=Githubだと思っていたので混乱していたのですが、Gitはsubversionのようなバージョン管理の仕組み、GitHubはGitを使ったサービスのことです。 GitはあのLinuxの父リーナスが作った、Linuxのソースコードのためのバージョン管理システムだそうです。GitHubはリポジトリを公開して、みんなでツッコミ入れましょう、というソースコードのSNSみたいなもんだと理解しています。

SubversionとGitの違いはリポジトリにあります。 Subversionは1ソフトウェアにつきリポジトリが1つで、開発者はそこに直接コミットするのに対し、Gitは各開発者がリポジトリを持つことができ(ローカルリポジトリ)、各リポジトリを管理する中央リポジトリが存在します。Gitではコミットはあくまでローカルリポジトリに対して行い、それでOKだったら中央リポジトリに「プッシュ」するようになっています。

subversiongit

Linuxのように変更による影響が大きく、開発者が大量にいるソフトウェアでは、とりあえずローカルリポジトリでいろいろ試してみてから本家の中央リポジトリにプッシュするという形はとても安全で効率的ですよね。ローカルリポジトリ同士でプッシュやプル(他リポジトリの変更を自分のリポジトリにコミットする)もできるそうなので、本家に影響を与えずに開発者同士でソースコードのやり取りもできると。うむ。さすがリーナスさん。
【2013/05/09追記】Gitリポジトリ同士のプッシュやプルは、(ノンベアリポジトリ同士でなく)ベアリポジトリとノンベアリポジトリ間で行うことが推奨されています。詳しくは「
ベアリポジトリとノンベアリポジトリ:理論編〜GitでWordPressのテーマを管理」を参照ください。

ということで、複数の開発者がいるなら断然Gitがいいわけですが、個人のアプリ開発程度ならSubversionでも十分ですね。でもまあXcodeは最初からGitをサポートしているし、流行もの好きなのでGitを使うことにしました。

参考