16

私はTortoiseSVN、svn、subclipseを使用していて、基本は理解していると思いますが、しばらくの間私を悩ませてきたことが1つあります。それは、マージによって不要なコードが導入されることです。手順は次のとおりです。

trunk/test.txt@r2。テストファイルは「A」とリターンで作成されました:

A
[EOF]

branches/TRY-XX-Foo/test.txt@r3。に分岐しましtrunkTRY-XX-Foo

A
[EOF]

branches/TRY-XX-Foo/test.txt@r4。に不要な変更を加えTRY-XX-Fooてコミットしました:

A
B (unwanted change)
[EOF]

branches/TRY-XX-Foo/test.txt@r5。重要なバグ修正をTRY-XX-Foo行い、それをコミットしました:

A
B (unwanted change)
C (important bug fix)
[EOF]

ここで、重要なバグ修正のみをトランクにマージしたいと思います。だから、私はリビジョンのためにマージを実行し4:5ます。作業ディレクトリにたどり着くのは競合です。

trunk/test.txt

A
<<<<<<< .working
=======
B (unwanted change)
C (important bug fix)
>>>>>>> .merge-right.r5
[EOF]

私の意志に反して、Subversionはトランクコードに「不要な変更」を含めたので、手動でそれらを取り除く必要があります。ブランチで複数の連続した変更が行われたときに、指定されたリビジョンのみをマージする方法はありますか?

問題の一部は、B(不要な変更)が.merge-rightに含まれていて、それがどのリビジョンからのものであるかを区別できないことです。私は通常TortoiseMergeを使用しますが、次のようになります。

text.txt.working

4

8 に答える 8

38

リビジョン4、7、および11〜15のみをsvnmergeとマージします。

svnmerge.py merge -r4,7,11-15

そして通常のsvnで:

svn merge -c4,7 -r10:15 http://.../branches/TRY-XX-Foo
于 2008-11-29T00:15:43.360 に答える
5

問題は、両方のsvn

A
<<<<<<< .working
=======
B (unwanted change)
C (important bug fix)
>>>>>>> .merge-right.r341

TortoiseSVNはこの状況を双方向マージとして扱っています。3ウェイマージという用語を聞いたことがあるので、BeyondCompareを試してみました。TortoiseSVNを使用してすばやくセットアップすると、[競合の編集]で次の画面が表示されるようになりました。まだ人間の介入が必要なため、これは完璧ではありませんが、少なくとも、どの変更がどこから来ているのかはわかります。

スクリーンショットを参照してください

于 2008-12-14T00:14:27.787 に答える
2

必要なリビジョンを正しく含めていると思いますが、マージアルゴリズムでは、必要な変更を挿入する場所が見つからないため、その上の行も含めています。これは同じ手順ですが、変更のセットが異なります。当初の期待どおりに機能すると思います。

$ svnadmin create repo
$ svn mkdir -m'' file:// `pwd` / repo / trunk

コミットされたリビジョン1。
$ svn mkdir -m'' file:// `pwd` / repo / branchs

コミットされたリビジョン2。
$ svn co file:// `pwd` / repo / trunk co.trunk
リビジョン2をチェックアウトしました。
$ cat> co.trunk / test.txt << EOF
> A
> B
> C
> EOF
$ svn add co.trunk / test.txt
co.trunk / test.txt
$ svn commit -m'' co.trunk
co.trunk/test.txtを追加する
ファイルデータの送信。
コミットされたリビジョン3。
$ svn copy -m'' file:// `pwd` / repo / trunk file://` pwd` / repo / branchs / testbr

