Wie man einige Änderungen in Hg loswerden kann?

7

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 ...

sind

Danke.

    
Gaisorama 13.11.2010, 13:34
quelle

5 Antworten

8

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:

>
  • strip: Ich mag es nicht zu strippen, es verändert das Repository und legt das Zeug nicht zurück in das Arbeitsverzeichnis. Strip ist aus einem bestimmten Grund standardmäßig deaktiviert.
  • Klon: Mach einfach einen 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.
  • rollback: Dies ist die einstufige Rückgängigmachung der mercurialen Welt. Es hätte dein Commit gleich nach dem Start rückgängig gemacht, aber es funktioniert nicht, wenn du noch andere Pulls oder Commits gemacht hast, die du hast.
Ry4an Brase 13.11.2010 16:34
quelle
7

Hier erfahren Sie, wie Sie git reset --soft ausführen können. Nehmen wir an, Sie haben ein Diagramm wie folgt:

%Vor%

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

%Vor%

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

%Vor%

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:

%Vor%

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:)

    
Martin Geisler 15.11.2010 13:08
quelle
3

Siehe hg strip von der Erweiterung mq .

    
wRAR 13.11.2010 13:50
quelle
2

Sie haben bereits einige gute Antworten, aber noch ein paar Anmerkungen:

  • Wenn Sie nicht festgeschriebene lokale Änderungen haben, stellt shelve diese für den späteren Abruf zur Seite
  • Wenn Ihr Changeset in ein anderes Repository verschoben wurde, bevor Sie beide Repositories bearbeiten, ist ein Backout die einzige Option
  • Mit einem Backout können Sie einen neuen Changeset erstellen, der die Umkehrung des ursprünglichen Changesets ist und unerwünschte Änderungen beseitigt, ohne den Verlauf des Repository zu ändern
  • Ein Rollback ist normalerweise die beste Option, wenn Sie nicht bereits zu einem Remote-Repo gedrängt haben, da dieser den Changeset verdeckt, während Ihre Arbeitskopie intakt bleibt
  • Strip wird einen ganzen Zweig von Änderungen entfernen, aber wie Rollbacks wird es nur dann wegbleiben, wenn Sie die Änderungen nicht anderswo verschoben haben
  • Gleiches gilt für das Klonen eines Repositories bis zu einer vorherigen Revision - die anderen Tools sind sowieso einfacher
Binary Phile 14.11.2010 05:49
quelle
0

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 .

    
Chris Morgan 13.11.2010 13:47
quelle

Tags und Links