Mercurial - kehren Sie zur alten Version zurück und fahren Sie von dort fort

249

Ich verwende Mercurial lokal für ein Projekt (es ist das einzige Repo, bei dem es kein Drücken / Ziehen zu / von irgendwo anders gibt).

Bis heute hat es eine lineare Geschichte. Das, woran ich gerade arbeite, ist jedoch ein schrecklicher Ansatz, und ich möchte zur Version zurückkehren, bevor ich sie gestartet habe, und sie auf eine andere Weise implementieren.

Ich bin etwas verwirrt mit den branch/ revert/ update -CBefehlen in Mercurial. Grundsätzlich möchte ich zu Version 38 (derzeit auf 45) zurückkehren und meine nächsten Commits 38 als Eltern haben und von dort aus weitermachen. Es ist mir egal, ob die Revisionen 39-45 für immer verloren gehen oder in einer eigenen Sackgasse enden.

Welchen Befehl / Befehlssatz brauche ich?

Paolo
quelle
6
Für alle Interessierten ist dies in der zugehörigen Seitenleiste aufgetaucht, was eine großartige Erklärung für das Zurücksetzen
Paolo

Antworten:

150
hg update [-r REV]

Wenn Sie später ein Commit durchführen, erstellen Sie effektiv einen neuen Zweig. Dann können Sie möglicherweise nur an diesem Zweig weiterarbeiten oder den vorhandenen Zweig zusammenführen.

van
quelle
6
Beim nächsten Commit wird ein neuer Zweig erstellt. Wenn Sie unsicher sind, stellen nur eine Sicherungskopie Sie (mit Arbeitskopie) Repository, probieren Sie es aus - nicht wie das Ergebnis -> von vorne anfangen ohne Kosten
van
Dies ist eine zweifelhafte Antwort, da Ihre aktuellen Änderungen mit der alten Revision zusammengeführt werden, was Sie wahrscheinlich nicht möchten. Die richtige Antwort sollte hg revert sein.
Trevor de Koekkoek
Die Antwort ist in Ordnung, mit Ausnahme des Teils über das Zusammenführen (ich glaube nicht, dass der Fragesteller zusammenführen möchte).
Strg-Alt-Delor
3
@NeonWarge REV ist einfach ein Platzhalter für die Überarbeitung. Es kann seine Nummer, sein Hash, ein Lesezeichen und so weiter sein. Trevor: Das ist nicht zweifelhaft, weil es nichts zusammenführt. Kein Notwendigkeit für.
DanMan
401

Hier ist der Spickzettel zu den Befehlen:

  • hg updateÄndert die übergeordnete Revision Ihrer Arbeitskopie und den Dateiinhalt entsprechend dieser neuen übergeordneten Revision. Dies bedeutet, dass neue Commits ab der von Ihnen aktualisierten Revision fortgesetzt werden.

  • hg revertÄndert nur den Dateiinhalt und lässt die übergeordnete Revision der Arbeitskopie in Ruhe. Sie werden normalerweise verwendet, hg revertwenn Sie entscheiden, dass Sie die nicht festgeschriebenen Änderungen, die Sie an einer Datei in Ihrer Arbeitskopie vorgenommen haben, nicht beibehalten möchten.

  • hg branchStartet einen neuen benannten Zweig. Stellen Sie sich einen benannten Zweig als Bezeichnung vor, die Sie den Änderungssätzen zuweisen. Wenn Sie dies tun hg branch red, werden die folgenden Änderungssätze als zum "roten" Zweig gehörend markiert. Dies kann eine gute Möglichkeit sein, Änderungssätze zu organisieren, insbesondere wenn verschiedene Personen an verschiedenen Zweigen arbeiten und Sie später sehen möchten, woher ein Änderungssatz stammt. Aber Sie möchten es nicht in Ihrer Situation verwenden.

Wenn Sie verwenden hg update --rev 38, bleiben die Änderungssätze 39–45 als Sackgasse - ein baumelnder Kopf, wie wir ihn nennen. Beim Push erhalten Sie eine Warnung, da Sie in dem Repository, in das Sie pushen, "mehrere Köpfe" erstellen. Die Warnung ist da, da es unhöflich ist, solche Köpfe herumzulassen, da sie darauf hindeuten, dass jemand eine Fusion durchführen muss. Aber in deinem Fall kannst du einfach weitermachen und hg push --forceda du es wirklich hängen lassen willst.

Wenn Sie die Revision 39-45 noch nicht an eine andere Stelle verschoben haben, können Sie sie privat halten. Es ist ganz einfach: Mit erhalten hg clone --rev 38 foo foo-38Sie einen neuen lokalen Klon, der nur bis zur foo-38Version 38 enthält. Sie können weiterarbeiten und die neuen (guten) Änderungssätze, die Sie erstellen, weitergeben. Sie haben immer noch die alten (schlechten) Revisionen in Ihrem fooKlon. (Sie können die Klone beliebig umbenennen, z. B. foonach foo-badund foo-38nach foo.)