コミットされたリビジョン4。
$ svn co file:// `pwd` / repo / branches / testbr co.testbr
co.testbr / test.txt
リビジョン4をチェックアウトしました。
$ cat> co.testbr / test.txt << EOF
> A
>A1不要
> B
> C
> EOF
$ svn commit -m'' co.testbr
co.testbr/test.txtを送信する
ファイルデータの送信。
コミットされたリビジョン5。
$ cat> co.testbr / test.txt << EOF
> A
>A1不要
> B
>B1が欲しかった
> C
> EOF
$ svn commit -m'' co.testbr
co.testbr/test.txtを送信する
ファイルデータの送信。
コミットされたリビジョン6。
$ svn merge -r 5:6 file:// `pwd` / repo / branchs / testbr co.trunk
---r6を'co.trunk'にマージします:
U co.trunk / test.txt
$ cat co.trunk/test.txt
A
B
B1が欲しかった
C
于 2009-01-28T15:02:03.513 に答える
2

マージについてはっきりさせておくと、実際には 2 つのステップがあります。

  1. マージ
  2. 専念

つまり、マージが完了したら、head と他のブランチに対して手動で diff を実行して、マージが正しいことを確認できます。そして、あなたの場合のように何か問題があった場合は、コミットする前に手動で修正できます。

/ヨハン

于 2009-01-29T06:20:05.327 に答える
2

TortoiseSVN では、マージしたいリビジョンのみを指定する必要があります。r4 と r5 の間の変更をマージするために -r4:5 などを指定する必要があるコマンド ライン クライアントとは異なり、TortoiseSVN マージ ダイアログでマージするリビジョン番号として '5' を指定するだけで済みます。よくわからない場合は、常にマージ ダイアログからログ ダイアログを使用し、そのログ ダイアログでマージするリビジョンを選択します (次に [OK] をクリックすると、選択したリビジョンが自動的にマージ ダイアログに設定されます)。

TortoiseMerge での競合の解決について: 質問のスクリーンショットによると、TortoiseMerge は 2 つの競合する行を示しています (下のビューで「????」と表示されているもの)。あなたが望むのは、「B」ではなく「C」の変更を含めることですか?

  • 最初の「???」を左クリック 行を選択して右クリックし、コンテキスト メニューから ["mine" のブロックを使用] を選択します。
  • 2 番目の「???」を左クリックします。行を選択して右クリックし、コンテキスト メニューから ["theirs" のブロックを使用] を選択します。
  • 保存ボタンをクリックします (または [ファイル] -> [保存])。
  • 必要に応じて、[解決済みとしてマーク] ボタンをクリックします。
于 2009-01-30T07:41:12.040 に答える
1

もう 1 つの方法は、ブランチの不適切なコミットを手動で元に戻すことです。これにより、ブランチを通常どおりトランクにマージできます。

TortoiseSVN

TortoiseSVN を使用して、ファイルのログ ビューを開き、問題のあるバージョンを選択して、右クリック メニューから [このリビジョンからの変更を元に戻す] を選択します。作業コピーに加えた変更をコミットすると、ブランチを簡単にマージして戻すことができます。

コマンドライン

コマンド ライン クライアントでこれを行うには、リバース マージを実行します (これは Subversion を使用した実用的なソース管理の本から取得したものです)。そこで、問題のあるバージョンと以前のバージョンの間の変更をファイルの作業コピーにマージします。次に、上記のように変更をコミットすると、通常どおりに分岐できます。あなたの例では、次のようなことをします:

svn merge -r 4:3 test.txt
于 2009-01-28T07:06:21.867 に答える
1

他のユーザーが指摘したように (気づいていなかったので、気づいたことを認めません)、ツールを混乱させているのは、このマージの些細な性質 (つまり、変更に関するコンテキストの欠如) かもしれません。

私は多くのマージを行っていますが、お気づきのように、Tortoise が提供するマージ ツールはひどいものです。これを頻繁に行う場合、3 者間マージ ツールは絶対に必要です。Beyond Compare は私の個人的なお気に入りですが、無料のもの (Meld、KDiff3) とそうでないもの (Araxis) があります。

Beyond Compare が最終的に正しいことを行ったことに気付くでしょう。手動で正確性を検証する必要があります。

于 2009-01-28T18:55:12.950 に答える
0

不要な変更が必要ない場合は、リビジョン 4:5 をマージせず、リビジョン 5 だけをマージします。これは、リビジョン 5 でコミットされた変更をマージすることを意味します。

于 2008-11-29T00:58:13.633 に答える