web-dev-qa-db-ja.com

SVN-ブランチをトランクにマージできません-多数のツリー競合

TortoiseSVNを使用して、単純なシナリオだと思ったものがあります。

1)アプリケーションのブランチ(B2)を作成しました(イメージスプライトとJAWRの実装に取り​​組むため)。

2)テストと開発は通常どおりトランクで行われました。

3)次の方法で、過去数日間に数回ブランチをリベースしました。

3.1)ブランチ(リビジョンの範囲)をbranch-b2作業コピーにマージし、マージ中の競合を解決しました。

3.2)(branch-b2のテスト後)、リベースされたbranch-b2をコミットします。

これはすべて期待どおりに機能しました。しかし、ブランチをトランクにマージすることは私と一緒に進んでいます:

4)branch-b2ですべての更新がコミットされた後。トランクとブランチb2でSVN更新を行うことを確認します。

5)次に、branch-b2のトランク(リビジョンの範囲)をマージしようとします。ただし、トランクに追加され、その後リベースするときにbranch-b2に追加された新しいファイルについては、ツリーの競合が発生します。これらの競合を解決する適切な方法がわからない。

私が見た中で最も典型的なアドバイスは、トランクからツリー競合ファイルを削除してから、ブランチをマージすることです。または、トランク全体を削除し、ブランチファイルをコピーして、トランクで新しいバージョンとしてコミットします。これらのオプションはどちらも良いアイデアのようには見えません。最初のオプションは苦痛であり、両方ともファイルの改訂履歴を失うようです。

私は何を間違えたのでしょうか、どうすれば修正できますか

51
mitch_moop

1.5以前のマージスタイルを使用していて、ブランチをトランクに再統合しようとしているように聞こえます。その場合は、最初にすべてのトランクの変更がブランチにマージされていることを確認してから、ブランチをトランクを指す作業コピーに範囲マージする代わりに、「FROM trunk @HEAD TO branch @ HEAD」を使用して、トランクを指す作業コピーを作成します。本質的に:

「トランクとブランチを同一にするために必要なすべての変更をください」。

トランクとブランチの唯一の違いはブランチで行われた変更であるため、これはすべてのトランクの変更をブランチに既にマージしている場合に機能します。

理にかなっていますか? :)

71
Rytmis

同じ問題を調査しました。 Tortoise SVN 1.6.5では「機能」です。 TortoiseSVN 1.5は、リポジトリ(SVN 1.5)で正常に動作します。 TortoiseSVN 1.6.5は、リベース時にメインラインからファイルを新規として追加します(マージ履歴を保存せずに)。
そして、ブランチを再統合すると、これらのファイルはメインラインと競合するものとして扱われます。

TortoiseSVN 1.6の機能「ブランチの再統合」を使用して問題を解決しました。これは、特に機能ブランチを目的としています。

-アレクセイ・コルスン

3
user185717

@Rytmisの回答に貢献するためのもう少し詳しい情報があります。

トランクをブランチまたはタグとまったく同じように作成する高度な手順:

  1. トランクからのチェックアウト。
  2. トランクの作業コピーを使用して、トランクからブランチ/タグにマージします。
  3. コミット。

'svn'コマンドラインコマンドの例:

svn checkout <trunk url>
cd trunk
svn merge <trunk url> <branch/tag url>
svn commit -m "<message>"
2
Jesse

上記の解決策がどのように機能するかを実際に理解できなかったため、回避策は異なります。まず、トランクからのすべての変更がブランチに含まれていることを確認しました。

1)トランクの新しいコピーを入手しました。 2)亀のsvn exportを使用してブランチを一時的な場所にエクスポートしました。 3)Windowsエクスプローラーを使用してブランチツリー全体をトランクにコピーし、すべてのファイルを上書きしました4)亀の変更チェックコマンドを使用し、すべての未修正ファイルのチェックボックスを含めました。 5)すべてのファイルを選択し、追加をクリックしました。

未修正のファイルに出力が含まれないように、ビルドされていないソリューションを使用する必要があります。

1.5+にアップグレードするまで待ちきれません

1
Starkman

TortoiseSVNを使用して「範囲のマージ」オプションを選択しながら、マージするリビジョンを選択します。これにより、マージ操作ごとに同じファイルが再び競合するのを防ぎます。

1
Dev

私はその問題を解決したと思います。 1.マージした「ブランチ」を右クリックします。 2. Tortoise SVN >> Merge 3をクリックします。「一連のリビジョンをマージする」と次へ4. !!!「リバースマージ」をチェックします!!! 、「ブランチ」からマージするURL、特定の範囲「最近マージされたリビジョン」、および次へ5.次へ6. SVNコミット

その後、ブランチからトランクにマージできます。

0
user8224326