一人でバージョン管理 1(選定編)

最近コードを書くことが増えてきて、バージョン管理システムを使ってみたんですが、リポジトリって何?って状態からの導入だったので、その際に調べたことなどを忘れないうちにメモしておきます。自分にとって必須だった機能は以下の通り。

  • あくまで個人利用
  • プログラマじゃなくても扱える
  • オフラインで出来る
  • とにかくシンプルに
  • Emacs から操作できる
  • サーバー上で管理することも出来る

実際にバージョン管理する前に基礎からお勉強。

バージョン管理システムの基本(サーバーを介する場合)

管理システムにデータ(リソース)を預けたり、取り出したりする。バージョン管理システム(集中型)で使われる主な用語は以下の通り。

用語 意味
リポジトリ(repository) 管理システムが保持しているデータやその変更履歴などのデータベース。
チェックアウト(check out) リポジトリからデータを取り出す。バージョンを指定しない場合は最新版のデータのみを取得する。
コミット(commit) 変更したデータをリポジトリに書き戻す。
ロック(lock) 他のユーザーがデータを編集できないようにする。例えば、チェックアウトしたユーザーがデータをロックし、そのデータをコミットするまで他のユーザーが編集できないようにする。ロックを解除し忘れる危険性もある。個人利用向け。
マージ(merge) 差分を吸収する。データにロックをかけずにチェックアウトし、コミットの際にマージする。複数のユーザーが同時にデータを編集できる。共同利用向け。
コンフリクト(conflict) 複数のユーザーがコミットした際に、編集内容が競合すること。通常はシステムが上手くマージしてくれるが、それが出来ずにコンフリクトが発生した場合、ユーザーが編集内容を修正する必要がある。
アップデート(update) リポジトリの更新を自分のデータに反映させること。
バージョン番号(version、revision) データにバージョン番号が付加され、データの編集が行われる度に番号がインクリメント(増加)される。バージョン番号を指定してデータをチェックアウトすることで、過去のデータを取り出すことが出来る。システムによってはバージョン番号の他に、日付、時刻、タグによって判別することも出来る。
トランク(trunk) 開発中の最新バージョン。
ブランチ(branch) リポジトリを分岐させること。例えば、「開発版」と「安定版」というようにプロジェクトをわけたいときに使う。システムによってはブランチをまとめる機能を持ったものもある。
クライアント(client) バージョン管理システムの操作ツール。クライアントは通常コマンドラインツールとして提供されているが、ファイル管理アプリケーションや IDE などと融合して GUI で操作できるものもある。
SSH ネットワークを介してバージョン管理を行う場合は、SSH を用いて通信の安全性を確保するのが一般的。
集中型と分散型
  • 集中型

サーバー上に中央リポジトリをおき、各ユーザーがサーバー上のデータをチェックアウト・コミットすることで開発を進めていく。代表的なシステムは CVS とそれを改良した SubversionSVN)で、現在の主流は SVN

  • 分散型

各ユーザーは固有のローカルリポジトリを持つことが出来る。また、SVN などの集中型管理システムが持つ中央リポジトリと組み合わせることが出来る。この場合、ローカルリポジトリは中央リポジトリに対するプライベートブランチという位置付けとなる。代表的なシステムは Git、Mercurial、Bazaar。

分散型の特徴

自分のローカルリポジトリ、中央リポジトリ、他人のローカルリポジトリは対等な関係にあり、プッシュ・プルはどのリポジトリ同士でも自由に行うことが出来る。ただし、各ユーザーのリポジトリを何らかの形で公開する必要がある。

用語 意味
クローン(clone) 他のリポジトリのコピーをローカルリポジトリとして作成すること。集中型のチェックアウトとは異なり、履歴を含んだ完全なコピーを取得する。
コミット(commit) ローカルリポジトリへコミットすること。他のリポジトリには影響を与えない。
プッシュ(push) 他のリポジトリへコミットすること。集中型のコミットにあたる。
プル(pull) 他のリポジトリの変更内容を取得すること。集中型のアップデートにあたる。
ホスティングサービス

ネットワーク上で管理するには、そのシステム向けのホスティングサービスを利用することになる。有名な無料ホスティングサービス(有料プランも提供されている場合が多い)は以下の通り。

システム サービス
SVN SourceForge.netGoogle Code
Git GitHubSourceForge.JP
Mercurial bitbucketGoogle Code
Bazaar Launchpad
参考

http://www.atmarkit.co.jp/fjava/rensai4/devtool03/devtool03_1.html
図もあって分かりやすい。

で、結局どれがいいのか

以下の理由から Mercurial にしました。

  • 分散型なので個人利用、オフライン利用が簡単そう
  • bitbucket がいい感じ(無料で 150 MB まで、プライベートリポジトリは一つまで)
  • 初心者向けのノウハウが多い