it-swarm.com.de

Löschen Sie alle lokalen Changesets und kehren Sie zum Baum zurück

Ich benutze Mercurial und bin vor Ort in ein schreckliches Chaos mit drei Köpfen geraten. Ich kann nicht pushen, und ich möchte einfach alle meine lokalen Änderungen und Commits löschen und erneut mit völlig sauberem Code und einem sauberen Verlauf beginnen.

Mit anderen Worten, ich möchte am Ende (a) genau denselben Code lokal haben, der in der Spitze des Remote-Zweigs vorhanden ist, und (b) keinen Verlauf von lokalen Commits.

Ich kenne hg update -C überschreibt alle lokalen Änderungen. Aber wie lösche ich lokale Commits?

Um es klar auszudrücken, ich habe kein Interesse daran, meine Arbeit vor Ort zu bewahren. Ich möchte nur den einfachsten Weg finden, um zu einer völlig sauberen lokalen Kasse zurückzukehren.

94
Richard

Wenn der einfachste Weg (ein neues hg clone) ist nicht praktisch, ich benutze hg strip:

% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing

Wiederhole bis hg outgoing bleibt leise. Beachten Sie, dass hg strip $rev löscht $rev und alle seine Nachkommen.

Beachten Sie, dass Sie möglicherweise aktivieren Sie zuerst strip in Ihren Mercurial-Einstellungen .

PS: Ein noch intelligenterer Ansatz besteht darin, die Revset-Sprache zu verwenden und Folgendes zu tun:

% hg strip 'roots(outgoing())'
128
just somebody

Sie möchten einen lokalen Klon erstellen, bei dem nur die Änderungssätze beibehalten werden, die auch im Remote-Repository vorhanden sind. Benutze TortoiseHg , hg log oder ähnlich, um herauszufinden, welche Ihrer Revisionen die letzte Revision ist, die Sie nicht gemacht haben (die, bevor das Chaos begann). Mit hg outgoing kann hier Abhilfe schaffen - es werden alle vorgenommenen Änderungen aufgelistet - wählen Sie eine Revisionsnummer früher als eine dieser.

Wenn die Zielversion good heißt und Ihr Klon foo heißt, dann tun Sie Folgendes:

hg clone -r good foo foo-clean

Dies wird eine schnelle, lokale Operation sein - es gibt keinen Grund, alles erneut herunterzuladen . Das foo-clean clone enthält nur Änderungssätze bis zur Revision good. Sie können jetzt foo-clean/.hg/hgrc mit foo/.hg/hgrc, um Ihre repository-lokalen Einstellungen wie den Standard-Push/Pull-Pfad beizubehalten.

Wenn Sie zufrieden sind, dass foo-clean hat alles was du brauchst von foo, dann lösche einfach foo und benenne foo-clean bis foo. Mach ein hg pull, um alle neuen Changesets aus dem Remote-Repository in Ihren Klon zu übernehmen und wie gewohnt fortzufahren.


Wenn niemand neue Changesets in das Remote-Repository verschoben hat, ist es sehr einfach zu bestimmen, welche Revision Sie oben als good verwenden möchten: hg id default teilt Ihnen die ID des Tipps im Remote-Repository mit.

21
Martin Geisler

Okay. Also lösche einfach alle lokalen Sachen, hg init das neue lokale Repository und hg pull der neueste Tipp, den Sie haben. Vergiss nicht hg update danach.

9
alemjerus

Sie können verwenden

hg strip revision

um eine Revision und ihren Teilbaum in Ihrem lokalen Repository zu töten.

https://www.Mercurial-scm.org/wiki/Strip

Aber versuchen Sie nicht, es für etwas zu verwenden, das bereits gepusht wurde.

5
averasko
hg strip `hg out --template" {rev} {author}\n "| grep YOUR_AUTHOR_NAME | schneide -d "" -f 1` aus

macht den Trick für mich.

Es werden alle Revisionen entfernt, die nicht in das Standard-Repository verschoben wurden und mit Ihrem Autorennamen erstellt wurden.

Sie können diesen Stil auch verwenden, um die Überprüfung nicht mit dem Standard-Repository, sondern mit einem anderen Repository durchzuführen

hg strip `hg out OTHER_REPO_ALIAS --template" {rev} {author}\n "| grep YOUR_AUTHOR_NAME | schneide -d "" -f 1` aus
2
Sebastian

Löschen Sie einfach alles, was Sie auf Ihrem lokalen System haben, und klonen Sie das Remote-Repo erneut.

2
OJ.

Wenn Sie TortoiseHg verwenden, besteht eine einfache Möglichkeit, aus einem (kleinen) Durcheinander herauszukommen darin, zuerst auf die neueste Version zu aktualisieren, dann Ihre Änderungssätze auszuwählen und "Zusammenführen mit lokal" zu initiieren. Wenn der Zusammenführungsdialog angezeigt wird, klicken Sie einfach auf das kleine "+" - Symbol, um einige zusätzliche Optionen anzuzeigen. Eine davon ist "Änderungssätze aus der (anderen) Zusammenführungszielrevision verwerfen". Wenn Sie dies tun, bedeutet dies, dass sich Ihre Changesets weiterhin im Repo befinden und gepusht werden. Sie haben jedoch keine Auswirkung, da sie beim Zusammenführen verworfen werden. Wenn Sie viele Änderungssätze haben, die sich über viele Köpfe erstrecken, möchten Sie das Repo möglicherweise nicht auf diese Weise verschmutzen. Es ist jedoch eine einfache Lösung und eine Überlegung wert, ob die zu verwerfenden Änderungssätze Daten enthalten, auf die Sie später möglicherweise verweisen möchten.

0
MrFlamey