web-dev-qa-db-ja.com

Subversion:ブランチで複数の連続した変更が行われたときに、特定のリビジョンのみをトランクにマージする方法は?

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

trunk/test.txt@r2。テストファイルは 'A'と戻りで作成されました:

A
[EOF]

branches/TRY-XX-Foo/test.txt@r3trunkTRY-XX-Fooに分岐:

A
[EOF]

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

A
B (unwanted change)
[EOF]

branches/TRY-XX-Foo/test.txt@r5TRY-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

16
Eugene Yokota

問題は、両方のsvn

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

tortoiseSVNは、状況を2者間マージとして扱います。 3ウェイマージという用語を聞いたので、 Beyond Compare を試してみました。 TortoiseSVNを使って簡単に設定できるようになりましたが、[競合の編集]では次の画面が表示されます。まだ人間の介入が必要なため、これは完璧ではありませんが、少なくとも、どの変更がどこから行われているのかはわかります。

スクリーンショットを参照

5
Eugene Yokota

svnmerge でリビジョン4、7、および11-15のみをマージ:

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

そして通常のsvnで:

svn merge -c4,7 -r10:15 http://.../branches/TRY-XX-Foo
37
orip

マージについて明確にすることは、実際には2つのステップがあるということです。

  1. マージ
  2. コミット

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

/ヨハン

2
Johan

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

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

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

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

 $ 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 
2
Randy Proctor

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

TortoiseSVN

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

コマンドライン

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

svn merge -r 4:3 test.txt
1
Daemin

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

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

たとえそれが手動で正当性を検証させたとしても、Beyond Compareが最終的に正しいことをしたことに気づくでしょう!

1
Jeremy

不要な変更が必要ない場合は、リビジョン4:5ではなくリビジョン5だけをマージしてください。つまり、リビジョン5でコミットされた変更をマージします。