(途中)

ブランチとは

trunk ----A
       |
        --B

branches ----A----my_A
          |
           --B----my_B

いきなりですが、
Subversionは、ブランチを、ブランチとは認識していません。
svn copyコマンドによって作成された、
同じレポジトリ内に共通の履歴を持ったディレクトリのコピーを、
人間がブランチとして認識しているに過ぎないのです。
(後で説明する タグ も全く同じです。)

ですので、ブランチを作るというよりも、
あるリビジョンをBASEとして、ディレクトリ(ファイル)をtrunkから派生させる、
と考えることが重要です。(結局、それはブランチの概念なんですが...w)

ブランチの作成方法

さて、作成方法ですが、2通りあります。

ブランチの作成方法(1)

svn copy trunk/A  branches/A/my_A
svn ci -m 'create branch of trunk/A'

ブランチの作成方法(2)

svn copy http://repo.com/trunk/A  http://repo.com/branches/A/my_A -m 'create ...'

(2)のほうが、svn co(checkout)しなくてよいので効率的です。
既にcheckoutしてある場合には、大した差はありません。

ブランチの運用

ここで、trunk/A/sample.txtと、branches/A/my_A/sample.txt 双方に変更を加え、
それぞれコミットをしたとします。

svn ci trunk/A/sample.text -m 'fix trunk sample.txt' 
... revision 3.

svn ci branches/A/my_A/sample.text -m 'fix branch my_A/sample.txt' 
... revision 4.

そして、以下を実行すると、

svn diff -r 3:4 trunk/A/sample.txt

trunk/A/sample.txtのdiffはbranchとtrunkとの差異の内容を表示してくれます。

このことからも、svn copyで作られたブランチは、
単なるハードリンク的なコピーでしかないことが分かると思います。

ブランチファイルの概念

トランクとブランチは全く同じファイルを参照していると言えます。
では、何が違うのか?

『ファイルのリビジョン管理のストリームが異なる』

        __________> branch
________|_________> trunk

あるファイルに、別のリビジョン管理ストリームを作成する。
これが、ブランチを作成する、という意味となります。
これまでの「リビジョン」という概念に、「ストリーム」という概念が加わるわけです。

作成されたストリームには名前が付けれます。
my-branch, release-1.0 などです。
Subversionでは、この名前をディレクトリ名とそのツリーとして実現しています。

また、このストリーム名をキーに、関連するツリーを取得することができます。

svn co http://example.com/branches/my_A