svn mergeの備忘録

会社ではSubversionによるsourceのversion管理、更にSubversion(のcommand類)を内部で用いている社内systemを開発していながら、まだmergeって一回もやった事がなかった。それってSubversion使ってる意味あんの?って感じだけど、まぁ現状backup目的にSubversionを用いてる感じだからしょうがない。
そんなだからどっか別でSubversionについて理解していかないと覚わらないので、作ってる社内systemをしっかりversion管理していく事にした。
branchを切って機能が出来上がった時点でtrunkへmergeするようにしている。先日ようやくmergeを試したのでmemo。ちなみにcommandではなくTortoise SVNから行ったけど、Tortise SVNでmergeする上で、mergeがどういった動作を行うものなのかちゃんと理解できてなかったので結局svn mergeが何を行うものなのか調べながらやってった。

以下memo。(mergeが何なのか?じゃなくてsvn mergeの使い方のmemoなので注意)

下のような構成のSubversion管理directoryがあるとする。

/trunk
/branch/v1 (1-10)

v1の括弧内はrevisionの範囲。10がHEAD revision。このv1をtrunkへmergeする。

まずはtrunkをcheckoutする。mergeはmerge先(trunk)のdirectoryをcheckoutした所で行う。

$~ svn co /trunk
$~ cd trunk

次にmerge command。mergeしたいrevisionの範囲とpathを指定すればいい。
最後にcommitを。

$~ svn merge -r 1:HEAD /branch/v1
$~ svn commit -m "hogehoge"

これでv1のrevision1〜HEAD(10)の間の変更点が差分としてtrunkへmergeされる。ここでconflictが起こったから解決を。
commandだとすごいシンプルで分かりやすいと思うのだけど、Tortise SVN上だと少し分かりにくかった。特にrevisionの範囲指定がよく分からなくて…(自分だけ?)。GUIなのに…。
一つ思ったのが、branchの所でtrunkへmergeできないのか?って事。「trunkでbranchを取り込む」じゃなくて「branchをtrunkへmerge」したかった。最初そのつもりでTortiseをいじってたから余計混乱したのかも。

今version管理だとGitが広がってきてるけど、Gitを理解する上でSubversionがどういうものであったかを知る必要があるよね。まぁSubversion使う時にCVSについては全く調べてないんだけど。
Gitはまだ業務で使う事は当分なさそうだけど、defact standardがCVSからSubversionへ移ったように、次にSubversionがGitへとShiftする時に困らないようにしておかないと。SubversionとGitは違うものだけど、対応するcommandはあるわけだからSubversionの理解を深めておく事は悪くないと思う。