Subversionからgitへ移行

http://www.josw.net/blog/?p=982

そうそう。最近、Subversion(以下svn)から別のバージョン管理システムに乗り換えようと模索しております。

たまたまSlashdotに分散バージョン管理システムの記事が載って、たまたまその中の複数ある候補の一つを覚えてたという理由でgitを試用中。

とは言ってもさすがにそれだけの理由で使い始めたわけじゃないわけですが、gitの何がいいと思ったかというと、特にブランチの使いやすさとマージのしやすさってところです。

例えばhogeというリポジトリを作成し、一つブランチ(append_hage)を作るとしましょう。

svn:
リポジトリの作成
$ svnadmin create /hoge –fs-type fsfs

httpd.confの設定して svn mkdir /hoge/trunk /hoge/branchesしてtrunkに何かデータを作成
(長くなるのでtrunkに何かデータを作成の部分だけ)
$ echo ‘hoge’ > /hoge/trunk/text.txt

ブランチの作成
$ svn copy http://localhost/repos/hoge/trunk http://localhost/repos/hoge/branches/append_hage

ブランチ中のtext.txtを編集
$ echo ‘hage’ >> /hoge/branches/append_hage/text.txt

git:
リポジトリの作成
$ mkdir /hoge; cd /hoge
$ git init

何かデータの作成
$ echo ‘hoge’ > /hoge/text.txt

ブランチの作成
$ git branch append_hage

ブランチ中のtext.txtを編集
$ git checkout append_hage; echo ‘hage’ >> /hoge/text.txt

補足説明のためにsvnと gitのここまでの違いを説明すると、svnはsvnadminで作ったリポジトリ内をユーザがtrunkやらbranchesやらディレクトリ作ってそれぞれにファイルを配置して構成するのに対し、gitは置いてあった無垢なディレクトリをおもむろにリポジトリに染め上げ(これが自動的にmasterブランチとなる)、ブランチはgit checkout ブランチ名 で中身をごっそり入れ替えるという感じ。

んで肝心のマージは、ブランチのデータをメインのデータにマージするとしましょう。

svn:
/hoge/trunk上で(nとmはそれらしい数字)
$ svn merge -r n:m http://localhost/repos/hoge/branches/append_hage/

git:
$ git checkout masterしてmasterブランチ上で
$ git merge append_hage

こんな感じ。ごめんsvnは自信無い。理解出来なかった。特にn:mの部分。

そんなわけで、gitはsvnよりマージしやすく感じます。gitが作られた背景を見ても、そう考えられてるのは明らかだし。

svnでも同じようなの出来るのを知らないだけだと思うけど…。

それでも、1年使って馴染めてないsvnより、数日使って馴染めたgitの方が向いてるだろうということで乗り換えてみようかな。

あーこれ書くのに1時間半ほどかかった…。