2008-11-29 6 views
15

Ich habe TortoiseSVN, svn und subclipse benutzt und ich denke, ich verstehe die Grundlagen, aber eine Sache nervt mich schon seit einiger Zeit: Das Zusammenführen führt unerwünschten Code ein. Hier sind die Schritte.Subversion: Wie füge ich nur bestimmte Revisionen in den Stamm ein, wenn mehrere aufeinanderfolgende Änderungen in einem Zweig vorgenommen werden?

trunk/[email protected]. Eine Testdatei wurde mit 'A' und eine Rückkehr erstellt:

A 
[EOF] 

branches/TRY-XX-Foo/[email protected]. Verzweigt den trunk zu TRY-XX-Foo:

A 
[EOF] 

branches/TRY-XX-Foo/[email protected]. Machte eine unerwünschte Änderung in TRY-XX-Foo und verpflichtet es:

A 
B (unwanted change) 
[EOF] 

branches/TRY-XX-Foo/[email protected]. Einen wichtigen Bugfix in TRY-XX-Foo und verpflichtet es:

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

Nun, ich würde nur die wichtige Fehler beheben zurück zum Stamm zusammenführen möchten. Also, ich führe Merge für die Revision 4:5. Was ich in meinem Arbeitsverzeichnis lande, ist ein Konflikt.

trunk/test.txt:

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

Gegen meinen Willen hat Subversion jetzt „unerwünschte Änderung“ in den Stamm-Code enthalten, und ich brauche sie manuell aussortieren. Gibt es eine Möglichkeit, nur bestimmte Revisionen zusammenzuführen, wenn mehrere aufeinanderfolgende Änderungen in der Verzweigung vorgenommen werden?

Der Teil des Problems ist, dass B (unerwartete Änderung) in .Merge-rechts enthalten ist und ich kann den Unterschied nicht unterscheiden, aus welcher Revision es stammt. Normalerweise benutze ich TortoiseMerge und so sieht es aus.

text.txt.working

+2

Um einen realistischeren Test zu machen, sollten Sie einen 'Kontext' zwischen den Linien hinzufügen, die Sie ändern. Die Textvergleichs- und -zusammenführungstools benötigen einige Kontextlinien zwischen den Änderungen, um automatische Zusammenführungen durchzuführen. Wenn der Kontext nicht groß genug ist, wird der Konflikt wie in Ihrem letzten Beispiel angezeigt. –

+0

@Bert: Bitte stellen Sie es als Antwort, so kann es abgestimmt werden. Ich denke, Sie haben hier einen Punkt. –

+0

können Sie Ihre Bildbreite bearbeiten, es wirft den Fragetext weg. –

Antwort

5

Das Problem ist, dass beide Svn

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

und TortoiseSVN wird die Situation als 2-Wege-merge behandeln. Ich habe von dem Begriff 3-Wege-Merge gehört, also gab ich Beyond Compare einen Schuss. Bei der schnellen Einrichtung mit TortoiseSVN wird mit Edit Conflict der folgende Bildschirm angezeigt. Das ist nicht perfekt, da es immer noch menschliche Eingriffe erfordert, aber zumindest kann ich sagen, welche Veränderungen von wo kommen.

See screenshot.

+0

Mit der Ansicht der Unterdeckungszusammenführung können Sie die ursprüngliche Ansicht aktivieren, die Ihnen die Drei-Wege-Zusammenführungsansicht bietet. Überprüfen Sie die obere rechte Ecke. –

+0

Bitte geben Sie diese Information in Ihre Frage ein, denn dies ist eine Antwort. – guerda

+1

@guerda, posten ich die Verwendung von 3-Wege-Merge-Tool als Antwort. –

35

Merging nur Revisionen 4,7 und 11-15 mit svnmerge:

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

Und mit regelmäßigen svn:

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

Das Ausführen von der Befehlszeile führte immer noch zu dem gleichen Ergebnis wie TortoiseSVN, was zu Konflikten und unerwünschten Änderungen führte. –

+0

