it-swarm.com.de

Mercurial - kehre zur alten Version zurück und fahre von dort fort

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

Bisher hat es eine lineare Geschichte. Die aktuelle Sache, an der ich arbeite, ist jedoch ein schrecklicher Ansatz, und ich möchte zu der Version zurückkehren, bevor ich sie gestartet habe, und sie auf eine andere Weise implementieren.

Ich bin ein bisschen verwirrt mit dem branch/revert/update -C Befehle in Mercurial. Grundsätzlich möchte ich auf Version 38 (derzeit auf 45) zurückgreifen und habe bei meinen nächsten Commits 38 als übergeordnetes Element und mache von dort aus weiter. Es ist mir egal, ob die Revisionen 39-45 für immer verloren sind oder in einer eigenen Sackgasse enden.

Welchen Befehl/Befehlssatz brauche ich?

248
Paolo
hg update [-r REV]

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

148
van

Hier ist der Spickzettel zu den Befehlen:

  • hg update Ändert Ihre übergeordnete Revision der Arbeitskopie und den Dateiinhalt entsprechend dieser neuen übergeordneten Revision. Dies bedeutet, dass neue Commits ab der Revision, auf die Sie aktualisieren, fortgesetzt werden.

  • hg revert ändert nur den Dateiinhalt und lässt die übergeordnete Revision der Arbeitskopie alleine. Normalerweise verwenden Sie hg revert, Wenn Sie nicht möchten, dass die nicht festgeschriebenen Änderungen, die Sie an einer Datei vorgenommen haben, in Ihrer Arbeitskopie gespeichert werden.

  • hg branch startet einen neuen benannten Zweig. Stellen Sie sich einen benannten Zweig als Bezeichnung vor, die Sie den Changesets zuweisen. Wenn Sie also hg branch red Tun, werden die folgenden Änderungssätze als zu dem "roten" Zweig gehörig markiert. Dies kann eine gute Möglichkeit sein, Änderungssätze zu organisieren, insbesondere wenn verschiedene Personen in verschiedenen Zweigen arbeiten und Sie später sehen möchten, woher ein Änderungssatz stammt. Aber du willst es nicht in deiner Situation benutzen.

Wenn Sie hg update --rev 38 Verwenden, bleiben die Änderungssätze 39–45 als Sackgasse übrig - ein baumelnder Kopf, wie wir ihn nennen. Beim Pushen wird eine Warnung angezeigt, da im Repository, in das Sie pushen, "mehrere Köpfe" erstellt werden. Die Warnung ist da, weil es irgendwie unhöflich ist, solche Köpfe herumzulassen, da sie andeuten, dass jemand eine Fusion durchführen muss. Aber in deinem Fall kannst du einfach weitermachen und hg Push --force, Da 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 für sich behalten. Es ist ganz einfach: Mit hg clone --rev 38 foo foo-38 Erhalten Sie einen neuen lokalen Klon, der nur bis zur Version 38 enthält. Sie können in foo-38 Weiterarbeiten und die neu erstellten (guten) Änderungssätze pushen. Sie haben immer noch die alten (schlechten) Revisionen in Ihrem foo Klon. (Sie können die Klone beliebig umbenennen, z. B. foo in foo-bad Und foo-38 In foo.)

Schließlich können Sie auch hg revert --all --rev 38 Verwenden und dann ein Commit durchführen. Dadurch wird eine Revision 46 erstellt, die identisch mit Revision 38 aussieht. Anschließend werden Sie ab Revision 46 weiterarbeiten. Auf diese Weise wird keine Verzweigung in der Historie auf dieselbe explizite Weise wie bei hg update Erstellt, jedoch auf der anderen Seite Sie erhalten keine Beschwerden über mehrere Köpfe. Ich würde hg revert Verwenden, wenn ich mit anderen zusammenarbeiten würde, die bereits ihre eigene Arbeit basierend auf Revision 45 gemacht haben. Andernfalls ist hg update Expliziter.

398
Martin Geisler

Ich bin gerade auf den Fall gestoßen, dass ich nur eine Datei auf die vorherige Revision zurücksetzen musste, nachdem ich Commit und Push ausgeführt hatte. Die Kurzsyntax zum Festlegen dieser Revisionen wird von den anderen Antworten nicht abgedeckt

hg revert path/to/file -r-2

Wenn -2 Auf die Version vor dem letzten Commit zurückgesetzt wird, werden mit -1 Nur die aktuellen nicht festgeschriebenen Änderungen zurückgesetzt.

29
hyde

MEINER BESCHEIDENEN MEINUNG NACH, hg strip -r 39 passt besser zu diesem Fall.

Die mq-Erweiterung muss aktiviert sein und hat dieselben Einschränkungen wie die von Martin Geisler empfohlene "Cloning-Repo-Methode": Wenn das Changeset irgendwie veröffentlicht wurde, wird es (wahrscheinlich) irgendwann zu Ihrem Repo zurückkehren, weil Sie es nur geändert haben Ihr lokales Repo.

7
magras

Nach der Verwendung von hg update -r REV In der Antwort war nicht klar, wie diese Änderung vorgenommen werden soll, damit Sie dann Push ausführen können.

Wenn Sie nur versuchen, nach dem Update ein Commit durchzuführen, ist Mercurial der Ansicht, dass keine Änderungen vorliegen.

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

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

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

Ich konnte dann pushen.

6
Brian Gershon

Die obigen Antworten waren am nützlichsten 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, aber sie funktionieren auch alleine, wenn Sie es manuell machen möchten.

Dies ist nützlich, wenn Sie einer Release-Verzweigung einen Hotfix hinzufügen müssen, diese jedoch ausgehend von den Standardeinstellungen erstellen müssen (bis wir die richtigen CI-Tools haben und in der Lage sind, Verzweigungen zu erstellen und später auch Release-Verzweigungen zu beseitigen).

5
Brian Carr

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 Commit-Meldungen vor Ihren Augen - und "Alle Dateien zurücksetzen". 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.

1
Geoff Kendall