Rollback auf eine alte Version in Mercurial (wie git reset)

7

Mit git kann ich ein falsches oder versehentliches Commit mit einem Befehl wie

wegwerfen %Vor%

setzt den aktuellen Zweig (z. B. master ) auf das übergeordnete Commit HEAD^ der aktuellen Revision zurück, ohne den Arbeitsbaum zu berühren - Sie können --soft durch --hard ersetzen, wenn Sie den Arbeitsbaum ebenfalls ausradieren möchten .

Zusätzlich, wenn ich mehr als ein Commit loswerden möchte, kann ich einen Befehl wie

verwenden %Vor%

Das bringt mich genau zum Commit von 53b94d0 zurück, als hätte ich danach nie etwas unternommen.

Was ist das Äquivalent zu Mercurial (hg)?

    
Sophie Alpert 04.07.2012, 04:44
quelle

1 Antwort

19

Obwohl Mercurial keine einfache Alternative bietet und sich von der Idee der veränderlichen Geschichte abwendet, gibt es ein paar Möglichkeiten, um etwas zu erreichen, das eng ist. In diesem Beitrag werde ich einige von ihnen skizzieren.

hg rollback

Wenn Sie Ihren letzten Commit rückgängig machen möchten, können Sie Folgendes verwenden:

%Vor%

wird das Commit rückgängig machen (was den Arbeitsbaum nicht berührt - Sie sollten in der Lage sein, es mit einem hg revert --all oder hg update -C zu verfolgen, wenn Sie auch das gesamte Arbeitsverzeichnis zurücksetzen wollen).

hg Klon -r

Angenommen, Sie möchten Ihr Repository namens giraffe auf Revision 77182fb7451f zurücksetzen. Wenn Sie cd in das übergeordnete Verzeichnis eingeben und ausführen:

%Vor%

Dann werden Sie mit einer neuen Giraffe enden, einem Repository bei Revision 77182fb7451f. (Das cp ist notwendig, um sicherzustellen, dass die neue Giraffe paths (wie die "remotes" von git) korrekt auf den Ursprungs-Repo zeigt anstatt in den giraffe Ordner, wie es standardmäßig wäre.)

Dies ist schneller als das Neuklonen aus dem Internet, da es nur Dateien lokal auf Ihrer Festplatte kopiert (und auf vielen Systemen fest verknüpft, um noch mehr Zeit und Speicherplatz zu sparen), aber in Ihrem Repository immer noch sehr zeitaufwendig sein kann ist groß.

hg strip

Wenn Sie kompliziertere Dinge tun wollen, indem Sie den Commit-Verlauf modifizieren (was übrigens in der hg-Welt etwas verpönt ist), aktivieren Sie zuerst das Erweiterung Mercurial Queues durch Hinzufügen der folgenden Zeilen zu Ihrem .hgrc (Sie müssen keinen Pfad nach dem Gleichheitszeichen angeben):

%Vor%

Dies gibt Ihnen (neben anderen nützlichen Dingen) den Befehl hg strip , um einen Änderungssatz und alle seine Nachkommen vollständig aus einem Repository zu entfernen. So können Sie einen Befehl wie:

verwenden %Vor%

wenn 1cc72d33ea76 das erste "schlechte" Changeset in Ihrem Repository ist, das Sie entfernen möchten.

Leider ist es oft schwierig, genau die richtigen Changesets mit dieser Methode zu entfernen, und es ist zu einfach, mit mehreren Köpfen zu enden (was Sie mit hg heads anzeigen können), was eine langwierige wiederholte Anwendung von hg strip erfordert Gehe dahin, wo du ohne extra Köpfe sein willst.

hg strip mit revsets

Mit hg revsets können Sie alle Vorfahren von . (die aktuelle Version) löschen ), die nicht Vorfahren der Revision sind, zu der Sie zurückkehren möchten, mit einem Befehl wie:

%Vor%

Stellen Sie sicher, dass Sie zuerst ausführen:

%Vor%

zeigt Ihnen alle Changesets, die hg strip entfernen würde, damit Sie sicherstellen können, dass Sie Ihren Commit-Verlauf nicht irreparabel beschädigen (weil Sie Backups haben, oder?).

    
Sophie Alpert 04.07.2012, 04:44
quelle

Tags und Links