Wie kann ich eine Reihe nicht festgeschriebener Änderungen beiseite legen, während ich an etwas anderem arbeite?

98

Wenn ich eine Reihe von nicht festgeschriebenen Änderungen habe und diese beiseite legen möchte, während ich stattdessen an etwas anderem arbeite, und später (z. B. nach einigen Tagen) darauf zurückkomme und weiter arbeite. Was wäre der einfachste Workflow, um dies zu erreichen? (Bisher habe ich nur Erfahrung mit der Grundfunktionalität von Mercurial). Meine übliche Methode war es, mit dem Klon einen neuen Zweig zu erstellen, aber es gibt möglicherweise bessere Möglichkeiten.

Erik
quelle

Antworten:

133

Sie haben eine Handvoll Möglichkeiten:

  1. Lagern Sie die Gegenstände. Dadurch werden die Änderungen gespeichert und aus dem Arbeitsverzeichnis entfernt, damit der Zweig fortgesetzt werden kann. Es wird kein Änderungssatz erstellt.

    hg shelve --all --name "UnfinishedChanges"
    
    hg unshelve --name "UnfinishedChanges"
    

    Aktualisieren / Bearbeiten : Möglicherweise müssen neuere Versionen von mercurial verwendet werden

    hg shelve -n "UnfinishedChanges"
    hg unshelve "UnfinishedChanges"
    

    Sie können immer noch --nameals Alternative zu verwenden -n, aber Quecksilber scheint nicht --namemehr zu mögen . Außerdem wird das --allnicht mehr benötigt und Quecksilber wird tatsächlich darüber ausflippen.

  2. Patch-Warteschlange der Elemente mit mq. Dies ist in mancher Hinsicht nicht zu unähnlich, um sich zurückzustellen, verhält sich aber anders. Das Endergebnis ist das gleiche, Änderungen werden entfernt und können später optional erneut angewendet werden. Beim Push sind die Patches logische Änderungssätze. Wenn sie gepoppt werden, werden sie an anderer Stelle gespeichert und sind nicht Teil des Änderungssatzverlaufs.

    hg qnew "UnfinishedWork"
    hg qrefresh
    hg qpop
    
    hg qpush "UnfinishedWork"
    
  3. Übernehmen Sie sie lokal, aktualisieren Sie sie auf den vorherigen Änderungssatz, arbeiten Sie weiter und verwenden Sie anonyme Zweige (oder mehrere Köpfe). Wenn Sie dann die Änderungen wünschen, können Sie Köpfe zusammenführen. Wenn Sie die Änderungen nicht möchten, können Sie strippen den Wechsel - Set.

    hg commit -m"Commiting unfinished work in-line."
    hg update -r<previous revision>
    
    hg strip -r<revision of temporary commit>
    
  4. Übertragen Sie sie in einen benannten Zweig. Der Workflow entspricht dann Option 3 - Zusammenführen oder Entfernen, wenn Sie bereit sind.

    hg branch "NewBranch"
    hg commit -m"Commiting unfinished work to temporary named branch."
    hg update <previous branch name>
    

Persönlich verwende ich Option 3 oder 4, da es mir nichts ausmacht, Änderungssätze zu entfernen oder Teilcode einzuchecken (solange dies nicht irgendwann verschoben wird). Dies kann in Verbindung mit der neuen Phase verwendet werden Material verwendet werden, um Ihre lokalen Änderungssätze bei Bedarf vor anderen Benutzern zu verbergen.

Ich benutze auch die rebase Befehl auch, um Änderungssätze zu verschieben, um Zusammenführungen zu vermeiden, bei denen eine Zusammenführung dem Verlauf des Codes nichts hinzufügen würde. Zusammenführungen Ich speichere in der Regel für Aktivitäten zwischen wichtigen Zweigen (z. B. Release-Zweigen) oder Aktivitäten aus einem längerlebigen Feature-Zweig. Es gibt auch den histeditBefehl, den ich zum Komprimieren von Änderungssätzen verwende, bei denen die "Chattiness" von ihnen den Wert verringert.

Patch-Warteschlangen sind ebenfalls ein gängiger Mechanismus, haben jedoch eine Stapelsemantik. Sie pushen und platzieren Patches, aber ein Patch, der sich "unter" einem anderen Patch im Stapel befindet, erfordert, dass der darüber liegende Patch ebenfalls verschoben wird.

Warnung : Wie bei all diesen Optionen ist beim Aufheben der Regale / beim Verschieben / Zusammenführen eine Zusammenführungsauflösung erforderlich, wenn die Dateien seit den temporären Änderungen, die Sie zurückgestellt / in die Warteschlange gestellt / verzweigt haben, mehr Änderungen aufweisen.

Adam Houldsworth
quelle
Vielen Dank für die tolle Antwort und hilfreiche Beispiele. Wissen Sie zufällig, ob die Verwendung von hg-Lesezeichen auch eine Option ist?
Erik
@Erik Möglicherweise, aber ich habe keine Erfahrung damit.
Adam Houldsworth
2
Lesezeichen können verwendet werden, um bei Option 3 zu helfen. Sie können eines verwenden, um die Revision zu kennzeichnen, die Sie erstellt haben, um Ihre Änderung zu speichern. Sie können die Aufgabe nicht alleine erledigen.
Steve Kaye
Option --allwird nicht erkannt. Es ist ein Standardverhalten, alle Änderungen trotzdem zurückzustellen.
NaXa
@naXa Hallo Kumpel, wenn einer meiner Befehle etwas falsch ist (möglicherweise weil sich die Version geändert hat), können Sie die Antwort gerne bearbeiten und ich werde sie gegebenenfalls genehmigen :-)
Adam Houldsworth
23

Persönlich mag ich keine der bisher veröffentlichten Antworten:

  1. Ich mag keine Klonverzweigung, weil ich möchte, dass jedes Projekt nur ein Verzeichnis hat. Wenn Sie gleichzeitig an verschiedenen Verzeichnissen arbeiten, wird der Verlauf der letzten Dateien meiner Editoren vollständig durcheinander gebracht. Am Ende ändere ich immer die falsche Datei. Also mache ich das nicht mehr.
  2. ich benutze shelve für schnelle Korrekturen (nur um meine nicht festgeschriebenen Änderungen in einen anderen Zweig zu verschieben, wenn ich merke, dass ich am falschen bin). Sie sprechen von Tagen, auf keinen Fall würde ich tagelang etwas zurückstellen.
  3. Ich denke, es mqist zu kompliziert für eine so gewöhnliche Sitzung

Ich denke, der beste Weg ist, einfach Ihre Änderungen festzuschreiben, bevor Sie zum Änderungssatz zurückkehren, bevor Sie diese Änderungen starten und von dort aus arbeiten. Es gibt einige kleinere Probleme, lassen Sie mich veranschaulichen:

Angenommen, Sie haben das Änderungsset A. Dann beginnen Sie mit Ihren Änderungen. An dieser Stelle möchten Sie es für eine Weile beiseite legen. Legen Sie zunächst Ihre Arbeit fest:

hg ci -m "Working on new stuff"

Wenn Sie möchten, können Sie ein Lesezeichen hinzufügen, um die spätere Rückkehr zu vereinfachen. Ich erstelle immer Lesezeichen für meine anonymen Zweige.

hg bookmark new-stuff

Kehren Sie vor diesen Änderungen zum Änderungssatz zurück

hg update A

Von hier aus arbeiten Sie und generieren das Änderungsset C. Jetzt haben Sie 2 Köpfe (B und C) und werden gewarnt, wenn Sie versuchen zu drücken. Sie können nur einen Zweig verschieben, indem Sie den Kopf dieses Zweigs angeben:

hg push -r C

Oder Sie können die Phase des new-stuffZweigs in geheim ändern . Geheime Änderungssätze werden nicht gepusht.

hg phase -r new-stuff --secret --force
Rafael Piccolo
quelle
Danke für die ausführliche Antwort! Ich lese sehr gerne die Workflows der Leute für diese (normalen?) Probleme.
Erik
ich denke, dass mq ist ein bisschen zu kompliziert für genau diese Situation, aber es hat ein ausreichend breites Anwendungsspektrum, einschließlich dieses, dass es sich lohnt, die Zeit zu investieren, um fließend damit umzugehen.
Norman Gray
12

Um lokale nicht festgeschriebene Änderungen beizubehalten, ist es für mich am einfachsten, sie als Patch-Datei zu speichern.

hg diff > /tmp/`hg id -i`.patch

und wenn Sie zum vorherigen Status zurückkehren müssen:

hg up <REV_WHERE_SAVED>
hg patch --no-commit /tmp/<REV_WHERE_SAVED>.patch
mapcuk
quelle
Ich würde Streifen /tmpund hg id -iund es wird auch auf Windoof arbeiten.
Anatoly Techtonik
Und hg upwird dort nicht benötigt.
Anatoly Techtonik
1
@techtonik Was passiert, wenn ich den Patch auf eine andere Revision anwende? Besonders wenn gepatchte Dateien geändert werden.
Mapcuk
Mercurial wird versuchen, es zusammenzuführen, und Sie müssen sich trotzdem mit Konflikten auseinandersetzen.
Anatoly Techtonik
6

Sie können Ihr Repo einfach mehrmals klonen. Ich neige dazu, einen Root-Klon zu haben, dann mehrere Kinder von dort. Beispiel:

  • MyProject.Root
  • MyProject.BugFix1
  • MyProject.BugFix2
  • MyProject.FeatureChange1
  • MyProject.FeatureChange2

Die 4 Kinder werden alle von der Wurzel geklont und drücken / ziehen zur / von der Wurzel. Der Root drückt / zieht dann irgendwo aus dem Master-Repo im Netzwerk / Internet. Die Wurzel fungiert als Ihre Art persönlicher Staging-Bereich.

In Ihrem Fall würden Sie einfach ein neues Repo klonen und mit der Arbeit beginnen. Lassen Sie Ihre "Regal" -Arbeit im anderen Repo in Ruhe. So einfach ist das.

Der einzige Nachteil ist die Speicherplatznutzung, aber wenn dies ein Problem wäre, würden Sie DVCS sowieso nicht verwenden;) Oh, und es verschmutzt Ihre Visual Studio-Liste "Letzte Projekte", aber was solls.

[Folgende Kommentare bearbeiten]: -

Zum Schluss ... was Sie tun, ist völlig in Ordnung und normal. Ich würde behaupten, dass dies die bestmögliche Arbeitsweise ist, wenn Folgendes zutrifft: 1) Es ist nur von kurzer Dauer. 2) Sie müssen nicht mit anderen Entwicklern zusammenarbeiten. 3) Die Änderungen müssen Ihren PC erst nach dem Festschreiben verlassen / Push-Zeit.

nbevans
quelle
Gibt es einen Grund, keine Filialen zu verwenden? Dafür sind sie da und wesentlich schneller als das Repo-Klonen.
Adam Houldsworth
In meiner Frage stellte ich Folgendes fest: Meine übliche Methode bestand darin, einen neuen Zweig mit dem Klon zu erstellen, aber es gibt möglicherweise bessere Möglichkeiten.
Erik
1
@AdamHouldsworth, technisch gesehen sind dies Zweige ... nur kurzlebige. Es ist völlig dumm, einen benannten Zweig für ein kurzlebiges Stück Arbeit zu machen. Es missbraucht den Zweck namens Zweige, die für langlebige Arbeitsgeschichten sind.
Nbevans
@NathanE Wenn Sie der Meinung sind, dass benannte Zweige für kurzlebige Arbeit "völlig dumm" sind, gibt es auch anonyme Verzweigungen, Regale oder die Patch-Warteschlange als andere einfache Optionen. Das erneute Klonen ist meiner Meinung nach angesichts anderer Optionen ebenso dumm - ein potenzieller Vorteil besteht darin, dass zwei Codesätze in zwei VS-Instanzen geöffnet sind, aber ich muss dies selten tun, so dass die Verwendung von Klonen selbstverständlich nicht der Fall ist diene mir nicht. Nur zur Klarstellung war ich nicht der Downvoter.
Adam Houldsworth
@ NathanE Sie sind auch nicht exklusiv für "langlebige Arbeitsgeschichten", das ist nur etwas, in dem sie gut sind, wenn Sie einer kontinuierlichen Integration folgen. Direkt aus den Dokumenten : "Verzweigungen treten auf, wenn Entwicklungslinien auseinander gehen". Wenn Sie einen Arbeitsgegenstand zurückstellen, um an etwas anderem zu arbeiten, klingt dies für mich nach Divergenz, unabhängig davon, wie langlebig sie ist.
Adam Houldsworth