webentwicklung-frage-antwort-db.com.de

Wie kann ich eine Zusammenführung in Mercurial rückgängig machen und mich später bei diesem Zweig wiederfinden?

Ich habe zwei Zweige, Standard und Zweig1. Aus Versehen hat eine Person in unserem Team branch1 mit der Standardeinstellung zusammengeführt. Der Inhalt in branch1 ist noch nicht mit dem Standard zusammengeführt (er enthält eine grundlegende Überarbeitung der Build & Deploy-Umgebung).

Wir haben ein Experiment mit 'hg backout' durchgeführt und die Zusammenführung zurückgenommen (nicht sicher, ob dies der richtige Weg ist). Dann werden die Änderungen von branch1 standardmäßig gelöscht, was in Ordnung ist - aber wir können nicht mit branch1 zurückkehren. 

Wie sollen wir dieses Problem lösen?

51
Peter Moberg

Es gibt viele Szenarien, in denen Sie dies möglicherweise tun möchten. Ich werde jedes Szenario zur Überschrift machen, sodass Sie das Szenario finden, das zu Ihrem Fall passt. Beachten Sie, dass ich immer noch Mercurial lerne und ich würde gerne Hinweise haben, wenn etwas, das ich sage, falsch ist, die falsche Terminologie verwendet, besser gemacht werden könnte usw.

Keine weiteren Änderungen, Zusammenführen nicht freigegeben (keine Pushes/Pulls)

Der Programmierer hat sich zusammengeschlossen, aber er hat nichts anderes gemacht, noch hat er/sie die Änderungen in irgendeiner Weise mit jemandem geteilt

In diesem Fall verwerfen Sie einfach den lokalen Klon und erhalten einen frischen Klon aus einem sicheren Repository.

Lokale Änderungen über der Zusammenführung, nicht freigegeben

Der Programmierer hat zusammengeführt und arbeitet aufgrund dieser Zusammenführung weiter. Die Änderungen, die auf die Zusammenführung folgten, sollten beibehalten werden, aber die Zusammenführung selbst sollte entfernt werden. Die Änderungen (Zusammenführen + folgende Änderungssätze) wurden mit niemandem geteilt. 

In diesem Fall würde ich eine von vier machen:

  1. Versuchen Sie, die REBASE-Erweiterung zu verwenden. Dadurch werden die Changesets von einem Ort an einen anderen verschoben. Wenn die Änderungssätze auf Codeänderungen basieren, die mit der Zusammenführung eingeführt wurden, müssen einige manuelle Arbeiten ausgeführt werden, um die Unterschiede auszugleichen.
  2. Verwenden Sie die MQ-Erweiterung, um die Changesets in eine Patch-Warteschlange zu ziehen, und verschieben Sie sie dann an einen anderen Speicherort. Dies hat jedoch das gleiche Problem wie die Erweiterung REBASE in Bezug auf Änderungen, die auf der Zusammenführung basieren
  3. Versuchen Sie, die TRANSPLANT-Erweiterung zu verwenden, um die Änderungen von einem Ort zum anderen zu "kopieren". Dennoch besteht das gleiche Problem wie bei den ersten beiden.
  4. Machen Sie die Arbeit erneut, wahrscheinlich mit Hilfe eines differenzierenden Tools, um Änderungen an den Changesets vorzunehmen, die ich verwerfen möchte, und nehmen Sie sie an der richtigen Stelle erneut vor.

Um das Änderungsset "Zusammenführen" + alle folgenden Änderungssätze loszuwerden, gibt es mehrere Optionen:

  1. Verwenden Sie den Befehl strip in der MQ-Erweiterung

    hg strip <hash of merge changeset>
    
  2. Klonen und ziehen und geben Sie den Hashwert der Änderungssets an, die zu der Zusammenführung führen, jedoch nicht eingeschlossen sind. Erstellen Sie im Wesentlichen einen neuen Klon, indem Sie ihn aus dem beschädigten Klon in einen neuen ziehen, und vermeiden Sie, dass Sie die Zusammenführung durchführen, die Sie nicht möchten.

    hg clone damaged -r <hash of first parent> .
    hg pull damaged -r <hash of second parent>
    

Merge drängte zu anderen, Kontrolle über Klone

Der Programmierer hat das Master-Repository oder eine andere Person oder einen anderen aus dem Programmierer-Repository übernommen.) Sie haben jedoch (wie in der Gruppe der Entwickler) die Kontrolle über alle Repositorys, wie in, können Sie Kontakt aufnehmen und sich unterhalten an alle, bevor weitere Arbeit erledigt ist

In diesem Fall würde ich sehen, ob Schritt 1 oder 2 durchgeführt werden könnte, aber es könnte an vielen Stellen erforderlich sein, daher ist dies mit viel Arbeit verbunden.

Wenn niemand auf der Grundlage der Zusammenführungsänderungssätze gearbeitet hat, würde ich zum Bereinigen die Schritte 1 oder 2 verwenden, dann auf das Master-Repository drücken und alle Personen bitten, einen neuen Klon aus dem Master-Repository zu erhalten.

Merge gedrückt, Sie haben keine Kontrolle über Klone

Der Programmierer hat den Mergeset gedrückt, und Sie wissen nicht, wer den Merge-Satz ändern wird. Mit anderen Worten: Wenn es Ihnen gelingt, ihn aus Ihren Repositorys auszumerzen, wird ein verirrter Push von jemandem, der es noch hat, dies tun bringen Sie es zurück.

