3

プロジェクトで行った開発の一部はデプロイできず、別のブランチで行う必要がありました。(tortoise の「このリビジョンからの変更を元に戻す」と慎重な編集を介して) 後方の変更をマージし、別のブランチにあるはずだった作業を元に戻し、この逆パッチをトランクにコミットしました。前述のパッチで元に戻された変更を含むブランチを作成したいと思います。これが私がしたことです:

元に戻すリビジョンの前のリビジョンで、新しい開発用の新しいブランチを作成しました。

tortoise SVN で一連のリビジョンをマージすることにより、元に戻すリビジョンを新しいブランチにマージしました。

変更ログを開き、[マージされたリビジョンを含める] と [このリビジョンからの変更を元に戻す] を選択しました。これにより、作業コピーのこれらの変更が元に戻りました。これが、ブランチがどのようになりたいかです。これらの変更をコミットしました。このコミットは、「マージされたリビジョンを含める」の下に元に戻すパッチをリストします。そうすべきだとは思いません。ここに問題があるようです。鍵はおそらく、このパッチ (逆二乗、または元の変更の積) を作成するために実行された操作を Subversion が認識しないように記録することです。

次に、同じ方法 (さまざまなリビジョンのマージ) を使用して、トランクからのすべての変更を新しいブランチにマージしました。これには元の取り消しパッチが 2 回含まれており、私のブランチはトランクと同じになりました (マージされたリビジョンとして 3 回リストされています)。これは望ましい結果ではありません。

<編集 - 解決策>

以下は望ましい動作であり、正しく動作します。

最初に、フォルダ タグ、トランク、ブランチを含む空のリポジトリを作成しました。トランクで、コンテンツ (rev1) を含むファイル file.txt を作成しました。

one
two
three

次に、ファイルを編集して

one
two_edit
three

そしてチェックイン(rev2)。次に、ログで rev2 を選択し、このリビジョンから変更を元に戻すを選択して (rev3) にチェックインしました。ファイルは次のようになります。

one
two
three

次に、 rev3から branch\b1 へのトランクのブランチを作成しました(rev4、was5。この手順では両方を行います)。ブランチ\b1 では、ファイルは次のようになります。

one
two
three

次に、trunk からの rev2 を、祖先 (rev5) を無視してブランチ/b1 に逆マージします。ブランチは次のようになりました。履歴に同様のものが含まれているのはまったくの偶然です。

one
two_edit
three

トランク (rev6) を次のように編集します。

one
two
three
four

トランクからのすべての変更をブランチ/b1 (rev7)にマージします。branch/b1 は次のように正しく表示されるようになりました:

one
two_edit
three
four

</編集 - 解決策>

<編集>

どのように機能するか

以下は望ましい動作であり、イタリック体の手順を次のように実行すると正しく機能します。

最初に、フォルダ タグ、トランク、ブランチを含む空のリポジトリを作成しました。トランクで、コンテンツ (rev1) を含むファイル file.txt を作成しました。

one
two
three

次に、ファイルを編集して

one
two_edit
three

そしてチェックイン(rev2)。次に、ログで rev2 を選択し、このリビジョンから変更を元に戻すを選択して (rev3) にチェックインしました。ファイルは次のようになります。

one
two
three

次に、rev2 から branch\b1 (rev4) へのトランクのブランチを作成しました。ブランチ\b1 では、ファイルは次のようになります。

one
two_edit
three

次に、rev3 をトランクから branch\b1 (rev5) にマージすると、ブランチは次のようになります。

one
two
three

この時点で分岐しているかのように、分岐 3 (rev6) を編集します。歴史に似たようなものが含まれているのは、まったくの偶然です。

one
two_edit
three

トランク (rev7) を次のように編集します。

one
two
three
four

トランクからのすべての変更をブランチ/b1 (rev8)にマージします。branch/b1 は次のようになります。

one
two_edit
three
four

それはどのように機能しますか

以下は実際の動作です。イタリック体のステップが実行されると、正しく機能しません。これは、遡及分岐の複雑さのために必要です。エラーは最終ステップの 2 行目にあります。

最初に、フォルダ タグ、トランク、ブランチを含む空のリポジトリを作成しました。トランクで、コンテンツ (rev1) を含むファイル file.txt を作成しました。

one
two
three

次に、ファイルを編集して

one
two_edit
three

