4

状況は次のとおりです。上流のコード ベース (V1 から V2 へ) からの変更を、V1 から派生/分岐した 3 番目のコード ベース S1 にマージして、新しいコード ベース S2 を生成する必要があります。

V1 と V2 の間のログとリビジョン、および V1 のソース、V2 と S1 のソースのバージョン管理にアクセスできます。ただし、S1 にはバージョン管理リポジトリと履歴が提供されていません。V1 から S に到達するための中間変更が個別に認識されていないため、これをブランチと進化したトランクの間のマージとして扱うことはできません。

そのため、S1 で派生した変更が V2 に基づいて機能するように更新され、S2 を生成するためにインクリメンタル 3 ウェイ マージを実行しているという状況です。(私たちの進化する V2 は当然バージョン管理下に置かれます)

WinMerge は、ディレクトリ構造間で単純に異なる/欠落している/追加されているファイルを識別するのに役立ち、p4merge はファイル レベルでの優れた 3 方向マージ ツールとして使用できることがわかりました。

どのツールとテクニックを提案しますか? コード ベースのサイズが大きく、V1 と V2 の間の中間リビジョンの数が多く、V1 と S の間の変更のサイズも大きいことは注目に値します。

4

5 に答える 5

1

個人的には、前述のクローン検出器ほど派手ではないかもしれませんが、まずはを使用しdiff -u S1 V1 >/tmp/diffs.patchます。これにより、S1で何が変更されたかがわかります。高い割合のdiffをV2にマージできると思いpatch -p0 </tmp/diffs.patchます。パッチを適用できない場合は、可能な限りパッチが適用され、拒否された変更は手動でマージされます。

これにより、すべての「簡単な」部分を数分で処理できるはずです。それを試してから、.patchファイルからいくつかのトリッキーなファイルを削除して、3方向マージを使用してすべてのマージを手動で実行することをお勧めします。

変更が広すぎる場合(大規模なリファクタリングまたはファイルからファイルへの大量のコードの移動)、前述のIraのようなツールを使用する必要がある場合があります。

于 2010-10-23T00:28:01.853 に答える
0

V が適切な VCS にない場合は、V をまったく新しい VCS にインポートして開始することをお勧めします。次に、V1 にブランチを作成し、バックアップ、古いビルド ツリー、作業コピーなどから見つけられる S1 のすべての古いコピーをインポートします。VCS で、V1 から S1 までの履歴をできるだけ多く構築します。誰かが途中で抜本的な再フォーマットを行った場合、同じツールを V2 ブランチのリビジョンに適用することで、それを正常化できる可能性があります。

次に、マージ ツールを使用して、競合を解決します。たくさんある場合 (そしておそらくそうなるでしょう)、中間作業をコミットできるように、V1..S1 および V1..S2 の履歴に沿った段階で段階的にマージすることをお勧めします。

于 2010-10-23T00:36:03.917 に答える
0

マージには Git を使用する必要があります。S1 をチェックアウトしてから、git merge v2 をチェックアウトします。

S1 と V1 の間で多くの変更がある場合、名前の変更などでスローされる競合の量が最小限になると確信できます。または、範囲 v1 から v2 を s1 の上に、または範囲 v1 から s1 を v2 の上にリベースできます。これは実際には 3 通りのマージではありません。

v1..v2 と v1..s1 の履歴を git に取得する方法はあなた次第です。移行ツールが存在しない場合は、各リビジョンでエクスポートをスクリプト化する必要があります。次に、使用している SCM で S2 として S1 の上に結果をコミットします。

お役に立てれば、

私の助けが必要な場合は、#git irc チャンネルで私を見つけることができます。または、マージ作業が非常に得意な人がたくさんいます。

于 2010-10-23T00:55:44.823 に答える
0

知りたいのは、V2 と S1 の間のデルタと、それらがどこにあるかです。

Winmerge は、ファイルがまったく同じか、欠落しているか異なるかを示します。異なる場合、マージの基礎となるものがあれば、共通点はわかりません。

V2 と Sで (私たちの) Clone Detectorを使用して、言語構造の粒度で共通点を見つけます。V2 から S へのクローンであり、同じファイルへのコード ブロックは、ある意味で「既にマージされています」。S の別のファイルに V2 のクローンが存在する場合、コードの移動があった可能性があります。パラメータ化可能な違いがある場合、クローン検出器 (少なくとも私たちのもの) は、パラメータ (「編集」) が何であるかを伝えることができ、それらをマージする方法を決定できます。コードが非常に異なる場合、クローン検出器は何も言いませんが、Winmerge が異なると言うファイルから、クローン検出器がほとんどクローンであると言うファイルを差し引くことで、そのリストを取得できます。これらの非常に異なるファイルは、マージが難しい可能性があります。

ほとんどが互いのクローンであるファイルの場合、Smart Differencerを使用して、V1 ファイルがどのように変更されて S を生成したかを知ることができます。細かい変更情報を提供します。

于 2010-10-12T01:32:55.897 に答える
0

Beyond Compareを強くお勧めします。クリーンな GUI、優れた比較アルゴリズム、3 つのファイルの比較、ディレクトリ構造の比較などがあります。

于 2010-10-23T20:33:44.170 に答える