125 Stimmen

Mercurial verschiebt Änderungen in einen neuen Zweig

Ich habe eine Reihe von Änderungen, die ich in mein lokales Repository übertragen habe, die aber noch nicht veröffentlicht wurden. Da die Arbeit an einer Funktion länger dauert als erwartet, möchte ich diese Änderungen in einen benannten Zweig auslagern, bevor ich sie veröffentliche. Wie kann ich das tun?

155voto

Oben Sonne Punkte 9734

Wie von Mark vorgeschlagen, ist die MqExtension ist eine Lösung für Ihr Problem. IMHO ist ein einfacherer Arbeitsablauf die Verwendung der Erweiterung um die Basis . Angenommen, Sie haben eine Geschichte wie diese:

@  changeset:   2:81b92083cb1d
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   1:8bdc4508ac7b
|  summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

Dies bedeutet, dass die Revision 0 ist die Grundlage, auf der Sie mit der Arbeit an Ihrem Feature begonnen haben. Jetzt wollen Sie Revisionen haben 1-2 auf einem benannten Zweig, sagen wir my-feature . Aktualisierung auf Revision 0 und erstellen Sie diesen Zweig:

$ hg up 0
$ hg branch my-feature
$ hg ci -m "start new branch my-feature"

Die Geschichte sieht nun folgendermaßen aus:

@  changeset:   3:b5939750b911
|  branch:      my-feature
|  tag:         tip
|  parent:      0:d554afd54164
|  summary:     start new branch my-feature
|
| o  changeset:   2:81b92083cb1d
| |  summary:     my new feature: edit file a
| |
| o  changeset:   1:8bdc4508ac7b
|/   summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

Verwenden Sie die rebase Befehl zum Verschieben von Revisionen 1-2 zur Überarbeitung 3 :

$ hg rebase -s 1 -d 3

Daraus ergibt sich die folgende Grafik:

@  changeset:   3:88a90f9bbde7
|  branch:      my-feature
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   2:38f5adf2cf4b
|  branch:      my-feature
|  summary:     my new feature: add file b
|
o  changeset:   1:b5939750b911
|  branch:      my-feature
|  summary:     start new branch my-feature
|
o  changeset:   0:d554afd54164
   summary:     initial

Wie bereits in den Kommentaren zu Marks Antwort erwähnt, ist das Verschieben von bereits gepushten Changesets generell eine schlechte Idee, es sei denn, Sie arbeiten in einem kleinen Team, in dem Sie in der Lage sind, zu kommunizieren und Ihre Manipulation der Historie durchzusetzen.

30voto

Mark Tolonen Punkte 146757

Sie können die MqExtension . Nehmen wir an, die zu verschiebenden Änderungssätze sind die Revisionen 1-3:

hg qimport -r 1:3    # convert revisions to patches
hg qpop -a           # remove all them from history
hg branch new        # start a new branch
hg qpush -a          # push them all back into history
hg qfin -a           # finalize the patches

9voto

Guillaume Vincent Punkte 11278

Ich bevorzuge die beschriebene Patch-Lösung aquí von Mark Tolonen

Was ich habe:

hg log -G

#default branch
@  changeset:   3:cb292fcdbde1
|
o  changeset:   2:e746dceba503
|
o  changeset:   1:2d50c7ab6b8f
|
o  changeset:   0:c22be856358b

Was ich will:

  @  changeset:   3:0e85ae268e35
  |  branch:      feature/my_feature
  |
  o  changeset:   2:1450cb9ec349
  |  branch:      feature/my_feature
  |
  o  changeset:   1:7b9836f25f28
  |  branch:      feature/my_feature
  |
 /
|
o  changeset:   0:c22be856358b

mercurialische Befehle:

hg export -o feature.diff 1 2 3
hg update 0
hg branch feature/my_feature
hg import feature.diff

Hier ist der Status meines lokalen Repositorys

@  changeset:   6:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   5:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   4:7b9836f25f28
|  branch:      feature/my_feature
|
| o  changeset:   3:cb292fcdbde1
| |
| o  changeset:   2:e746dceba503
| |
| o  changeset:   1:2d50c7ab6b8f
|/
|
o  changeset:   0:c22be856358b

Jetzt muss ich die Revisionen 1, 2 und 3 aus meinem Standardzweig löschen. Sie können dies mit dem Befehl strip aus der mq-Erweiterung tun. hg strip entfernt den Änderungssatz und alle seine Nachkommen aus dem Repository.

Aktivieren Sie die Erweiterung, indem Sie die folgenden Zeilen zu Ihrer Konfigurationsdatei (.hgrc oder Mercurial.ini) hinzufügen:

vim ~/.hgrc und hinzufügen:

[extensions]
mq =

Und jetzt entfernen Sie dieses Repository auf Revision 1.

hg strip 1

und hier sind wir

@  changeset:   3:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   2:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   1:7b9836f25f28
|  branch:      feature/my_feature
|
o  changeset:   0:c22be856358b

Hinweis: Die Änderungssätze sind unterschiedlich, aber die Revisionen sind gleich.

5voto

Matas Vaitkevicius Punkte 53532

Für diejenigen, die GUI verwenden möchten

  1. Gehe zu Tortoise Hg -> File -> Settings dann ankreuzen rebase .

enter image description here

  1. Schildkröte UI neu starten

  2. Erstellen Sie einen neuen Zweig, in den Sie die Änderungen verschieben werden. Klicken Sie auf den Namen des aktuellen Zweigs -> wählen Sie Open a new named branch -> Name des Zweigs wählen.

enter image description here

  1. Wenn die Änderungen, die Sie verschieben möchten, noch nicht vorgenommen wurden public (z.B. draft ) gehen Sie zu 5. (Wenn die Änderungen bereits veröffentlicht wurden und Sie kein Senior-Entwickler sind, sollten Sie mit jemandem sprechen, der einen höheren Rang hat (einen Sündenbock finden), da Sie möglicherweise viel Mist bauen, ich übernehme keine Verantwortung :) ).

Gehe zu View -> Show Console (oder Ctrl + L ) dann in die Konsole schreiben hg phase -f -d 2 - wobei 2 die niedrigste Revision ist, die in den neuen Zweig verschoben wird.

  1. Gehen Sie zu Zweig und Revision (sollte die oberste Revision sein, wenn Sie Änderungen in den in Schritt 3 erstellten Zweig verschieben). Right Mouse -> Update

  2. Gehen Sie zu branch und revsion und verschieben Sie Änderungen von Right Mouse -> Modify History -> Rebase

enter image description here

  1. Klicken Sie auf Rebase und beten Sie, dass es keine Konflikte gibt, fusionieren Sie, wenn Sie müssen.

  2. Push-Änderungen, zu diesem Zeitpunkt sollten alle Revisionen noch draft .

  3. Wechseln Sie zur obersten Revision des Zweigs, in den Sie die Änderungen verschieben wollten Right Mouse -> Change Phase to -> Public .

enter image description here

Ich hoffe, das spart Ihnen etwas Zeit.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X