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?
Antworten
Zu viele Anzeigen?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.
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
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.
Für diejenigen, die GUI verwenden möchten
- Gehe zu
Tortoise Hg
->File
->Settings
dann ankreuzenrebase
.
-
Schildkröte UI neu starten
-
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.
- 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.
-
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
-
Gehen Sie zu branch und revsion und verschieben Sie Änderungen von
Right Mouse
->Modify History
->Rebase
-
Klicken Sie auf
Rebase
und beten Sie, dass es keine Konflikte gibt, fusionieren Sie, wenn Sie müssen. -
Push-Änderungen, zu diesem Zeitpunkt sollten alle Revisionen noch
draft
. -
Wechseln Sie zur obersten Revision des Zweigs, in den Sie die Änderungen verschieben wollten
Right Mouse
->Change Phase to
->Public
.
Ich hoffe, das spart Ihnen etwas Zeit.