1

「メイン」というブランチがあります。2012 年 7 月に、プロジェクトの次のバージョン用に「フェーズ 3」と呼ばれる新しいブランチを作成しました。それ以来、私たちはこれに取り組んできましたが、他の変更がメインに適用されることがあります。

今年の 5 月に、メインからフェーズ 3 へのマージを実行し、これらの変更のいくつかを行いましたが、それはすべて問題ありませんでした。

それから現在までの間に、TFS サーバーを 2008 年から 2012 アップデート 3 にアップグレードしました。 ) これには他にも問題がありました。

先週、メインからフェーズ 3 への別のマージを実行しようとしました。「選択した変更セット」を選択しました。これは、フェーズ 3 ブランチで大量の再作業を行ったため、変更をマージするのが非常に困難であるためです。少し。

しかし、Visual Studio が 2011 年 7 月以降の変更をマージしようとしていたのを見て驚きました。これは、ブランチが作成されるかなり前の年です (実際、プロジェクトのこの部分に最初に変更が加えられました)。

奇妙なことに、フェーズ 3 ソリューションの履歴を表示すると、それを展開してこれらすべての変更を確認できます。したがって、TFS は、既に適用されていることを認識しているようです。

何が起こるかを見るために、以前の変更のいくつかをマージしようとしました。含まれていた唯一の変更は、名前が変更されたか削除されたアイテムに関するものでした。たとえば、ソリューションの名前を変更したため、TFS は古い名前の SLN のコピーを分岐およびマージする必要がありました。または、その後両方のブランチで削除されたが、この新しいマージの時点では削除されていない画像がいくつかありました.

だから私はこれを撤回し、今年の 5 月からすべてをマージしようとしました。つまり、最後のマージの直前です。これは恐ろしい数の変更をもたらしました - 通常のマージ/編集タイプの変更を含むあらゆる種類のもの。だから私もそれを支持しました!

フェーズ 3 から別のブランチを作成しました。2 つのブランチ間でマージできました。TFS アップグレードの約 1 週間前に作成されたと思います。しかし、問題は発生していません。

メインから取られた他のブランチがあります。これらは、TFS が既に行った変更を適用しようとしているという問題が発生しています。

VS2012 update 3 を使用してマージを行っています。念のためVS2010も試してみましたが、同じです。また、同僚が試してみて、同じ症状を確認しました。

フェーズ 3 が main と大きく異なるため、何かをマージするのが非常に難しいことは、役に立たないと思います。

これを解決する最善の方法を誰かが知っていますか? 後で後悔するようなことをするのは少し心配です!

4

2 に答える 2

4

TFS 2008 から TFS 2010 にアップグレードするときに、同様の問題が発生しました。この問題は、おそらく部分的にマージされた変更セットが原因です。つまり、変更セット内のファイルの一部はマージされており、一部はマージされていません。または、ブランチの移動/名前の変更の状況である可能性があります。ブランチの名前変更がこの問題を引き起こす理由の詳細については、こちらの回答を参照してください

TFS 2008 でマージを試みた場合、保留中の変更リストからファイルがチェックされませんでした。TFS は、ファイルを二度とマージしたくないと想定し、その後のマージではそれらのファイルは表示されません。

TFS 2010 以降では、動作が変わります。保留中の変更からファイルのチェックを外すと、次のマージで TFS はそれらのファイルを再度マージしようとします。TFS 201x の動作は正しいと思いますが、MS が動作の変更を強調しなかったのは残念です。

これに該当するかどうかを確認するには、コマンド ラインから次のコマンドを実行します。

tf merge $/tp/main $/tp/phase3 /recursive /candidate

この/candidateスイッチは、マージを実行せずに、マージする変更セットのリストを提供するように TFS に指示します。リストに変更セットの*横に がある場合、これらは部分的にマージされています。

それを修正するには、2 つの選択肢があります。

  1. ファイルをマージして競合を解決します。一度にすべてを実行しようとするよりも、変更セットごとにマージする価値があるかもしれません。これはおそらく少し痛いでしょうが、それが終わったらそれは終わりです。

  2. phase 3ブランチが正しいと確信している場合は、コマンド プロンプトを使用してマージできます。tf merge $/tp/main $/tp/phase3 /version:c123~c456 /recursive /discardwhereを使用c123すると、無視する最も古い変更セットをc456表し、無視する最新の変更セットを表します。この/discardスイッチは、TFS にマージ履歴を更新するように指示します。これにより、マージが完了したと見なされますが、実際にはマージは実行されません。これにより、部分的にマージされた変更セットが候補のリストから削除されます

オプション 2 を選択した場合は、部分的にマージされた変更セットを本当に取得したくないことを確認するために、いくつかの分析を行う必要があります。

于 2013-08-12T21:16:37.200 に答える
0

マージが難しすぎる場合、またはマージを信頼できない場合、唯一の実用的なオプションは「新しい変更セットでそれを踏みにじる」ことです。つまり、TFS の外部で手動でマージを行い、新しい固定変更セットをコミットします。次に、古いブランチを強制終了して、最初からやり直してください。

理想的な状況ではありませんが、ソースの整合性が最も重要です。新しいブランチから開始することで、将来このような問題が回避されることを願っています。

于 2013-08-12T21:55:30.620 に答える