Mercurial macht das letzte Commit rückgängig

125

Wie kann ich meine letzte versehentlich festgeschriebene (nicht gedrückte) Änderung in Mercurial rückgängig machen?

Wenn möglich, wäre eine Möglichkeit mit TortoiseHg vorzuziehen.

Aktualisieren

In meinem konkreten Fall habe ich einen Änderungssatz festgeschrieben (nicht gepusht). Dann habe ich vom Server gezogen und aktualisiert. Mit diesen neuen Updates habe ich entschieden, dass mein letztes Commit veraltet ist und ich es nicht synchronisieren möchte. Es scheint also hg rollbacknicht genau das zu sein, wonach ich suche, weil es den Pull anstelle meines Commits rückgängig machen würde.

Martin Buberl
quelle
1
Was ist mit zwei hg rollbackund dann wieder ziehen?
VonC
1
Der erste Rollback macht den Pull rückgängig, der zweite Rollback sagt mir "keine Rollback-Informationen verfügbar".
Martin Buberl
1
Ich bin auf die gleiche Situation gestoßen, und soweit ich weiß, können Sie nach einer anderen Operation nicht mehr zurückgehen oder sie aus dem Verlauf entfernen. Sie müssten das hg-Repository neu klonen.
3
strip --keep: stackoverflow.com/questions/29413851/… löst die Aufgabe direkt, ebenso wie MQ qimport. Alternativ kann es besser sein, einfach rebaseim Szenario, wenn die lokalen Änderungen ebenfalls beibehalten werden sollen und kein Konflikt vorliegt. (Verwenden Sie eine Zusammenführung, um einige kombinierte Änderungen aus beiden Zweigen beizubehalten, wenn dies das gewünschte Endziel des Diagramms ist, insbesondere in einem Fall ohne schnellen Vorlauf.) Es kann auch gültig sein, nur den Zweig zu schließen, wodurch der Verlauf weiterhin erhalten bleibt (aber anders als eine Zusammenführung) je nach gewünschtem Endzustand.
user2864740
2
Wie @ user2864740 sagt, hg strip --keepwird der Befehl verwendet, aber Sie müssen eine Revision bereitstellen, z hg strip --keep -r .. Diese Antwort erklärt gut stackoverflow.com/a/19064016/1286571
ForeverWintr

Antworten:

77

Ein Weg wäre hg rollback (veraltet ab Hg2.7, August 2013)

Bitte verwenden Sie hg commit --amendanstelle von rollback, um Fehler im letzten Commit zu korrigieren.

Setzen Sie die letzte Transaktion in einem Repository zurück.

Bei Begehung oder Verschmelzung , fügt Mercurial den changeset Eintrag wurde zuletzt.
Mercurial führt vor der Transaktion ein Transaktionsprotokoll mit dem Namen jeder berührten Datei und ihrer Länge. Beim Abbruch wird jede Datei auf ihre vorherige Länge gekürzt. Diese Einfachheit ist ein Vorteil der Erstellung von Revlogs nur . Das Transaktionsjournal ermöglicht auch einen Rückgängig-Vorgang.

Siehe Abschnitt TortoiseHg Recovery :

Alt-Text

Dieser Thread beschreibt auch den Unterschied zwischen hg rollbackund hg strip:
(geschrieben von Martin Geisler, der auch zu SO beiträgt)

  • ' hg rollback' entfernt die letzte Transaktion. Transaktionen sind ein Konzept, das häufig in Datenbanken zu finden ist. In Mercurial starten wir eine Transaktion, wenn bestimmte Vorgänge ausgeführt werden, z. B. Festschreiben, Drücken, Ziehen ...
    Wenn der Vorgang erfolgreich abgeschlossen wurde, wird die Transaktion als abgeschlossen markiert. Wenn ein Fehler auftritt, wird die Transaktion "zurückgesetzt" und das Repository bleibt im gleichen Zustand wie zuvor.
    Sie können einen Rollback manuell mit 'hg rollback' auslösen. Dadurch wird der letzte Transaktionsbefehl rückgängig gemacht. Wenn ein Pull-Befehl 10 neue Änderungssätze in verschiedenen Zweigen in das Repository gebracht hat hg rollback, werden sie alle durch ' ' entfernt. Bitte beachten Sie: Es gibt keine Sicherung wenn Sie eine Transaktion zurücksetzen!

  • ' hg strip' entfernt einen Änderungssatz und alle seine Nachkommen. Die Änderungssätze werden als Bundle gespeichert, das Sie bei Bedarf erneut anwenden können.

ForeverWintr schlägt in den Kommentaren vor (2016, 5 Jahre später)

Sie können die Freigabe von Dateien aufheben, indem Sie sie zuerst vergessen, z. B.: hg forget filea; hg commit --amendAber das scheint nicht intuitiv zu sein.
hg strip --keepist wahrscheinlich eine bessere lösung für moderne hg.