Entschuldigung, ich verstehe dein Szenario nicht. Cherry-Picking Revisionen zu fusionieren funktioniert genau wie ich zeige (und offensichtlich, wie Sie es versucht haben), ich bin mir nicht sicher, was das Problem ist. – orip

+0

Orips Antwort sollte richtig sein und Ihnen das gewünschte Ergebnis geben. Vielleicht haben Sie Revision 5 in Ihrer Befehlszeile nicht vergessen. Dann würden Sie offensichtlich die Änderung in die Zusammenführung ziehen. – boutta

0

Wenn Sie nicht wollen, um die unerwünschte ändern, füge Revision 4: 5, aber nur Revision 5 nicht zusammen. Es bedeutet, dass Sie die in Revision 5 festgeschriebene Änderung zusammenführen.

+0

4: 5 bedeutet, nehmen Sie den Unterschied zwischen 4 und 5 und wenden Sie es auf das Arbeitsverzeichnis an. Ich habe -c5 Befehlszeilenoption versucht, aber das Ergebnis ist das gleiche. –

1

Eine andere Sache, die Sie tun könnten, wäre, das schlechte Commit auf dem Zweig manuell rückgängig zu machen, was es Ihnen dann erlauben würde, den Zweig wieder in den Trunk zusammenzufassen, wie Sie es normalerweise tun würden.

TortoiseSVN

Mit TortoiseSVN Sie die Log-Ansicht auf eine Datei zu öffnen, wählen Sie die säumige Version, und wählen Sie „Revert Änderungen dieser Revision“ aus dem Kontextmenü. Übernehmen Sie die Änderungen, die es an Ihrer Arbeitskopie vornimmt, und dann können Sie den Zweig einfach wieder zusammenführen.

Command Line

dies mit der Client-Befehlszeile tun Sie eine Reverse-Zusammenführung durchführen, (Dies ist aus dem Pragmatischen Source Control genommen wird Subversion Buch verwenden), wo Sie die Änderungen zwischen der säumigen Version fusionieren und der vorherige Version in die Arbeitskopie der Datei. Dann würden Sie wie oben beschrieben die Änderungen übernehmen und dann normal verzweigen. In Ihrem Beispiel würden Sie so etwas wie:

svn merge -r 4:3 test.txt 
+0

Rückgängig machen ist keine Option seit den unerwünschten Änderungen in Zweigen/TRY-XX -Foo/repräsentieren halbgebackene Features, die nicht in den Trunk integriert werden können. –

2

Ich glaube, Sie die Revisionen werden auch Sie richtig wollen, aber der Merge-Algorithmus versagt, den Ort zu finden, die gewünschte Veränderung zu setzen und so mit der Zeile über sie auch . Hier sind die gleichen Schritte, aber mit einem anderen Satz von Veränderungen, und ich glaube, es funktioniert, wie Sie ursprünglich erwartet:

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

Committed revision 1. 
$ svn mkdir -m '' file://`pwd`/repo/branches 

Committed revision 2. 
$ svn co file://`pwd`/repo/trunk co.trunk 
Checked out revision 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 

Committed revision 4. 
$ svn co file://`pwd`/repo/branches/testbr co.testbr 
A co.testbr/test.txt 
Checked out revision 4. 
$ cat > co.testbr/test.txt << EOF 
> A 
> A1 unwanted 
> B 
> C 
> EOF 
$ svn commit -m '' co.testbr 
Sending  co.testbr/test.txt 
Transmitting file data . 
Committed revision 5. 
$ cat > co.testbr/test.txt << EOF 
> A 
> A1 unwanted 
> B 
> B1 wanted 
> C 
> EOF 
$ svn commit -m '' co.testbr 
Sending  co.testbr/test.txt 
Transmitting file data . 
Committed revision 6. 
$ svn merge -r 5:6 file://`pwd`/repo/branches/testbr co.trunk 
--- Merging r6 into 'co.trunk': 
U co.trunk/test.txt 
$ cat co.trunk/test.txt 
A 
B 
B1 wanted 
C 
1

Wie von anderen Benutzern darauf hingewiesen (Ich werde nicht nehmen Kredit für es zu merken, weil ich didn‘ t), kann es die triviale Natur dieser Zusammenführung sein (dh Mangel an Kontext um die Veränderung herum), der die Werkzeuge verwirrt.

