Hey, ich möchte einige Changesets in Hg zurücksetzen, aber es fällt mir schwer.
Ich habe aus Versehen einige Änderungen vorgenommen, also wollte ich das rückgängig machen. Nachdem ich ein wenig versucht hatte, konnte ich hg backout
, aber es wurde ein neues Commit erstellt. Nun wollte ich, dass mein Repo in den Anfangszustand überging (ohne die letzten 2 Commits und mit meinen Änderungen im Arbeitsverzeichnis). Anscheinend gibt es keine Möglichkeit, dies zu tun (ähnlich wie git reset --soft
). Gibt es?
Eine andere Sache, die ich ausprobierte, war, das letzte Commit (dasjenige, das das ursprüngliche zurückgenommen hatte) loszuwerden. Es wäre etwas wie git reset --hard
, aber auch hier gibt es keine Möglichkeit. Ich kann hg update -C
, aber das ist mehr wie git checkout
, da das Commit immer noch da draußen ist.
Und auch hg update -C -r X
bringt mich zurück zu Revision X, aber wenn ich hg log
überprüfe, kann ich nicht wissen, in welcher Revision ich gerade bin. Der einzige Weg ist, meine Bash-Geschichte zu überprüfen, ist das richtig? Es muss eine Möglichkeit geben, das zu wissen.
Jedenfalls habe ich versucht, das für eine Weile zu klären, aber ich konnte nichts finden, was es lösen würde. Die Referenzen, die ich beim Vergleichen von git- und hg-Befehlen gefunden habe, sind nicht genau, da die Befehle nicht genau dasselbe Verhalten haben.
Ich möchte nur wissen, was die REAL-Äquivalenzen in% für git reset --hard
und git reset --soft
...
Danke.
Mercurial macht das absichtlich nicht leicht. Mercurials Denkweise besteht darin, dass Code, der festgelegt wurde, weiter existieren sollte - dass die Aufzeichnung dessen, was nicht geklappt hat, fast so wichtig ist wie eine Aufzeichnung dessen, was getan wurde. Es ist besser, die Negation Ihrer Arbeit zu begehen (was backout
tut) und immer noch den Datensatz zu haben, als ihn tatsächlich zu verwerfen.
Wenn Sie diese Änderung jedoch nicht einfach lassen können (gute Gründe: Es enthält ein Passwort, das Sie nicht ändern können, schlechter Grund: Es hat einfach nicht geklappt), haben Sie einige Optionen:
>hg clone -r LASTCHANGESETYOULIKE oldrepo newrepo
und jetzt hat newrepo alles bis einschließlich LASTCHANGESETYOULIKE. Archivieren Sie oldrepo und benennen Sie newrepo in oldrepo um. Hier erfahren Sie, wie Sie git reset --soft
ausführen können. Nehmen wir an, Sie haben ein Diagramm wie folgt:
Dabei steht X
für das fehlerhafte Commit und -X
für das Backout, das Sie erstellt haben. Sie möchten nun X
und -X
loswerden, während die Arbeitskopie so aussieht, wie wenn Sie X
festgeschrieben haben. Sie tun
Wenn Sie möchten, können Sie mit Mercurial 1.7 einen Alias erstellen:
%Vor% Die schmutzige Arbeitskopie nach hg revert
macht es notwendig, hg strip --force
zu verwenden. Sie verwenden diesen neuen Befehl als
wodurch 10 und alle untergeordneten Elemente entfernt werden, während die Änderungen in der Arbeitskopie unverändert bleiben. Sie können dies natürlich weiterführen und einen hg reset
-Befehl implementieren:
Das größte Problem bei diesen Aliasen ist die schlechte Fehlerbehandlung. Eine in Python geschriebene Erweiterung wäre viel robuster und wartbarer - vielleicht könnten Sie eine solche "reset" -Erweiterung machen und sie auf Bitbucket veröffentlichen:)
Sie haben bereits einige gute Antworten, aber noch ein paar Anmerkungen:
Nicht sicher über die Git-Dinge, aber wenn Sie nicht gedrängt haben, können Sie hg rollback
verwenden. Wenn du gedrängt hast, gibt es nicht wirklich Anständiges, was du dagegen tun kannst.
Wie für die aktuelle Revision, siehe hg id
.