2010年2月7日日曜日

SubversionからGitへ移行した理由とこれから

その前に、Macユーザ諸君!

GitのGUIで何かいいのないかなーと探しているあなたに、GitXをおすすめします。ログの閲覧だけかと思いきや、ステージとコミット、ブランチ切りががGUI上でできます。コマンドからの呼び出しもできるので、CUIとGUIの両方の架け橋を綺麗な画面でやってくれる便利君です。GitはGUIがないからなーとか、gitkの画面に絶望したあなたにおすすめです。何ができるかまとめようと思ったんですが、公式サイトに書いてあるので(See it参照 Screencasts=動画もあります)見てみて下さい。ソフトの方はOSSなので、時間を見つけて日本語化の作業をしてpull requestしてみたいと思います。

Windowsユーザの方はTortoiseGitがいいんじゃないでしょうか。

Subversion否定派ではありません

推進派でもないけれど、最初に断っておかないと。SVNは現在も使ってますし、フックスクリプトを書いたり、コマンドを組み合わせて遊んだりしてるので、それなりに使っている方だと思います。中央管理型なので、分散管理型よりも使いどころがあるところはあります。

理由1) リポジトリの作成と複製が簡単

Subversionはまず個人向けではないという気がしています。リポジトリを作るのにadminという他のコマンド系が存在し、リポジトリはチェックアウトして作業用ディレクトリを作らないと使えません。そしてチェックアウトした方の全ディレクトリに.svnというディレクトリが作られます。これはディレクトリをそのままコピーした時に副作用を起こすので扱いに注意が必要です。.svnのアクセス制限を忘れてapache上からリポジトリの中身を見れるという事態も招きます。一方GitやMercruial(以下hg)、Bazaar(以下bzr)は.git .hg .bzrというディレクトリをトップにだけ置くので管理体制がシンプルです。リポジトリの作成は作成したいディレクトリでinitするくらいです。このサクサクやれるのが個人的に好きです。

無責任な話ですが、分散管理の場合、最悪リポジトリサーバがお亡くなりになられても、チームがcloneしているリポジトリから復旧できます。無責任な話と言え、ぶっちゃけ!、社内サーバの管理は徹底してない会社がほとんどじゃないでしょうかw

理由2) ブランチ開発が簡単

SVNでブランチ開発をやったことがないのであれですが、そもそもあまりやろうと思う程にまで便利でないような気がしています。Gitの場合、ブランチを作るのが簡単で、ブランチ用にディレクトリを作る必要はありません。ブランチを切り替えればその状態にファイルを自動で入れ替えてくれます。

Gitでは基本的にmasterは統合ブランチです。統合ブランチの細かい説明は省きますが、要するにいつでもお客さんに見せていい状態であったり、最新版(ただし安定板とは別)という位置づけです。バグ修正や機能追加はトピックブランチを立てそちらで作業を行いテストにパスしたら統合ブランチにマージします。この流れが普通なので、Gitでは簡単にできるようになっています。ブランチで機能追加中に見つけてしまったバグの対応、割り込みの対応、そういったこともGitでは難なく対応できます。

バージョン管理の副作用

バージョン管理というよりも、チーム間でのソースコードの共有という点で問題になるケースがあります。リリースが何回かに分けてされるものは、リリース間近になるとある時点から後に追加される機能は取り込まずに(影響を受けたくないから)、バグ修正に徹底したい時期がくると思います。ここで新機能についてはコミットを中止させておくというのは避け、リリースブランチ(統合ブランチの一つ)を設け、masterブランチ(SVNではtrunk)に新機能、リリースブランチではリリースに特化した作業(バグ修正など)を行います。

SubversionでもGitでも共有するリポジトリにリリースブランチを作ることはしますが、Gitの場合はローカルにだけブランチを作ることが可能なので柔軟に対応できます。(hg、bzrも同様)

Gitに限らず気をつけておくこと

コミットはクリーンでクリアなものでなければなりません。バグ修正と機能の実装が同じコミットに入っていると、他の開発者がバグ修正だけほしい(pullまたはcherry-pickしたい)のに、必要ない機能まで取って来てしまいます。とりあえず何をやっただけ記録するものという運用のやり方では、チーム開発の場合だと限界がやってくると思います。Gitではコミットの前にステージというステップを踏むので、SVNほどシンプルではありませんが、逆にそれが良いコミットができるよう助けてくれます。Gitのコミットの仕方については別の機会に触れます。

SVNからGitへ移行しようと考えている方へ

SVNよりもGitは覚えなければならないことが多いです。SVNとは違い、分散管理は自分自身でリポジトリを管理する能力が必要になるからです。How-to的にまとめておくことが親切ですが、概念もしっかり覚えてもらわないとリポジトリが乱れます。ただし覚えてしまうと開発効率はグンと上がると思います。

それからリポジトリ管理を自分ですることに不安がある方は大丈夫です。やり方はありますが、基本的にgitはあなたがgitにさせたことを全て記録しています。これはコミットだけではなく、resetなどの取り消しも含まれます。間違って取り消してしまっても、実は復旧できるのです!最初のうちは救われますよw というか復旧の仕方をまず最初に知るべきです。これもまた別の機会に。

ちなみに、gitはgit-svnがあるので、gitを使いながら、svnリポジトリにアクセスすることができます。

これから

今年の案件のうち、カスタマイズ用リリースブランチを作る必要があるであろう案件があります。契約がまだ曖昧なのでどうなるか分からないのと、明確になるのかさえ定かでないので、手間ですがカスタマイズ用のリリースブランチ、もしくはリポジトリを作成して作って行く予定です。カスタマイズ用のリリースブランチにするかリポジトリにするか、または別の手段でいくか、いい方法が見つかり実績ができたら、そのことについてまとめたいと思います。

0 件のコメント: