2012-07-23 7 views
6

Ich habe eine Reihe von Commits, sagen A, B, C, D, und ich möchte behalten B, C und D, und machen Sie eine Festschreibung, die (BCD) ⁻¹ ist. Was ist der einfachste Weg dies zu tun, wenn ich viele Commits habe, die ich gleichzeitig rückgängig machen möchte?Wie stelle ich mehrere Commits in Mercurial zurück?

(Ich scheine eine Stackoverflow Frage dazu, daran zu erinnern zu sehen, dass vorgeschlagen, dass ich hg update A, und dann hg commit mit einigen Argumenten aufrufen, aber ich kann diese Frage nicht scheinen jetzt zu finden.)

Antwort

1

Sie‘ habe deine eigene Frage beantwortet, update zurück zu A und fahre einfach von dort fort. Wenn Sie an dieser Stelle einen neuen Kopf erstellen müssen, müssen Sie die Datei wie folgt ändern: How can I force mercurial to accept an empty commit. Ein mail thread verbunden mit von diesem Beitrag beschreibt eine Möglichkeit, MqExtension zu verwenden, um BCD zu entfernen (es sei denn, Sie haben sie geschoben):

+0

Dies, aber nur wenn D ein HEAD ist. Es gibt keine Müllsammlung in hg, also gehen B, C und D nicht verloren. D wird nur ein Kopf bleiben, den du schieben kannst oder nicht - bis zu dir. – DanMan

4

Es klingt wie Sie nach backout suchen. Siehe:

hg help backout 

Ich glaube nicht, dass mehrere Commits in einem Rutsch wieder heraus kann, so dass man sie einzeln wieder aus:

hg backout D 
hg backout C 
hg backout B 

Diese drei Commits auf den D schaffen, dass sind die Umkehrung von D, und C und B. Wenn Sie diese Commits in einem Changeset kombinieren möchten, können Sie sie mit rebase --collapse oder einer von mehreren anderen Erweiterungen (z. B. histedit oder oder collapse Erweiterungen) falten.

Wenn Sie nicht wollen, um die einzelnen Änderungen rückgängig zu machen, aber alles in einem Rutsch tun, könnten Sie Folgendes tun:

hg update A 
hg debugsetparents D 
hg commit -m "revert B-D" 

Es ist hässlich, aber es funktioniert. Allerdings werden die Umbenennungen nicht umgekehrt aufgezeichnet. Um ehrlich zu sein, würde ich nicht empfehlen, dies zu tun, wenn Sie so viel zurückgeben müssen, dass einzelne Backout-Befehle zu viel Mühe beim Tippen geben, frage ich mich, ob das Zurücksetzen wirklich das ist, was Sie tun sollten Fall.

Alternativ könnten Sie tun, wie Jim und Rafael vorgeschlagen, und entscheiden, dass B, C und D auf einem Zweig sind, und wieder auf A aktualisieren und dort weitermachen (zu diesem Zeitpunkt Geschichte aussperren). Dies könnte angemessener sein.

+0

Das wird tun, was ich will (wenn ich die drei Commits zusammen in mq Squash), aber es wird unhandlich, wenn es, sagen wir, 50 Commits, die ich rückgängig machen wollen. Ich suche nach etwas näher an dem zweiten Teil der akzeptierten Antwort in http://stackoverflow.com/questions/1463340/revert-multiple-git-commits (aber für hg), dh die hg Äquivalent von 'git Reset --hard A && git reset --soft @ {1} && git commit -a' –

+0

ich die Antwort mit einer Art und Weise aktualisiert zu tun, dass in Mercurial. Wie bei der Git-Antwort, mit der Sie verbunden sind, werden die Changesets jedoch nicht umgekehrt. Es macht mich wirklich wundern, warum Sie jemals so eine große Sequenz von Changesets wiederherstellen möchten. Es scheint besser zu sein, sie einfach auf einem inaktiven Zweig zu parken und von der Änderung vorher fortzufahren. Wenn Sie Ihren Anwendungsfall in Ihrer Frage etwas beschreiben, können Sie dadurch eine bessere Lösung für Ihr Problem finden. –

+0

Außerdem sollten Sie in Erwägung ziehen, eine Feature-Anforderung an Mercurial zu senden, damit der Backout-Befehl einen Revisionssatz statt nur einzelner Revisionen akzeptiert. –

4

Der einfachste Weg:

Sie sind in changeset D und Sie möchten, dass Zweig

hg commit --close-branch -m "Branch closed" 

jetzt beenden, gehen Sie einfach von A bis ChangeSet und setzen Sie Ihre Arbeit commiting neue Slideshows

hg up -r A 
... change stuff ... 
hg ci -m "New stuff" 

Der Zweig mit B, C und D wird dort sein, aber er wird beendet, er wird nicht in hg heads angezeigt. Es wird ein inaktiver Zweig sein.

Das ist einfach zu tun und ausdrucksstark. Wenn Sie sich das Diagramm ansehen, sehen Sie einen separaten Zweig, der geschlossen wurde und der "offizielle" Zweig wird weitergehen. Viel besser, als wenn diese Change- und Backout-Changesets in Ihrer Branche zu Lärm führen.

+1

Wie in [eine andere Frage] erklärt (http://stackoverflow.com/questions/3688263/mercurial-beheading- a-head), wenn Sie versuchen, den geschlossenen Kopf zu einem anderen Repository zu verschieben, erhalten Sie eine Warnung zum Erstellen mehrerer Köpfe. Benutzen Sie 'hg push --force' beim ersten Drücken. Menschen, die den geschlossenen Kopf ziehen, erhalten keine Warnungen. – mernst

Verwandte Themen