Ich mache eine Menge Merge und, wie Sie entdeckt haben, ist das Merge-Tool von Tortoise schrecklich. Ein Drei-Wege-Merge-Tool ist ein absolutes Muss, wenn Sie dies sehr oft tun. Beyond Compare ist mein persönlicher Favorit, aber es gibt andere, die frei sind (Meld, KDiff3) und solche, die nicht sind (Araxis).

Sie werden feststellen, dass Beyond Compare am Ende das Richtige getan hat, auch wenn Sie es manuell auf Korrektheit überprüfen müssen!

+0

Mangel an Kontext ist sicherlich der Schlüssel, also "mehrere aufeinanderfolgende Änderungen". –

2

Nun, eine Sache über Merge zu klären ist, dass es tatsächlich 2 Schritte hat.

  1. Merge
  2. Commit

das bedeutet also, dass nach der Zusammenführung erfolgt ist, eine manuelle diff gegen den Kopf tun und den anderen Zweig, um sicherzustellen, dass die Zusammenführung korrekt war. Und wenn etwas falsch war, wie in Ihrem Fall, können Sie es manuell vor dem Festschreiben beheben.

/Johan

2

In TortoiseSVN, müssen Sie nur die Änderungen angeben, die Sie zusammenführen möchten. Im Gegensatz zum Befehlszeilenclient, bei dem Sie z. -r4: 5 Um die Änderungen zwischen r4 und r5 zusammenzuführen, müssen Sie nur 5 als Revisionsnummer angeben, die im TortoiseSVN-Zusammenführungsdialog zusammengeführt werden soll. Wenn Sie sich nicht sicher sind, verwenden Sie immer den Protokolldialog aus dem Zusammenführungsdialog und wählen Sie die Revisionen, die Sie in diesem Protokolldialog zusammenführen möchten (klicken Sie dann auf OK und die ausgewählten Revisionen werden automatisch im Zusammenführungsdialog eingestellt).

Wie zur Lösung Ihres Konflikts in TortoiseMerge: Laut dem Screenshot in Ihrer Frage, TortoiseMerge zeigt Ihnen zwei Konfliktlinien (die als '????' in der unteren Ansicht angezeigt). Was Sie wollen, ist die Änderung "C" aber nicht "B"?

  • Klicken Sie auf das erste '???' Linie, um es auszuwählen, dann mit der rechten Maustaste, wählen Sie "Block verwenden von" meins "" aus dem Kontextmenü
  • mit der linken Maustaste auf die zweite '???' Linie, um es auszuwählen, dann mit der rechten Maustaste, wählen Sie "Block verwenden von" ihr "" aus dem Kontextmenü
  • Klicken Sie auf die Schaltfläche Speichern (oder Datei-> Speichern)
  • Optional klicken Sie auf die Schaltfläche "Als gelöst markieren"
+0

Zunächst einmal, vielen Dank für das großartige Werkzeug. Ich habe mit den TortoiseSVN-Updates Schritt gehalten, daher weiß ich, dass Sie 5 anstelle von 4-5 angeben müssen. –

+0

In diesem vereinfachten Beispiel ist es einfach, den "unerwünschten" Teil zu bestimmen, aber Subversion hätte keine Änderungen von r4 mitbringen sollen. In Wirklichkeit ist es schwer zu sagen, welcher Teil von der unerwünschten Revision stammt, die ich nicht angegeben habe. Ich führe häufig Zweigänderungen zusammen, die von anderen geschrieben wurden. –

+0

Nun, Subversion fusionierte tatsächlich nicht r4. Das Problem, das Sie hier sehen, ist, dass Subversion einen Konflikt festgestellt hat, und um diesen Konflikt anzugeben, markiert er nicht nur die widersprüchlichen Zeilen, sondern auch eine Zeile um die widersprüchlichen Zeilen (d. H. Kontextlinien). Wenn Sie eine Linie D hätten, wäre diese Linie auch – Stefan

Verwandte Themen