1

TFS 2010 でブランチをマージするときに発生する可能性のある問題を調査しています。

私が試したすべての組み合わせは、1 つを除いて完全に機能しました。なぜそれが機能しないのか、および/または私が間違っていることを誰かが理解するのを手伝ってくれることを願っています.

それは完全に再現可能であり、以下にその方法を説明しました。

問題のシナリオ

環境:

  • 両方のブランチに、MyProject という 1 つの C# ライブラリ プロジェクトがあります。
  • 各プロジェクトには、MyClass と MyOtherClass という 2 つのクラスがあります。
  • ブランチ A が親ブランチであり、そこからブランチ B が作成されています。

シナリオ:

  • MyClass.cs はブランチ A で編集され、名前が MyClassRenamed.cs に変更されます。
  • MyClass.cs はブランチ B で競合する変更を加えて編集されていますが、その名前は保持されています。

結果:

  • 変更をマージすると、1 つの競合が発生します。
  • 競合は自動マージできず、名前の変更ではなく、ファイルの内容に関する問題のみを示します。
  • 競合を解決すると、競合を解決したときのファイルの名前に関係なく、両方の環境で異なる名前のファイルが残ります。

正しいシナリオ

興味深いことに、シナリオが逆の場合は動作が異なります。以下を参照してください。

  • MyClass.cs はブランチ A で競合する変更を加えて編集されていますが、その名前は保持されています。
  • MyClass.cs はブランチ B で編集され、名前が MyClassRenamed.cs に変更されます。

結果:

  • マージすると、2 つの競合が発生します。
  • 1 つの競合はプロジェクト ファイルであり、もう 1 つは名前が変更されたファイルです。
  • 名前が変更されたファイルの競合は自動マージできませんが、名前が変更されたことを通知し、マージされたファイルの新しい名前を要求します。
  • その後、そのファイルの変更をマージできます。
  • その後、プロジェクト ファイルの変更をマージできます。
  • 競合を解決すると、競合を解決したときのファイルの名前に関係なく、両方の環境で異なる名前のファイルが残ります。
  • すべてが期待どおりに機能し、両方の環境でファイルの名前が変更され、変更が同期されます。

結論

私が見る限り、唯一の解決策は、ファイルの名前を変更することを避け、マージ後に手動で問題を修正することです。

4

1 に答える 1

1

シナリオを少し拡張させてください。

  • MyClass.cs はブランチ A で編集され、名前が MyClassRenamed.cs に変更されます。

  • MyClass.cs はブランチ B で競合する変更を加えて編集されていますが、その名前は保持されています。

  • これらのブランチの 1 つを統合ブランチ (ブランチ A としましょう) にマージする必要がありました。

  • この時点で、ブランチ B に取り組んでいるチームは、変更を統合ブランチにマージすることを決定しました。インテグレーションにマージする前に、変更をインテグレーションからプル ダウンしてブランチ B にマージすることをお勧めします。それを実行して競合を修正した後でのみ、ブランチ B をインテグレーションにマージします。

  • 次にブランチ A がマージされるときも、適切なプラクティスに従う必要があります。

上記の方法により、異なるブランチでファイル名が異なるという問題が解決されるはずです。

于 2012-10-24T12:07:35.067 に答える