Mercurial Move wechselt zu einem neuen Zweig

124

Ich habe eine Reihe von Änderungen vorgenommen, die ich in mein lokales Repository übernommen habe, die jedoch noch nicht übertragen wurden. Da ein Feature länger dauert als erwartet, möchte ich diese Änderungen vor dem Push auf einen benannten Zweig übertragen. Wie kann ich das machen?

Casebash
quelle

Antworten:

153

Wie von Mark vorgeschlagen, ist die MqExtension eine Lösung für Ihr Problem. Meiner Meinung nach ist es einfacher, die Rebase-Erweiterung zu verwenden . 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 0die Basis ist, auf der Sie mit der Arbeit an Ihrer Funktion begonnen haben. Jetzt möchten Sie beispielsweise 1-2einen benannten Zweig überarbeiten my-feature. Aktualisieren Sie auf Revision 0und erstellen Sie diesen Zweig:

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

Die Geschichte sieht jetzt so 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 den rebaseBefehl, um Revisionen 1-2auf Revision zu verschieben 3:

$ hg rebase -s 1 -d 3

Dies führt zu der folgenden 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

Das war's ... Wie in den Kommentaren zu Marks Antwort erwähnt, ist es im Allgemeinen eine schlechte Idee, sich bereits umgedrückte Änderungssätze zu bewegen, es sei denn, Sie arbeiten in einem kleinen Team, in dem Sie in der Lage sind, Ihre Verlaufsmanipulation zu kommunizieren und durchzusetzen.

Oben Sonne
quelle
4
IMHO ist der Nachteil dieser Lösung, dass sie ein Dummy-Commit "Neue Verzweigung starten my-feature" einführt (dh eines, das keine Dateien ändert).
Sschuberth
9
@sschuberth: Ich denke, explizit zu sein ist hier eine gute Sache. Wenn das zusätzliche Änderungsset ein Problem für Sie ist, kombinieren Sie es mit dem nachfolgenden (z. B. mithilfe des foldBefehls der jetzt integrierten histedit- Erweiterung).
Oben Sonne
6
@AmirRachum: hg log -G( GraphlogExtension ). Ich habe einige Zeilen manuell entfernt, aber es hätte auch vollständig automatisch mit benutzerdefinierten Protokollstilen gerendert werden können .
Oben Sonne
2
Aktivieren rebase Erweiterung: mercurial.selenic.com/wiki/RebaseExtension#Configuration
56ka
1
@sschuberth da stimme ich zu. Meine Problemumgehung besteht darin, Ihre Nicht-Dummy-Commits mit dem Flag --keepbranches auf das übergeordnete Element des Dummy-Commits zurückzusetzen und dann Ihr Dummy-Commit zu entfernen. Dies ist eine Menge Arbeit, um einen Filialnamen zu ändern, aber manchmal ist Mercurial so dumm.
weberc2
30

Sie können die MqExtension verwenden . Angenommen, 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
Mark Tolonen
quelle
Ich möchte 63:64 und 66:68 importieren. Ich
bekomme
Was willst du mit 65 machen? Mq kann nur aufeinanderfolgende Änderungssätze von einem Kopf konvertieren. Normalerweise werden unveränderliche Änderungssätze in veränderbare Patches umgewandelt, die bearbeitet werden können. Dadurch werden die Hashes geändert (die alle Kinder betreffen), sodass Sie nicht überspringen können.
Mark Tolonen
Ich habe eine Reihe von Änderungen (einschließlich 65), die ich am Hauptzweig vorgenommen und gepusht habe
Casebash
1
Bearbeiten Sie keine Push-Sets, die verschoben wurden. Mq ändert die Hashes, sodass sie effektiv neue Änderungssätze sind. Bearbeiten Sie nur den Verlauf, der nicht verschoben wurde.
Mark Tolonen
Wenn Sie bereits 65 gedrückt haben, sollten Sie 63 und 64 auf keinen Fall bewegen und sich nur mit 66:68 zufrieden geben (wieder nur, wenn Sie sie nicht gedrückt haben).
Matt
9

Ich bevorzuge die hier beschriebene Patch-Lösung 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 möchte:

  @  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

mercurials 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 Erweiterung von mq tun. hg stripEntfernt das Änderungsset und alle seine Nachkommen aus dem Repository.

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

vim ~/.hgrc und hinzufügen:

[extensions]
mq =

Und jetzt entfernen Sie dieses Repository in 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: Änderungssätze sind unterschiedlich, aber Revisionen sind gleich

Guillaume Vincent
quelle
5

Für diejenigen, die GUI verwenden möchten

  1. Gehen Sie zu Tortoise Hg-> File-> Settingsund kreuzen Sie an rebase.

Geben Sie hier die Bildbeschreibung ein

  1. Starten Sie die Schildkröten-Benutzeroberfläche neu

  2. Erstellen Sie einen neuen Zweig, in den Sie Änderungen verschieben. Klicken Sie auf den aktuellen Filialnamen -> wählen Sie Open a new named branch-> wählen Sie den Filialnamen.

Geben Sie hier die Bildbeschreibung ein

  1. Wenn Änderungen, die Sie verschieben möchten, nicht vorgenommen wurden public(z. B. draft), fahren Sie mit Schritt 5 fort. (Wenn Änderungen bereits veröffentlicht wurden und Sie kein leitender Entwickler sind, sollten Sie mit einem älteren Mitarbeiter sprechen (einen Sündenbock holen), da Sie möglicherweise große Probleme haben Ich übernehme keine Verantwortung :)).

Gehen Sie zu View-> Show Console(oder Ctrl+ L) und schreiben Sie in die Konsole. hg phase -f -d 2Dabei ist 2 die niedrigste Version, die Sie in einen neuen Zweig verschieben.

  1. Gehen Sie zu Zweig und Revision (sollte die oberste Revision sein, wenn Sie Änderungen an einem neuen Zweig verschieben, der in Schritt 3 erstellt wurde.) Right Mouse->Update

  2. Gehen Sie zu Zweig und Version, um die Änderungen von Right Mouse-> Modify History-> zu verschiebenRebase

Geben Sie hier die Bildbeschreibung ein

  1. Klicken Sie Rebaseund beten Sie, dass es keine Konflikte gibt. Führen Sie diese zusammen, wenn Sie müssen.

  2. Push-Änderungen, an dieser Stelle sollten noch alle Revisionen sein draft.

  3. Gehen Sie zur obersten Revision in dem Zweig, in den Sie Änderungen verschoben haben Right Mouse-> Change Phase to-> Public.

Geben Sie hier die Bildbeschreibung ein

Hoffe das spart dir etwas Zeit.

Matas Vaitkevicius
quelle
Gut gemacht! Ich werde es versuchen, aber nur eine Frage: Warum sollte die Phase am Ende öffentlich sein? "Alle in einem Remote-Repository angezeigten Änderungssätze sind öffentlich". Wenn Sie also pushen, wird sie nicht trotzdem auf "öffentlich" gesetzt.
Joshua Duxbury
@JoshLeeDucks Beim Drücken wechseln sie nicht publicmehr automatisch zu (zumindest für mich nicht).
Matas Vaitkevicius