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 -C
Befehlen 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?
Antworten:
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.
quelle
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 revert
wenn Sie entscheiden, dass Sie die nicht festgeschriebenen Änderungen, die Sie an einer Datei in Ihrer Arbeitskopie vorgenommen haben, nicht beibehalten möchten.hg branch
Startet einen neuen benannten Zweig. Stellen Sie sich einen benannten Zweig als Bezeichnung vor, die Sie den Änderungssätzen zuweisen. Wenn Sie dies tunhg 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 undhg 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 privat halten. Es ist ganz einfach: Mit erhalten
hg clone --rev 38 foo foo-38
Sie einen neuen lokalen Klon, der nur bis zurfoo-38
Version 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 Ihremfoo
Klon. (Sie können die Klone beliebig umbenennen, z. B.foo
nachfoo-bad
undfoo-38
nachfoo
.)Schließlich können Sie auch verwenden
hg revert --all --rev 38
und 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 wiehg update
zuvor erstellt, andererseits erhalten Sie keine Beschwerden darüber mehrere Köpfe. Ich würde verwenden,hg revert
wenn ich mit anderen zusammenarbeiten würde, die bereits ihre eigene Arbeit basierend auf Revision 45 gemacht haben. Andernfallshg update
ist expliziter.quelle
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
Dadurch
-2
wird die Version vor dem letzten-1
Festschreiben wiederhergestellt. Mit wird nur die aktuellen nicht festgeschriebenen Änderungen zurückgesetzt.quelle
hg revert path/to/file -r478
IMHO,
hg strip -r 39
passt 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.
quelle
Nach der Verwendung
hg update -r REV
war 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.
quelle
commit --close-branch
auf dem alten Zweig tun . Sie können auchpush -f
neue Köpfe schieben, dies kann jedoch zu Verwirrung darüber führen, welcher der aktuelle ist.Die obigen Antworten waren sehr nützlich und ich habe viel gelernt. Für meine Bedürfnisse lautet die prägnante Antwort jedoch:
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).
quelle
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.
quelle