私はTortoiseSVN、svn、およびサブクリップを使用しており、基本を理解していると思いますが、しばらくの間私を悩ませてきたことが1つあります。マージすると、不要なコードが導入されます。手順は次のとおりです。
trunk/test.txt@r2
。テストファイルは 'A'と戻りで作成されました:
A
[EOF]
branches/TRY-XX-Foo/test.txt@r3
。 trunk
をTRY-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を使用していますが、その外観は次のとおりです。
問題は、両方のsvn
A
<<<<<<< .working
=======
B (unwanted change)
C (important bug fix)
>>>>>>> .merge-right.r341
tortoiseSVNは、状況を2者間マージとして扱います。 3ウェイマージという用語を聞いたので、 Beyond Compare を試してみました。 TortoiseSVNを使って簡単に設定できるようになりましたが、[競合の編集]では次の画面が表示されます。まだ人間の介入が必要なため、これは完璧ではありませんが、少なくとも、どの変更がどこから行われているのかはわかります。
svnmerge でリビジョン4、7、および11-15のみをマージ:
svnmerge.py merge -r4,7,11-15
そして通常のsvnで:
svn merge -c4,7 -r10:15 http://.../branches/TRY-XX-Foo
マージについて明確にすることは、実際には2つのステップがあるということです。
つまり、マージが完了したら、headと他のブランチに対して手動で差分を作成して、マージが正しいことを確認できます。そして、あなたの場合のように何か問題があった場合は、コミットする前に手動で修正できます。
/ヨハン
TortoiseSVNでは、マージするリビジョンのみを指定する必要があります。コマンドラインクライアントとは異なり、たとえば、 -r4:5は、r4とr5の間の変更をマージするために、TortoiseSVNマージダイアログでマージするリビジョン番号として「5」を指定するだけで済みます。不明な場合は、必ずマージダイアログからログダイアログを使用し、そのログダイアログでマージするリビジョンを選択してください(次に[OK]をクリックすると、選択したリビジョンがマージダイアログに自動的に設定されます)。
TortoiseMergeでの競合の解決について:質問のスクリーンショットによると、TortoiseMergeは2つの競合する行(下のビューでは「????」と表示されている行)を表示します。 「B」ではなく「C」の変更を含めたいですか?
必要なリビジョンを正しく含めていると思いますが、マージアルゴリズムは、必要な変更を挿入する場所を見つけることができず、そのため、その上の行も含めています。以下は同じ手順ですが、変更点が異なります。最初は期待どおりに機能すると思います。
$ svnadmin create repo $ svn mkdir -m '' file:// `pwd`/repo/trunk コミットされたリビジョン1。 $ svn mkdir -m '' file:// `pwd`/repo/branches コミットされたリビジョン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 A co.trunk/test.txt $ svn commit -m ' 'co.trunk adding co.trunk/test.txt Transmitting file data。 Committed revision 3。 $ svn copy -m' 'file://`pwd`/repo/trunk file://` pwd`/repo/branches/testbr コミットされたリビジョン4 $ svn co file:// `pwd`/repo/branches/testbr co.testbr A 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
もう1つの方法は、ブランチの不良コミットを手動で元に戻すことです。これにより、通常どおり、ブランチをトランクにマージして戻すことができます。
TortoiseSVN
TortoiseSVNを使用して、ファイルのログビューを開き、問題のあるバージョンを選択して、右クリックメニューから[このリビジョンの変更を元に戻す]を選択します。作業コピーに加えた変更をコミットすると、ブランチを簡単にマージして戻すことができます。
コマンドライン
コマンドラインクライアントでこれを行うには、リバースマージを実行します(これは、Subversionブックを使用したPragmatic Source Controlから取得されます)。問題のあるバージョンと以前のバージョンの間の変更をファイルの作業用コピーにマージします。次に、上記のように変更をコミットし、通常どおり分岐できます。あなたの例では次のようなことをします:
svn merge -r 4:3 test.txt
他のユーザーが指摘したように(気づかなかったので気づかなかった)、ツールを混乱させているのは、このマージの些細な性質(つまり、変更に関するコンテキストの欠如)かもしれません。
私はたくさんのマージを行っていますが、ご存知のようにTortoiseが提供するマージツールはひどいものです。これを頻繁に行う場合、3者間マージツールは絶対に必要です。 Beyond Compareは私の個人的なお気に入りですが、他にも無料のもの(Meld、KDiff3)とそうでないもの(Araxis)があります。
たとえそれが手動で正当性を検証させたとしても、Beyond Compareが最終的に正しいことをしたことに気づくでしょう!
不要な変更が必要ない場合は、リビジョン4:5ではなくリビジョン5だけをマージしてください。つまり、リビジョン5でコミットされた変更をマージします。