VonC
quelle
Wenn ich das richtig verstehe, entfernt das Rollback die letzte Transaktion. In meinem Fall habe ich ein Commit durchgeführt und dann vom Server gezogen. Bedeutet das also, dass ich den Pull zurücksetzen würde, anstatt ihn festzuschreiben?
Martin Buberl
1
@ Martin Buberl: Laut selenic.com/mercurial/hg.1.html#rollback wird Pull als Transaktion betrachtet. Wenn Sie also gezogen haben, wird durch Ausführen hg rollbackdas Ziehen anstelle des Festschreibens rückgängig gemacht.
Tim Henigan
2
Ich bin nicht sicher, wie hg commit --amendes funktionieren soll, aber für mich gab es einen Editor zum Ändern der Commit-Nachricht und keine Methode zum Ändern, welche Dateien enthalten waren. Ich habe den Editor ohne Speichern verlassen und festgestellt, dass mein fehlerhaftes Commit geändert wurde, um ALLE geänderten Dateien einzuschließen !
Tim Tisdall
2
Mir ist nicht klar, wie ich eine Antwort auf die Frage mit erreichen kann hg commit --amend. Sie können die Freigabe von Dateien hg forgetaufheben, indem Sie sie zuerst eingeben, z. B.: hg forget filea; hg commit --amend, Aber das scheint nicht intuitiv zu sein. hg strip --keep ist wahrscheinlich eine bessere Lösung für moderne hg.
ForeverWintr
1
@JasonS book.mercurial-scm.org/read/… ist eine gute Lektüre, obwohl Sie in Ihrem Fall auch ein Zurücksetzen in Betracht ziehen könnten: stackoverflow.com/a/31302998/6309
VonC
46

hg strip entfernt eine Revision (und alle Nachkommen) vollständig aus dem Repository.

Um Strip zu verwenden, müssen Sie MqExtension installieren, indem Sie der .hgrc (oder mercurial.ini) die folgenden Zeilen hinzufügen:

[extensions]
mq =

In TortoiseHg ist der Befehl strip in der Workbench verfügbar. Klicken Sie mit der rechten Maustaste auf eine Revision und wählen Sie "Verlauf ändern" -> "Streifen".

Da stripsich der Verlauf des Repositorys ändert, sollten Sie ihn nur für Revisionen verwenden, die noch niemandem zugänglich sind. Wenn Sie mercurial 2.1+ verwenden, können Sie diese Informationen mithilfe von Phasen verfolgen. Befindet sich ein Commit noch in der Entwurfsphase, wurde es nicht für andere Repositorys freigegeben, sodass Sie es sicher entfernen können. (Danke an Zasurus für diesen Hinweis).

Peter Graham
quelle
2
WENN sich die fragliche Revision noch im Entwurf befindet (oder Sie Zugriff auf ALLE Repos haben, auf die sie gedrückt / gezogen wurden, und den Streifen auf alle anwenden) (was in dieser Beschreibung der Fall ist), ist dies der Fall Sooo die beste und sauberste Option.
GazB
4
Wenn Sie TortoiseHg installiert haben, gibt es eine grafische Oberfläche zum globalen Aktivieren von mq. In der aktuellen Version: Aktivieren Sie "Datei-> Einstellungen-> Registerkarte Globale Einstellungen-> Erweiterungen-> mq" oder greifen Sie über die Schaltfläche "Datei bearbeiten" auf die Einstellungsdatei zu.
David
19

Da Sie kein Rollback durchführen können, sollten Sie dieses Commit mit dem neuen Kopf zusammenführen, den Sie beim Ziehen erhalten haben. Wenn Sie nichts von der Arbeit wollen, die Sie darin geleistet haben, können Sie dies einfach mit diesem Tipp tun .

Wenn Sie also an ihren Kopf gezogen und aktualisiert haben, können Sie dies tun:

hg --config ui.merge=internal:local merge

behält alle Änderungen in der aktuell ausgecheckten Revision und keine der Änderungen in der nicht ausgecheckten Revision (die von Ihnen geschriebene, die Sie nicht mehr möchten) bei.

Dies ist eine großartige Möglichkeit, da dadurch Ihre Historie genau und vollständig bleibt. Wenn in 2 Jahren jemand einen Fehler in dem findet, was Sie heruntergezogen haben, können Sie in Ihrer (unbenutzten, aber gespeicherten) Implementierung der gleichen Sache nachsehen und sagen: "Oh, ich habe es richtig gemacht". :) :)

Ry4an Brase
quelle
5

hg rollback ist was du willst.

In TortoiseHg hg rollbackwird dies im Commit-Dialog ausgeführt. Öffnen Sie den Commit-Dialog und wählen Sie "Rückgängig".

Alt-Text

Tim Henigan
quelle
1
Ich habe ein Commit gemacht, dann ein Pull und Update / Sync. Mit diesen neuen Änderungen habe ich entschieden, dass mein letztes Commit veraltet ist und möchte es rückgängig machen. Die Schaltfläche "Rückgängig" in TortoiseHg ist in meinem Fall deaktiviert.
Martin Buberl
Rollback ist jetzt veraltet.
UpTheCreek
In der aktuellen Version von Tortoise HG können Sie die Option Rollback / Undo über den Menüpunkt Repository aufrufen.
Daveywc
@ UpTheCreek Zitat benötigt.
DanMan
@ DanMan - überprüfen Sie den Link, den er bereitgestellt hat.
UpTheCreek
3

In der aktuellen Version von TortoiseHg Workbench 4.4.1 (07.2018) können Sie verwenden Repository- Rollback/undo...:
Geben Sie hier die Bildbeschreibung ein

TmTron
quelle
1

Die Problemumgehung.

Wenn Sie nicht auf den Server pushen, klonen Sie in einen neuen Ordner, andernfalls werden alle Dateien aus Ihrem Repository-Ordner gelöscht und neu geklont.

ITsDEv
quelle
0

Nachdem Sie Ihren Arbeitsbereich abgerufen und aktualisiert haben, klicken Sie mit der rechten Maustaste auf den Änderungssatz, den Sie entfernen möchten, und klicken Sie dann auf Verlauf ändern -> Streifen. Dadurch wird der Änderungssatz entfernt und Sie zeigen auf den Standardtipp.

cabhishek
quelle