webentwicklung-frage-antwort-db.com.de

Änderungen aufgeben, ohne aus der Historie zu löschen

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.

172
o0'.

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.

176
Niall C.

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
66
Nick Pierpoint

Geben Sie zunächst Folgendes ein:

hg heads

Stellen Sie sich vor, Sie haben drei Köpfe aufgeführt:

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

Angenommen, Sie möchten den letzten Kopf aktiv halten (223) und den Rest schließen.

Sie würden dann wie folgt vorgehen:

Kopf # 59 schließen

hg up -r 59
hg ci --close-branch -m "clean up heads; approach abandoned"

Kopf # 123 schließen

hg up -r 123
hg ci --close-branch -m "clean up heads; approach abandoned"

Übernehmen Sie die Änderungen

hg Push

Vergessen Sie nicht, am Ende auf den rechten Kopf zu wechseln

hg up -r 223

Und du bist fertig.

20

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

12
msarchet

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
3
kjam

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.

1
jjst

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.

1
Faheem Mitha

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:

  1. Suchen Sie den Anfang eines Kopfes, den Sie abnehmen möchten (wo ein neuer Hals beginnt, abzusteigen), und erhalten Sie die Revisionsnummer 

  2. Zieh es aus.


Quelle: TipsAndTricks .

Quelle: PruningDeadBranches # Using_strip .

hg --config extensions.hgext.mq= strip -n <rev>
  1. Machen Sie ein triviales Datei-Update (fügen Sie einer Datei ein Leerzeichen hinzu), bestätigen Sie und drücken Sie.

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.

0
sonjz

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.

0
DaveInCaz