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)?
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.
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).
Angenommen, Sie möchten Ihr Repository namens giraffe
auf Revision 77182fb7451f zurücksetzen. Wenn Sie cd
in das übergeordnete Verzeichnis eingeben und ausführen:
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ß.
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):
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:
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.
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:
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?).
Tags und Links git mercurial version-control