インストール
- git
- 簡単だが,既にmsys,cygwin,ActivePerl等を利用している人は共存設定でハマりやすいので注意
- hg, bzr
- 簡単
動作速度
git > hg >= bzr が定説
ただしバージョンアップ等によって変動するので参考程度に
日本語ファイル名
ファイル名をバイナリ透過に扱うか、Unicode文字列として扱うか。バイナリ透過に扱う場合、Windowsでコミットしたファイル名はcp932で保存されるのでLinuxでチェックアウトすると文字化けする。
- git
- ファイル名はバイナリ透過。クロスプラットフォームでの日本語ファイル名利用は諦めたほうがよい
- hg
- ファイル名はバイナリ透過。fixutf8拡張を使えばWindowsでもutf8ファイル名のリポジトリを扱えるが、アドホックな対応で実績が無いのが不安なのと、非標準なので統一が面倒。できるだけクロスプラットフォームでの日本語ファイル名を避けるのが無難。0x5c問題(「表.txt」など)だけを解決するwin32mbcsが標準で付属している。
- bzr
- ファイル名はUnicode文字列。svnと同じ感覚で利用可能。(ただし、pluginや周辺ツールにまだ問題が残っているかも知れない)
空ディレクトリ
- git, hg
- 追跡対象に含めない
- bzr
- 追跡対象に含める
ネットワークプロトコル対応
- git
- ?
- hg
- http(s), 独自プロトコルなど。hg serveをすると、branchできるhttpサーバー兼普通のリポジトリブラウザになるのが特徴的。http使用時のパフォーマンスはgit,bzrと比べて優れているらしい(Google Codeがhgを採用した理由の一つ)
- bzr
- http(s), sftp, ftp, 独自プロトコル(bzr:)など充実。ただし、パフォーマンスは独自プロトコルが優れているのに対してhttpはイマイチ。アップロードはsftp,公開は.bzrディレクトリをそのまま静的ファイルとしてhttpで閲覧可能にしておけばサーバー側にbzrのインストールが不要なので、無料レンタルサーバーも利用可能。
ブランチの切り替え
- git
- ?
- hg
- ?
- bzr
- リポジトリとブランチを切り離すことが可能。リポジトリ内で複数のブランチをcheckoutし、他のブランチで作業したいときは普通にcdをするのが一般的。 gitのような管理も可能 <http://bazaar-vcs.org/GitStyleBranches>
Web UI
- git
- gitweb (同梱), cgit (別アプリ。それなりに使われる)
- hg
- hg serve (内包)
- bzr
- loggerhead (別アプリ、プラグインとして実行する場合、 bzr serve --http のように使える)
スタンドアロンGUI
- git
- gitk(同梱)
- hg
- ?
- bzr
- QBzrとbzr-gtk(Olive)がある。公式インストーラではQBzrがインストールされる。
QBzrもbzr-gtkも、q**/g** (**はlog, annotate, commit など) というように通常のコマンドのGUI版を提供している。たとえばqcommitを使うと、コミットするファイルをチェックボックスで選択したり、addを忘れたファイルを追加することができる。
また、エクスプローラライクの統合型インタフェースとして、Olive(bzr-gtk付属) と bzr-explorer (bzr-gtkやqbzrと連携する統合GUI)がある。
シェル統合GUI(Tortoise)
- git
- TortoiseGit。まだ不完全。
- hg
- TortoiseHG
- bzr
- 公式のWindowsインストーラでインストール時に選択可能。QBzrを呼び出す形になっている。現在experimentalで、TortoiseBzrだけで作業を完結するのは不可能(ファイルの移動、リネームができない等)。TortoiseBzrなしでQBzrを使うことをおすすめする。
svn連携
- git
- git-svnでsvnリポジトリを外部リポジトリとして扱うことができる。タグもbranchに見えてしまう。大規模プロジェクトのcloneにかかる時間は?
- hg
- 開発中だがまだ実用レベルになっていない。svn co, hg init, して並行管理するのが一般的?
- bzr
- bzr-svnでsvnリポジトリを外部リポジトリとして扱うことができる。bzrのタグがsvn上のtags/タグ名に変換されたり、ほぼ完璧。パフォーマンスに問題があったが、最新版ではほぼ解決されている。
cherrypick
cherrypick とは、ブランチを丸ごとマージするのではなくてブランチの一部分をマージする機能。trunkに対するコミットのうち、バグ修正だけをメンテナンスbranchにmergeするという使い方をする。
ファイル、ディレクトリの移動の追跡ができると、例えばJavaでパッケージ名を変更した後のコミットをパッケージ名変更前に切られたbranchにマージできる。
- git
- git cherrypick 可能。ファイル名変更後の変更は?、ディレクトリ移動後の変更は?
- hg
- 標準添付されているtransplantプラグインを有効にすれば、hg transplantコマンドで可能。ファイル名変更後、ディレクトリ移動後の変更はcherrypick不可。
- bzr
- bzr merge -r10..12 で [10,12] のコミットをcherrypick可能。単一リビジョンの場合は bzr merge -c10(コマンド名、オプション名はsvnと同じ)。ファイル変更後の変更やディレクトリ移動後の変更もmergeできる。
trac
- git, hg
- ○ (複数リポジトリは面倒)
- bzr
- ○ (複数リポジトリはsvnと同等)
個人公開リポジトリ置き場
- git
- github (無料で300MB, wiki, ticket)
- hg
- bitbucket (無料で150MB、 wiki, ticket)
- bzr
- launchpad (無料無制限、 ticket, Q&A管理, アイデア管理, GetText共同翻訳, ML, チーム)
著名なユーザー
- git
- Linux, gnome, gcc, Ruby on Rails
- hg
- Python, Java, NetBeans, OpenSoralis
- bzr
- Ubuntu, MySQL, GNU(bzrはGNU公式プロジェクトの一つ)
そのほか・備考
- 今のところ人気は、たぶんgit>=hg>bzr
- gitのコマンド体系は、一般的なバージョン管理システムと比べるとやや独特。慣れが必要