そしてチェックイン(rev2)。次に、ログで rev2 を選択し、このリビジョンから変更を元に戻すを選択して (rev3) にチェックインしました。ファイルは次のようになります。

one
two
three

次に、rev2 から branch\b1 (rev4) へのトランクのブランチを作成しました。ブランチ\b1 では、ファイルは次のようになります。

one
two_edit
three

次に、rev3 をトランクから branch\b1 (rev5) にマージすると、ブランチは次のようになります。

one
two
three

ブランチ\b1 で、ログで rev5 を選択し、このリビジョンから変更を元に戻すを選択して (rev6) にチェックインしました。ファイルは次のようになります。

one
two_edit
three

トランク (rev7) を次のように編集します。

one
two
three
four

トランクからのすべての変更をブランチ/b1 (rev8)にマージします。branch/b1 は次のようになります。

one
two
three
four

</編集>

4

3 に答える 3

6

あなたが説明した問題(およびあなたの解決策)はかなり一般的です。もちろん、別のブランチで「非公開」の変更の開発をすぐに開始する方が賢明だったでしょうが、私たちが住んでいる完璧な世界ではなく、状況が変化することを私は知っています;)。

幸い、SVNなどの優れたバージョン制御システムを使用すると、いつでもどこでも変更を加えることができます。そして、それを行うには複数の異なる方法があります。それで、あなたがあなた自身のためにあなたの質問にすでに答えている間、私はあなたの問題をどのように理解し、どのようにそれを解決したかを自由にドラフトしました。下のグラフは社内の目的にも役立つので、それ以上役に立たなくても害はありません。

ちなみに、私はカメにはあまり詳しくありませんが、SVNコマンドラインよりもチェリーピッキング(あなたの場合は逆チェリーピッキング)が簡単になると思います。特に、選択するコミットが散在している場合。マージ操作にはCLIを使用したいのですが、これは、私が今何をしているのかが非常に明確になることが多いためです;)

私はあなたが私の友人を衝突なしでマージすることを望みます;)

クリストフ

リポジトリタイムチャート

于 2010-09-16T11:03:50.323 に答える
1

TortoiseSVN ブランチ ダイアログで [リポジトリ内の特定のリビジョン] を選択し、...ボタンを使用して、新しいブランチに含める最後のリビジョンを選択します。

分岐時は通常通り。

<編集>

私はあなたの問題を再現しようとしました.トランクにあるものとブランチにあるものを追跡するのは非常に難しいですが、これが私のやり方です.

tags最初に、フォルダー、、、でtrunk空のリポジトリを作成しましたbranch。コンテンツ(rev1)を含むtrunkファイルを作成しました:file.txt

one
two
three

次に、ファイルを次のように編集しました

one
two_edit
three

チェックイン(rev2)。次に、ログで rev2 を選択しrevert changes from this revision、(rev3) を選択してチェックインしました。ファイルは次のようになります。

one
two
three

trunk次に、rev2から(rev4)のブランチを作成しました。branches\b1ファイル内は次のようにbranches\b1なります。

one
two_edit
three

次に、このようにファイルを編集しtrunkてチェックインします(rev5)

one
two
three
four

次に、rev5 のみを選択してからマージし、( rev6 trunk)をコミットします。今はこんな感じbranches\b1branches\b1\file.txt

one
two_edit
three
four

期待どおりにすべてがマージされます。

このプロセスのどこで「間違っている」と思いますか?

</編集>

于 2010-09-04T07:15:34.623 に答える
1

鍵はおそらく、このパッチ (逆二乗、または元の変更の積) を作成するために実行された操作を Subversion が認識しないように記録することです。

マージ追跡、別名mergeinfoがブランチに記録されるのをブロックしようとしていると思います。svn diffまたはを使用してこれを行うことができると思いますsvn merge --ignore-ancestryAdvanced Mergingに関する SVN Redbook を読んでください。具体的には Mergeinfo なしの MergesとNoticing or Ignoring Ancestryを読んでください。

svn diffrev2 から分岐するよりも、rev3 からトランクから分岐を作成し、またはを使用して rev3 の分岐で rev1 から rev2 への変更を適用/キャプチャする方が簡単な場合がありますsvn merge --ignore-ancestry

または、今後のマージから revsvn merge --record-onlyをブロックするためにマージを偽造することを検討することもできます。つまり、元に戻す変更を既にマージしたことをブランチまたはトランクに納得させて、再度適用されないようにすることができます。

于 2010-09-16T00:35:48.543 に答える