Wie kann ich --hard HEAD auf Mercurial zurücksetzen?

75

Ich bin ein Git-Benutzer, der versucht, Mercurial zu verwenden.

hg backoutFolgendes ist passiert: Ich habe ein Änderungsset erstellt, das ich zurücksetzen wollte. Das hat einen neuen Kopf erzeugt, also hat hg mich angewiesen, ihn zusammenzuführen (zurück zu "Standard", nehme ich an). Nach dem Zusammenschluss wurde mir gesagt, dass ich mich noch festlegen musste. Dann bemerkte ich etwas, was ich falsch gemacht hatte, als ich einen Konflikt in der Zusammenführung löste, und entschied hg backout, dass ich alles wie zuvor haben wollte , das heißt, ich möchte, dass diese nicht festgeschriebene Zusammenführung verschwindet. Auf Git wäre dieses nicht festgeschriebene Zeug im Index und ich würde es nur tun git reset --hard HEAD, um es zu löschen, aber nach dem, was ich gelesen habe, existiert der Index auf Mercurial nicht. Wie kann ich mich zurückziehen?

Helder S Ribeiro
quelle

Antworten:

93

Wenn Sie sich noch nicht verpflichtet haben und es so klingt, als hätten Sie es noch nicht getan, können Sie die gesamte Zusammenführungsarbeit rückgängig machen hg update --clean.

In neueren Mercurials gibt es jedoch einen praktischen Befehl zum erneuten Zusammenführen einer einzelnen Datei : hg resolve path/to/file.ext. Aus dem hg help resolve:

The available actions are: ...

 4) discard your current attempt(s) at resolving conflicts and

Starten Sie die Zusammenführung von Grund auf neu: "hg Datei auflösen ..." (oder "-a" für alle nicht aufgelösten Dateien)

Ry4an Brase
quelle
Entschuldigung, ich bin immer noch ein bisschen verwirrt: Ich bin gelaufen hg up -C, aber das "Backed Out" -Commit befindet sich immer noch an der Spitze meines Zweigs. Ich dachte, dies wäre ein "Geisterzweig", der mit dem erstellt wurde backout, aber läuft hg branchzurück default, also bin ich doch im Hauptzweig?
Helder S Ribeiro
5
Sie können zwei Köpfe mit demselben Zweig haben, und das haben Sie. Sie sind beide benannt default. Dies ist eine ganz normale Situation in Quecksilber und ' hg headsist der Befehl, mit dem Sie es entdecken / verstehen. Wenn Sie hg backoutes ausgeführt haben, "Übernehmen Sie die zurückgesetzten Änderungen als neues Änderungsset", damit ein neues Änderungsset erstellt wird, das ohne heldenhaften Aufwand nicht verschwindet. Jetzt haben Sie zwei Köpfe in dem Zweig mit dem Namen default. Nachdem Sie hg merge(und es festgeschrieben) haben, befinden Sie sich wieder in einem Kopf des Zweigs mit dem Namen default.
Ry4an Brase
23

Das ist nah:

hg update --clean

sblom
quelle
5
Ja ... manchmal jedoch, wenn Sie Dateien verschieben (von einem Verzeichnis in ein anderes) und dann beschließen, alles zu kratzen, funktioniert es nicht wie zuvor git reset --hard. Ergo - mercurial ist dumm
iLemming
13

Von git Befehle:

git reset --hard     # reset to last commit    
git clean -df        # delete untracked files

sind gleich

hg update --clean    # reset to last commit  
hg purge             # delete untracked files
Dariusz Filipiak
quelle
8
Während dieses Code-Snippet die Frage lösen kann, hilft eine Erklärung wirklich dabei, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage in Zukunft für Leser beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
Kyll
git reset --hardlöscht keine nicht verfolgten Dateien.
Ruslan
Funktioniert bei mir nicht hg update --clean 18:8e139889ff02sagt "2 Dateien aktualisiert", aber wenn ich mir das Protokoll ansehe, ist es immer noch da, wo es war. UPD : Das heißt, es hat die Dateien auf die Revision zurückgesetzt. Welches ist jedoch nur die Hälfte des git reset --hardVerhaltens.
Hi-Angel
11

Auf der GitConcepts- Seite des Hg-Handbuchs wird erläutert, wie viele Aktionen ausgeführt gitwerden, mit denen Benutzer in Mercurial vertraut sind.

Mercurial hat kein eingebautes git reset --hardVerhalten. Die stripErweiterung bietet jedoch einen stripBefehl, der dies tut. Zur Verwendung aktivierenstrip Sie zuerst in Ihrer ~/.hgrcDatei ::

[extensions]
strip =

Hinweis: Diese Erweiterung wird in Mercurial 2.8 neu ausgeliefert. Frühere Versionen lieferten den stripBefehl in der mqErweiterung .

Jetzt können Sie Befehle wie hg stripoder sogar ausführen hg help strip. Geben Sie zum Ändern eines Änderungssatzes und aller untergeordneten Elemente einfach diesen Änderungssatz als Argument an an hg strip. Um beispielsweise das zuletzt vorgenommene Commit zu entfernen (nachdem Sie Befehle verwendet haben, die hg rollbackgemeldet haben, dass keine Transaktion mehr zurückgesetzt werden muss), können Sie die tipRevision entfernen . Jedes Mal, wenn Sie diesen Befehl ausführen, wird eine weitere Revision entfernt. hg stripDie Handlungen sollten als irreversibel angesehen werden. Unbekannte Benutzer sollten vor der Verwendung Backups ihrer Repositorys erstellen.

$ hg strip tip

Mit der Revsets-Syntax gebe ich beispielsweise an, dass ich alle Commits entfernen möchte, die dazu führen, dass beim Ausführen zusätzliche Köpfe angezeigt werden hg heads. Wenn Sie im folgenden Ausdruck eine bestimmte Revision angeben tip, wird alles im aktuellen Zweig, der kein Vorfahr der von Ihnen ausgewählten Revision ist, gekürzt. Dies scheint dem gewünschten Verhalten am nächsten zu kommen, wenn ich den Befehl erteile git reset --hard HEAD.

$ hg strip "branch(tip) and not(ancestors(tip)::tip)"
Binki
quelle
2
Mercurial 2.8 und höher hat eine stripErweiterung für den Fall, dass man den hg stripBefehl nur explizit möchte . Mit using werden auch mqverschiedene andere Patch-Verwaltungsbefehle hinzugefügt.
Davidjb
In TortoiseHg 4.7 und höher kann dies über Datei> Einstellungen> Erweiterungen aktiviert werden. Überprüfen Sie dann den Streifen und starten Sie TortoiseHg neu. Dann Ansicht> ShowConsole, um die Befehlszeile zum Eingeben von z. B. hg strip --keep -r 50
Assad Ebrahim