subversionを使ったA successful Git branching modelの運用
現在のプロジェクトではsubversionを使っているのですが、10人ほどの開発メンバーで並行開発をしているためA successful Git branching modelを参考にFeature branchesを活用した開発スタイルにしています。
A successful Git branching model を翻訳しました
しかしどうしてもブランチの統合時に意味不明なコンフリクト(競合)が発生してしまい、その度に手動(というか目視やメンバー同士の確認)でのマージを行なっておりリリースや統合が高コストになっていました。
例えば以下のような場合
2.のマージの時にfeature1ブランチにhello.jpgがコミットされたという変更履歴が残るため、3.のdevelopへのマージの際にはfeature1ブランチの変更点(コミット)を全てマージしようとするため、再度developにhello.jpgをコミットしてしまうようです。
調べた所reintegrateというオプションを見つけました。
ブランチをトランクにマージするときは、--reintegrate オプションを付ける。
- reintegrate オプションを使うこの形式のマージは一つのブランチにつき一回だけ行える (その後ブランチを更新してもそれをトランクにマージできないので、ブランチはただちに削除するとよい)。ブランチでの変更のうち、トランクからブランチへのマージによるもの以外の変更がトランクに適用され、自動的に svn:mergeinfo 属性が更新される。
Eclipseのsubversiveを使っている場合はマージウィンドウのタブに該当の機能がありました。
ここからマージ作業を行えば、晴れてブランチでの修正分のみがdevelopに取り込めましたとさ!
追記:
mergeの方法についてなのですがdevelop -> featureブランチへの取り込み時に手動でマージ(ファイルを上書きするとか差分エディタで書き込むとか)すると、svn管理上のmergeinfoというプロパティがセットされません。
そのため、reintegrateマージの際に上記コミットがマージコミットとして認識されずに、developへのマージ時にコンフリクトしてしまいます。
developからfeatureブランチへの取り込みの際は必ずmergeコマンド(or eclipseのマージ機能)を使うようにしましょう。
http://www.asahi-net.or.jp/~iu9m-tcym/svndoc/svn_mergeinfo.html