Ignorieren Sie das Änderungsset für die Zusammenführung und arbeiten Sie in den beiden Zweigen, als ob es nie passiert wäre. Dies wird einen hängenden Kopf hinterlassen. Sie können später, wenn Sie die beiden Zweige zusammengefügt haben, eine Nullzusammenführung für diesen Kopf durchführen, um ihn zu entfernen.

  M         <-- this is the one you want to disregard
 / \
*   *
|   |
*   *
|   |

Arbeiten Sie einfach weiter in den beiden Bereichen:

|   |
*   *
| M |       <-- this is the one you want to disregard
|/ \|
*   *
|   |
*   *
|   |

Später verschmelzen Sie die beiden, die echte Verschmelzung, die Sie möchten:

  m
 / \
*   *
|   |
*   *
| M |       <-- this is the one you want to disregard
|/ \|
*   *
|   |
*   *
|   |

Sie können dann eine Null-Verschmelzung durchführen, um den baumelnden Kopf loszuwerden. Leider weiß ich nicht, wie das geht, außer durch TortoiseHg. Es gibt ein Kontrollkästchen, in dem ich die Änderungen von einem der Zweige verwerfen kann.

Mit TortoiseHg würde ich ein Update auf die Zusammenführung durchführen, die ich beibehalten möchte (oberstes, Kleinbuchstabe m), dann den baumelnden Merge-Kopf unten auswählen und mit der rechten Maustaste darauf klicken und dann "Alle Änderungen aus dem Zusammenführungsziel (andere) Revision verwerfen" aktivieren. : discard changes from target

Wir haben ein Experiment mit 'hg backout' durchgeführt und die Zusammenführung zurückgenommen (nicht sicher, ob dies der richtige Weg ist). Dann werden die Änderungen von branch1 standardmäßig gelöscht, was in Ordnung ist - aber wir können nicht mit branch1 zurückkehren.

Ich benutze den Backout-Vorgang zum Abbruch der Zusammenführung. Sie können nicht remerge, aber Sie können "backout backout merge" rückgängig machen, d. H. Wenn Sie remerge wollen, machen Sie "hg backout" für "Zurückgelegte Merge changeset ..." und bestätigen die Verzweigung erneut.

Beispiel:

  7     M       remerge
  6   /   \
  5   *   |     hg backout 3 (backout backout)
  4   |   *     fix error 
  3   *   |     hg backout 2
  2   M   |     fail merge
    /     \
  1 *     *
    |     |
4

Vielen Dank an alle für den tollen Input! Da wir uns in einer Art Eile befanden, um das Problem zu lösen, und unsere Gruppe bei Mercurial relativ neu ist, haben wir eine sehr pragmatische Lösung gewählt.

Auf unserem Repository-Server haben wir ein neues Repository erstellt und dann das alte Repository bis zur Revision direkt vor der Zusammenführung geklont. Dann drückte der neue Klon auf den Server und schickte den neuen Link an alle. Glücklicherweise sind wir ein ziemlich kleines Entwicklungsteam.

Vielleicht nicht der einfachste Weg, um das Problem zu lösen, aber es hat funktioniert :)

1
Peter Moberg

Diese Antwort setzt voraus, dass Sie bereits gedrückt haben

Dies würde zu (mindestens einem) ungelösten Kopf führen, je nachdem, was Sie gerade vergessen haben. Je nachdem, wer gerade aus welchem ​​Zweig geschoben wurde.

Ich liebe HG und benutze es eifrig, aber ihre Vorstellung von einem Zweig kann jemanden wütend machen, wenn er mit einer Geschichte verbunden ist, die (absichtlich) absichtlich unveränderlich ist.

Aus diesem Grund klone ich normalerweise (lokal) ein Backup des Repos, bevor eine Zweigzusammenführung durchgeführt wird. Ich überprüfe immer, bevor ich ziehe.

Eric Raymond arbeitet an etwas das ist mehr oder weniger DVCS-Agnostiker, der (hoffentlich) in Situationen wie den von Ihnen beschriebenen Oops helfen kann zwei. Trotzdem lohnt sich vielleicht ein Blick. 

Aber nur nützlich, wenn niemand die "ooopsie" Spitze gezogen hat.

0
Tim Post

Sie können eine Verschmelzung nicht wirklich gut zurücknehmen. IMO, der beste Weg, um damit umzugehen, wäre, die Zusammenführung aufzugeben und den Strang der Änderungssätze vor der Zusammenführung fortzusetzen, wobei ein baumelnder Kopf übrig bleibt (der entfernt werden kann). Wenn sich seit der Fusion andere Änderungen ergeben haben, können sie auf den neuen "guten" Kopf umgestaltet werden.

0
Ringding

Ich hatte genau dieses Problem. Ein Mitarbeiter hat meinen Zweig versehentlich mit dem Standardzweig zusammengefügt, obwohl er noch unvollständig war. Anfangs habe ich diese Verschmelzung einfach zurückgenommen, was scheinbar gut funktionierte, bis ich meinen Zweig mit dem Standard für Aufbewahrungszwecke zusammenführen wollte. Dateien, die ich brauchte, wurden beim Zusammenfügen zum Löschen markiert.

Die Lösung bestand darin, den gesamten Weg zurück zu meinem ursprünglichen Ausgang zu gehen, der den Fehler meines Kollegen behebt, und den Fehler wieder herauszuholen. Dadurch wurden die Dateien nicht mehr als gelöscht markiert und ich konnte meinen Zweig erfolgreich mit dem Standard zusammenführen.

0
Justin