Löschen Sie alle lokalen Änderungssätze und kehren Sie zum Baum zurück

95

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

Mit anderen Worten, ich möchte am Ende (a) genau den gleichen Code lokal haben, der in der Spitze des Remote-Zweigs vorhanden ist, und (b) keine Historie lokaler Commits.

Ich weiß, hg update -Cdass lokale Änderungen überschrieben werden. 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, um zu einer völlig sauberen lokalen Kasse zurückzukehren.

Richard
quelle

Antworten:

129

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

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

Wiederholen, bis es hg outgoingruhig bleibt. Beachten Sie, dass hg strip $revAuslöscher $revund alle seine Nachkommen.

Beachten Sie, dass Sie möglicherweise zuerst stripin Ihren Mercurial-Einstellungen aktivieren müssen .

PS: Ein noch intelligenterer Ansatz ist die Verwendung der Revset-Sprache.

% hg strip 'roots(outgoing())'
nur jemand
quelle
1
Danke dir! Ich kam in eine Situation, die sich perfekt und ohne viel Aufhebens löste.
Eswald
1
Dies hat mich vor den großen Korrekturen oben bewahrt, sehr einfach, danke!
David C
3
Wenn jemand Probleme hat, hg strip 'roots(outgoing())'zur Arbeit zu kommen, weil er es nicht erkennt 'roots(outgoing())'. Ich konnte es zum Laufen bringen hg strip "roots(outgoing())".
Jsea
@SombreErmine in cmd.exe, ja.
Nur jemand
21

Sie möchten einen lokalen Klon erstellen, in dem Sie nur die Änderungssätze beibehalten, die auch im Remote-Repository vorhanden sind. Verwenden TortoiseHg , hg logoder ähnlich , um herauszufinden , welche Ihre Änderungen ist , dass neueste Revision Sie nicht (die vor dem Chaos beginnt) machen. Die Verwendung hg outgoingkann hier helfen - es werden alle von Ihnen vorgenommenen Änderungssätze aufgelistet - wählen Sie eine Revisionsnummer früher als eine dieser.

Wenn die Zielversion aufgerufen wird goodund Ihr Klon aufgerufen wird foo, gehen Sie wie folgt vor :

hg clone -r good foo foo-clean

Dies ist eine schnelle, lokale Operation - es gibt keinen Grund, alles erneut herunterzuladen . Der foo-cleanKlon enthält nur Änderungssätze bis zur Überarbeitung good. Sie können nun ersetzen foo-clean/.hg/hgrcmit , foo/.hg/hgrcum Ihre Repository-lokalen Einstellungen wie der Standard Push / Pull - Pfad zu bewahren.

Wenn Sie zufrieden foo-cleansind und alles haben, was Sie brauchen foo, löschen Sie es einfach foound benennen Sie es foo-cleanin um foo. hg pullFühren Sie a aus , um neue Änderungssätze aus dem Remote-Repository in Ihren Klon zu übernehmen, und fahren Sie wie gewohnt fort.


Wenn niemand neue Änderungssätze in das Remote-Repository verschoben hat, ist es sehr einfach zu bestimmen, welche Revision Sie wie goodoben verwenden möchten : hg id defaultSie erhalten die ID des Tipps im Remote-Repository.

Martin Geisler
quelle
Ich habe die gleiche Situation, habe aber auch eine Menge Dateien im Repo-Verzeichnis, bin aber im hgignore. Hg strip kann nicht installiert werden und möchte die lokalen Commits löschen, ohne den gesamten Klon zu ersetzen. Irgendwelche Ideen? - Ah! Wenn ich keine Dateien hinzugefügt habe, sollte ich den anderen Klon einfach in mein altes Verzeichnis kopieren können!?
Peteter
Seien Sie bei dieser Methode jedoch vorsichtig, wenn Sie mehrere Zweige haben. Durch das Klonen bis zu einer angegebenen Revision werden nur die Änderungssätze im Zweig der angegebenen Revision abgerufen. Möglicherweise müssen Sie dann hg pull -rfür die letzte "gute" Revision jedes weiteren Zweigs.
Yitz
9

OK. Löschen Sie einfach alle lokalen Inhalte, hg initdas neue lokale Repository und hg pullden neuesten Tipp, den Sie haben. Vergiss nicht hg updatedanach.

Alemjerus
quelle
Vielen Dank. Wenn Sie "Alle lokalen Inhalte löschen" sagen, meinen Sie damit, dass Sie das gesamte Repository oder nur meine Änderungen löschen? Was macht hg init (habe gegoogelt, kann aber keine einfache Erklärung sehen) und muss ich damit irgendwelche Flags verwenden? Löscht es Dinge wie meine Mercurial .hgrc-Einstellungen?
Richard
Update: Wenn ich alles im Projektstammverzeichnis lösche, dann 'hg init' eingebe, erhalte ich 'abort: repository'. ist bereits vorhanden!'. Muss ich ein neues Verzeichnis einrichten und von dort aus arbeiten? Ich würde lieber nicht, wenn möglich ... sicherlich muss es einen einfachen Weg geben, alles zu töten, was ich vor Ort getan habe?!
Richard
Ja, löschen Sie alles, einschließlich aller Repository-Inhalte. Beginnen Sie mit einem neuen sauberen Ordner. Ihre Einstellungen können Sie in einer Sicherungsdatei speichern und dann in dem neuen Repository wiederherstellen, das Sie mit hg init reponame erstellt haben. Details zu Init und anderen
Dingen
6
alemjerus: hg init+ hg pull= hg cloneDer Unterschied besteht darin, hg clonedass eine schöne .hg/hgrcDatei für Sie erstellt wird und hg cloneHardlinks verwendet werden, um beim Klonen auf demselben Dateisystem Speicherplatz zu sparen.
Martin Geisler
Richard: Die Ausgabe von hg help initist hier: selenic.com/mercurial/hg.1.html#init Aber vielleicht ist das zu knapp? Bitte senden Sie eine Mail an unsere Mailingliste, wenn Sie weitere Hilfe benötigen! Siehe: mercurial.selenic.com/wiki/MailingLists
Martin Geisler
5

Sie können verwenden

hg Streifenrevision

um jede Revision und ihren Teilbaum in Ihrem lokalen Repository zu beenden.

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

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

Averasko
quelle
Sie können es für eine öffentliche Revision verwenden. Wenn Sie es jedoch erneut ziehen, wird es erneut angezeigt. (hg Streifen funktioniert nur mit dem lokalen Repository.)
Mike Rosoft
2

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

ABl.
quelle
2
hg strip `hg out --template" {rev} {author} \ n "| grep YOUR_AUTHOR_NAME | schneide -d "" -f 1`

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 - Vorlage" {rev} {author} \ n "| grep YOUR_AUTHOR_NAME | schneide -d "" -f 1`
Sebastian
quelle
0

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) Revision des Zusammenführungsziels verwerfen". Wenn Sie dies tun, befinden sich Ihre Änderungssätze weiterhin im Repo und werden gepusht, 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, aber es ist eine einfache Lösung und eine Überlegung wert, wenn die von Ihnen verworfenen Änderungssätze Daten enthalten, auf die Sie später möglicherweise verweisen möchten.

MrFlamey
quelle