Wie kann man einen Zweigzweig in Subversion / git einfach auflösen?

9

Also habe ich /trunk , wozu letztendlich alle goldenen Dinge gehören. Und ich habe eine Zweigstelle, /topicA .

Normalerweise würden Sie /topicA in trunk zusammenführen und es wäre ein Commit. Hurra! Um diese Zusammenführung rückgängig zu machen, müssen Sie nur die durch diese Zusammenführung verursachte Festschreibung rückgängig machen. Einfach peasy.

Nun, sagen wir, ich habe /topicA und füge es in /trunk ein ... Aber dann habe ich einen Bugfix, der sich auf /topicA bezieht. Also, sollte ich mich wieder zu /topicA verpflichten? Ich kann sogar /topicA erneut auflösen, so dass /trunk /topicA enthält. Aber wie kann ich alle /topicA , ursprüngliche Arbeit UND Bugfixes leicht zurücksetzen?

Commit-Verlauf:

  • Übergeben an /topicA
  • Übergeben an /topicA
  • Übergeben an /topicA
  • ...
  • Merge /topicA in /trunk
  • ...
  • Bugfix1 bis /topicA
  • Remerge /topicA in /trunk für Bugfixes
  • ...
  • Bugfix2 bis /topicA
  • Bugfix3 bis /topicA
  • Remerge /topicA in /trunk für Bugfixes
  • ...
  • ??? (Unmerge /topicA , Bugfixes enthalten)

Ich weiß, dass Sie einfach jeden Bugfix und dann die anfängliche Zusammenführung entfernen können, aber das scheint überhaupt nicht sexy zu sein.

Hat Git auch eine Antwort?

    
Mark Canlas 11.07.2011, 20:46
quelle

6 Antworten

2

Sie können den Verlauf mit

neu schreiben %Vor%

Dadurch wird Ihr Standard-Texteditor mit einer Liste von Commits einschließlich Ihrer Zusammenführungen angezeigt. Entfernen Sie alle Zusammenführungen aus der Liste, die im Editor angezeigt wird, und speichern Sie sie, und beenden Sie sie. git wird alle Commits außer denen, die Sie entfernt haben, erneut wiedergeben und somit den Verlauf neu schreiben. Ihr / topicEine Verzweigung wird weiterhin existieren, sodass Sie sie einfach in einen LKW zusammenführen können.

Es hilft, dass alle Zusammenführungen die Wörter "Zweige zusammenführen" im interaktiven Editor haben, so dass sie leicht zu identifizieren sind.

Hier ist ein Beispiel für den Text im Editor, der gekauft wird, nachdem der Befehl auf einem fiktiven Repository ausgegeben wurde

%Vor%

Sie möchten nicht, dass die Zusammenführung stattfindet, also entfernen Sie einfach diese Zeile und die Zeile davor, da sie in diesem Fall Teil der Zusammenführung ist.

%Vor%

Speichern und beenden und git wird nun diese Commits abzüglich der Zusammenführung wiedergeben.

Beachten Sie, dass Sie jede Zeile entfernen können, und diese Festschreibung wird aus dem Repository entfernt. Außerdem können Sie die Commits in der von Ihnen gewünschten Reihenfolge neu anordnen. Wenn Sie in der Mitte zusammengeführt haben, können Sie sie bis zum Ende ausschneiden und einfügen.

    
James Hurford 23.07.2011 00:25
quelle
1

In unserem Projekt behalten wir einen weiteren Zweig, bis die Integration abgeschlossen ist (trunk_plus_topicA in Ihrem Fall). Es ist aus dem Kofferraum erstellt. Wir verschmelzen mit ihm sowohl vom Stamm als auch von topicA.

Dann, nachdem Integrationstests abgeschlossen sind und wir sicher sind, dass wir topicA wollen, wird das gesamte topicA_plus_trunk in den trunk integriert (oder Sie können trunk mit trunk_plus_topicA ersetzen).

In canse, wenn topicA nur mit dem trunk zusammengeführt werden soll (oder überhaupt fallen gelassen wird), brauchen Sie keine zusätzliche Verzweigung. Sie können Commits vom Stamm einfach mit dem topicA verschmelzen. Bugfixing, Integration und Tests in topicA, und am Ende alles auf einmal in den Trunk verschmelzen.

Wie mein Freund sagt - "der einfachste Weg, einen kaputten Teller zu reparieren, ist, ihn nicht zu bremsen." Dieser Ratschlag funktioniert im echten Leben nicht gut, funktioniert aber oft im Software-Engineering.

    
Michał Šrajer 25.07.2011 22:21
quelle
0

Wenn Sie zwischenzeitlich keine anderen Arbeiten durchgeführt haben, können Sie mit git reset --hard <sha-1> Ihren Arbeitsbaum auf eine ältere Zeit zurücksetzen und dann topicA vor trunk erneut auflösen.

    
X-Istence 11.07.2011 20:52
quelle
0

Leider ist es wahrscheinlich keine einfache Antwort dafür. Es hängt davon ab, ob die Commits gepusht wurden und sind daher "öffentlich" für andere Entwickler (die dann möglicherweise auf ihnen basieren).

Wenn die Commits gepusht wurden, ist Ihre einzige wirkliche Lösung, eine Reihe von Reverts zu machen und diese zu drücken.

Andernfalls haben Sie Optionen, um vor der ersten Zusammenführung zurückzusetzen, die Bugfixes für topicA zu beenden und dann zusammenzufassen, nachdem alle fertig sind (wie X-Isstence vorgeschlagen).

In der Regel killt unser Team in der Regel den Zweig des Themas ab, sobald es mit unserem Äquivalent von "trunk" verschmolzen und gepusht wurde (wir predigen auch mit Squash Merges, so dass alles in einem einzigen Commit erfolgt). Dann werden alle Bugfixes nur auf "trunk" selbst angewendet. Wenn der Themenzweig nicht gelandet sein sollte, können wir den Themenzweig immer wieder aus dem Commit generieren und dann die Zusammenführung wiederherstellen. Der Entwickler schiebt sich dann weg, arbeitet mehr an dem Thema, um es stabiler zu machen, und versucht später, es zusammenzuführen.

    
Christopher Williams 21.07.2011 15:27
quelle
0

Sie können jede der Zusammenführungen mit:

zurücksetzen %Vor%

Wenn Sie jedoch zu einem späteren Zeitpunkt topicA zusammenführen möchten, lesen Sie Ссылка , bevor Sie dies tun.

    
avh 24.07.2011 08:23
quelle
0

Stellen Sie den Stamm wieder auf, bevor Sie den Zweig zum ersten Mal in den Zweig eingefügt haben. Führen Sie dann jede Änderung, die nicht mit der Verzweigung, die Sie vorgenommen haben, nicht mit dem Stamm verbunden ist, erneut zusammen.

Das ist alles andere als elegant oder ideal oder "sexy", aber es kann viel einfacher sein, Zweigwechsel einzeln zu machen, je nachdem, wie viel Arbeit mit dem Zweig am Stamm gemacht wurde.

    
Emilio M Bumachar 26.07.2011 20:22
quelle

Tags und Links