Schließlich können Sie auch verwenden hg revert --all --rev 38und dann festschreiben. Dadurch wird eine Revision 46 erstellt, die mit der Revision 38 identisch aussieht. Anschließend arbeiten Sie ab Revision 46 weiter. Dadurch wird keine Abzweigung in der Historie auf dieselbe explizite Weise wie hg updatezuvor erstellt, andererseits erhalten Sie keine Beschwerden darüber mehrere Köpfe. Ich würde verwenden, hg revertwenn ich mit anderen zusammenarbeiten würde, die bereits ihre eigene Arbeit basierend auf Revision 45 gemacht haben. Andernfalls hg updateist expliziter.

Martin Geisler
quelle
2
FANTASTISCHE Antwort. Ich habe hg revert --all --rev ## verwendet und es hat meinen Arsch gerettet: D
Van Thoai Nguyen
1
Wäre es nicht besser sein, auch nahe der Abzweigung des baumelnden Kopf? Dies würde zukünftige Warnungen im Repository verhindern. Siehe stackoverflow.com/a/3688320/900130
Zoltán
Hinweis: hg revert --all --rev xxx ändert lokale Dateien, die zum Zurücksetzen von Ihrem lokalen Repo erforderlich sind. Sie müssen also vorher aktualisieren, wohin Sie zurückkehren möchten.
Vincent
Um eine frühere Version zu verzweigen, musste ich zuerst ein Zurücksetzen und dann ein Update durchführen. Davon abgesehen eine weniger undurchsichtige Erklärung als die meisten anderen.
CodeLurker
30

Ich bin gerade auf den Fall gestoßen, dass ich nur eine Datei auf die vorherige Revision zurücksetzen musste, gleich nachdem ich Commit und Push durchgeführt hatte. Die Kurzsyntax zum Angeben dieser Revisionen wird in den anderen Antworten nicht behandelt. Hier ist der Befehl, dies zu tun

hg revert path/to/file -r-2

Dadurch -2wird die Version vor dem letzten -1Festschreiben wiederhergestellt. Mit wird nur die aktuellen nicht festgeschriebenen Änderungen zurückgesetzt.

Hyde
quelle
1
Ich finde das äußerst nützlich. Natürlich können Sie für die Option -r einfach die Revisionsnummer angeben
Alex
Sie können auch eine bestimmte Revision auswählen. zBhg revert path/to/file -r478
Matt
7

IMHO, hg strip -r 39passt besser zu diesem Fall.

Es erfordert die Aktivierung der mq-Erweiterung und hat die gleichen Einschränkungen wie die von Martin Geisler empfohlene "Cloning Repo-Methode": Wenn das Änderungsset irgendwie veröffentlicht wurde, wird es (wahrscheinlich) zu einem bestimmten Zeitpunkt zu Ihrem Repo zurückkehren, da Sie nur Änderungen vorgenommen haben Ihr lokales Repo.

Magras
quelle
Wusste nichts davon. Einfacher und sauberer als das Löschen und erneute Klonen des Repos. Vielen Dank.
Stellen Sie Monica wieder her - notmaynard
6

Nach der Verwendung hg update -r REVwar in der Antwort nicht klar, wie diese Änderung festgeschrieben werden soll, damit Sie sie dann pushen können.

Wenn Sie nur versuchen, nach dem Update ein Commit durchzuführen, glaubt Mercurial nicht, dass es Änderungen gibt.

Ich musste zuerst eine Änderung an einer Datei vornehmen (z. B. in einer README-Datei), damit Mercurial erkannte, dass ich eine neue Änderung vorgenommen hatte, und diese dann festschreiben konnte.

Dies erzeugte dann zwei Köpfe wie erwähnt.

Um den anderen Kopf vor dem Drücken loszuwerden, folgte ich dann dem Schritt No-Op Merges , um diese Situation zu beheben.

Ich konnte dann pushen.

Brian Gershon
quelle
Sie können eine commit --close-branchauf dem alten Zweig tun . Sie können auch push -fneue Köpfe schieben, dies kann jedoch zu Verwirrung darüber führen, welcher der aktuelle ist.
Strg-Alt-Delor
5

Die obigen Antworten waren sehr nützlich und ich habe viel gelernt. Für meine Bedürfnisse lautet die prägnante Antwort jedoch:

hg revert --all --rev ${1}

hg commit -m "Restoring branch ${1} as default"

wo ${1} ist die Nummer der Revision oder der Name des Zweigs? Diese beiden Zeilen sind eigentlich Teil eines Bash-Skripts, funktionieren jedoch von alleine, wenn Sie dies manuell tun möchten.

Dies ist nützlich, wenn Sie einem Release-Zweig einen Hotfix hinzufügen müssen, aber standardmäßig erstellen müssen (bis wir unsere CI-Tools richtig eingestellt haben und in der Lage sind, aus Zweigen zu erstellen und später auch Release-Zweige zu entfernen).

Brian Carr
quelle
1

Ich würde Tortoise Hg (eine kostenlose GUI für Mercurial) installieren und diese verwenden. Sie können dann einfach mit der rechten Maustaste auf eine Revision klicken, zu der Sie möglicherweise zurückkehren möchten - mit allen Festschreibungsnachrichten vor Ihren Augen - und auf "Alle Dateien zurücksetzen". Dies macht es intuitiv und einfach, zwischen Versionen einer Dateigruppe hin und her zu rollen. Dies kann sehr nützlich sein, wenn Sie feststellen möchten, wann ein Problem zum ersten Mal aufgetreten ist.

Geoff Kendall
quelle