Es gibt ein Commit, das einfach nicht funktioniert hat, also möchte ich es aufgeben ohne es aus der Geschichte zu löschen .
Ich habe eine frühere Revision überarbeitet und festgelegt und damit einen neuen Kopf geschaffen.
Ich habe keine Äste, ich möchte keine Äste, ich möchte einfach nur mit dem neuen Kopf fortfahren, nichts Besonderes, keine Verschmelzung, keine Sorgen, einfach den vorherigen vergessen.
Ich finde nicht, wie ich das finde, und ich fange an zu glauben, dass es nicht geht. Alles, was ich finde, ist Zeug über Zweige oder über Zusammenführen.
Aktualisieren Sie Ihr Repository auf den Kopf mit der Revision, die Sie vergessen möchten, und verwenden Sie dann die Option --close-branch
für hg commit
, um diesen (anonymen) Zweig als geschlossen zu markieren. Aktualisieren Sie dann auf den Kopf des Zweigs, den Sie do möchten, und arbeiten Sie weiter.
Sie können den geschlossenen Zweig trotzdem sehen, wenn Sie die -c
-Option für hg heads
verwenden, diese wird jedoch standardmäßig nicht angezeigt und hg merge
wird nicht versuchen, den geschlossenen Kopf zusammenzuführen.
Sie müssen hg Push --force
verwenden, wenn Sie diesen geschlossenen Kopf zum ersten Mal in ein anderes Repository verschieben, da Sie beim Push tatsächlich zusätzliche Köpfe im Remote-Repository erstellen. Sagen Sie Mercurial, dass dies mit --force
in Ordnung ist. Menschen, die den geschlossenen Kopf ziehen, stören keine Warnungen.
Ich weiß, dass Sie wollen derzeit nicht mit Zweigen arbeiten, aber genau das haben Sie getan. Als Sie zu einer früheren Version zurückkehrten und etwas festlegten, das funktioniert hat, haben Sie einen Zweig erstellt - einen nicht benannten Zweig, aber trotzdem einen Zweig.
Es ist kein Problem, einfach so weiterzumachen, wie Sie sind, und sich keine Sorgen zu machen, mehrere Köpfe zu haben. Wenn Sie jedoch die Dinge aufräumen möchten, damit Sie nicht aus Versehen den falschen Kopf auswählen, können Sie den alten Zweig töten.
In der Mercurial-Dokumentation gibt es einen guten Abschnitt, der Sie durch eine Reihe von Optionen rund um Pruning Dead Branches führt.
Ich denke, die beste Option für Sie ist, den alten Zweig als "geschlossen" zu kennzeichnen. Wenn Ihr alter Kopf die Revision "123" ist, dann:
hg update -r 123
hg commit --close-branch -m 'Closing old branch'
hg update -C default
hg heads
changeset: 223:d1c3deae6297
user: Your name <[email protected]>
date: Mon Jun 09 02:24:23 2014 +0200
summary: commit description #3
changeset: 123:91c5402959z3
user: Your name <[email protected]>
date: Sat Dec 23 16:05:38 2013 +0200
summary: commit description #2
changeset: 59:81b9804156a8
user: Your name <[email protected]>
date: Sat Sep 14 13:14:40 2013 +0200
summary: commit description #1
Sie würden dann wie folgt vorgehen:
hg up -r 59
hg ci --close-branch -m "clean up heads; approach abandoned"
hg up -r 123
hg ci --close-branch -m "clean up heads; approach abandoned"
hg Push
hg up -r 223
Und du bist fertig.
Sie möchten hg backout
verwenden. Dadurch werden die durch das Changeset vorgenommenen Änderungen aus allen untergeordneten Changesets entfernt.
Überprüfen Sie dies für eine gute Erklärung . Mercurial Backout
Sie können Ihr beschädigtes Repo zu einem neuen kopieren, ohne den unerwünschten Kopf zu kopieren. Entfernen Sie dann das alte Repository, verschieben Sie den neu erstellten Klon an den ursprünglichen Ort und arbeiten Sie weiter damit. Dies wird einige Zeit dauern, aber Sie erhalten ein perfekt sauberes Repository ohne Anzeichen dieser unerwünschten Revision.
hg clone --rev myGoodResition myDirtyRepo myCleanRepo
Die Antworten von Niall und Nick sind direkt. Da ich selbst viele Kopfköpfe kreiere, habe ich am Ende einen Alias geschrieben, um den Kopf leichter zu schließen. Fügen Sie dies Ihrem .hgrc
hinzu:
[alias]
behead = !REV=$($HG id -i); $HG update [email protected] -q && $HG ci --close-branch -m "Closing dead head" && $HG update $REV -q
(Wenn Sie bereits einen [alias]
-Abschnitt haben, können Sie stattdessen anhängen)
Sie können jetzt einen Kopf in einem einzigen Befehl schließen (und ohne manuell auf ein anderes Changeset aktualisieren zu müssen):
$ hg behead 123
Hinweis: Der Alias verwendet die Tatsache, dass Mercurial-Aliase Shell-Befehle sein können . Dies bedeutet, dass dies wahrscheinlich nur unter UNIX funktioniert, nicht unter Windows.
Dies ist ein Anwendungsfall für die Evolve-Erweiterung . Da es derzeit nicht mit Mercurial gebündelt ist, handelt es sich technisch gesehen um eine Erweiterung von Drittanbietern. Aber es wird von einer ganzen Reihe von Leuten, einschließlich Mercurial-Entwicklern, ziemlich stark genutzt, ist sehr aktiv in der Entwicklung und geht nirgendwo hin.
Mit der Evolve-Erweiterung machen Sie es einfach
hg Prune -r revname
und mach weiter mit deinem Leben. Das cset wird weiterhin vorhanden sein, ist jedoch veraltet. Es ist nur sichtbar, wenn Sie die Option --hidden
an Mercurial-Befehle übergeben. Standardmäßig wird es nicht an Remote-Repositorys übertragen. Obwohl ich denke, Sie können es erzwingen, wenn Sie wirklich wollen.
Wenn das zu bereinigende cset Vorfahren hat, die Sie behalten möchten, müssen Sie hg evolve
ausführen, um diese Changesets erneut zu erstellen. hg evolve
wird dies automatisch tun. Ansonsten müssen Sie nichts tun.
Ich bin oft auf dieses Problem gestoßen, wenn ich einen irrtümlich erzeugten Kopf köpfen möchte. Ich möchte immer, dass es von der Erde verschwindet.
Holen Sie sich auf Ihrer lokalen Kopie das Neueste und dann:
Suchen Sie den Anfang eines Kopfes, den Sie abnehmen möchten (wo ein neuer Hals beginnt, abzusteigen), und erhalten Sie die Revisionsnummer
Zieh es aus.
Quelle: TipsAndTricks .
Quelle: PruningDeadBranches # Using_strip .
hg --config extensions.hgext.mq= strip -n <rev>
Ihr Repo sollte jetzt den Kopf entfernt haben. Der letzte Schritt ist wichtig, da beim Entfernen keine Änderungen vorgenommen werden, die Sie in Ihr zentrales Repository pushen können. Ohne den letzten Schritt haben Sie den Kopf nur lokal abgestreift.
Eine Alternative zum Schließen oder Entfernen des unerwünschten Zweigs wäre, merge auf eine Art und Weise, die seine Auswirkungen vollständig verwirft, aber sie in der Geschichte belässt. Durch diesen Ansatz können sich unerwünschte Änderungen in einem Push verbreiten. Verwenden Sie diese Option also nur, wenn dies der beabsichtigte Effekt ist.
Nehmen wir an, die Änderungssatzhistorie sieht folgendermaßen aus:
1-2-3-4-5-6
\
7-8-*
und es sind 5
und 6
, die nicht mehr erwünscht sind.
Du kannst das:
hg up 8
hg merge -r 6 -t :local
hg commit ...
was wird das schaffen:
1-2-3-4-5-6
\ \
7-8-9-*
Das Update auf 8
stellt sicher, dass Sie an dem gewünschten Kopf in der Historie arbeiten, den Sie behalten möchten.
Der -t :local
weist hg an, das Zusammenführungswerkzeug "local" zu verwenden, das es anweist, Änderungen von dem anderen Zweig, d. Mehr Info .
Daher bleiben die unerwünschten Änderungen in 5
und 6
in der Historie erhalten, wirken sich jedoch nicht auf neuere Änderungen aus.