Mercurial: Kann ich einen Zweig umbenennen?

204

Wir haben jetzt einen "Stiging" -Zweig, in dem "Staging" eine weitaus bessere semantische Anpassung zu sein scheint. Was ist eine gute Strategie, um damit umzugehen?

KevDog
quelle

Antworten:

223

Aktualisieren Sie den stigingZweig und erstellen Sie einen neuen Zweig daraus. Dann schließen Sie den alten Zweig.

Zusammenfassend:

hg update stiging
hg branch staging
hg commit -m"Changing stiging branch to staging."
hg update stiging
hg commit --close-branch -m"This was a typo; use staging instead."
hg push --new-branch
Elliot Cameron
quelle
1
Dies ist der beste Weg, dies zu tun, den ich gefunden habe. Das Schließen des Zweigs verhindert, dass andere ihn versehentlich verwenden, da er nicht in der Ausgabe von "hg-Zweigen" angezeigt wird. Sie können später noch darauf zugreifen, wenn Sie den Namen kennen.
Utensil
2
Erlaubt Mercurial die Wiederverwendung des Namens einer geschlossenen Filiale? Wenn Sie also einen v3-Zweig haben, können Sie ihn mit der obigen Technik in v4 umbenennen und dann einen neuen v3-Zweig abspalten, obwohl Sie einen geschlossenen v3 zurückgelassen haben?
Joshua Goldberg
4
@ JoshuaGoldberg, 3noch ist falsch. Mercurial wird ermöglicht es Ihnen , einen geschlossenen Zweig Namen wieder zu verwenden , wenn Sie verwenden --force. Zum Beispiel : hg branch --force v3. Dies führt zu einer hg update v3Aktualisierung auf den neuen v3Zweig, wie Sie es wollten.
Gili
2
bestätigte @ Gilis Kommentar mit hg help branch: "- erzwinge das Setzen des Filialnamens, auch wenn er einen vorhandenen Zweig beschattet"
Joshua Goldberg
7
Wenn Sie stigingvor dem Verzweigen schließen, erhalten Sie kein "loses Ende"
max.mustermann
60

Für zukünftige Leser: Mit der rebaseErweiterung können Sie einen neuen Zweig mit demselben übergeordneten Element wie erstellen stigingund den gesamten Zweigverlauf wie folgt dorthin verschieben:

hg update -r "parents(min(branch('stiging')))"
hg branch staging
hg commit
hg rebase --source "min(branch('stiging'))" --dest staging

Dies setzt voraus, dass stigingnur ein Elternteil vorhanden ist. Natürlich können Sie stattdessen auch explizite Revisionsnummern verwenden.

Anmerkung 1: Wenn Zweig stigingverschmilzt mit anderen Zweigen enthält, ich denke , dass dies sie erhalten wird, solange stagingund stiginghaben die gleichen Eltern. Aber ich würde es auf jeden Fall noch einmal überprüfen.

Hinweis 2: Da hierdurch der Verlauf bearbeitet wird, verschwindet der alte Zweig nicht einfach aus geklonten Repositorys (siehe rebaseDokumentation). Wenn nicht jeder neu klonen kann, ist dies möglicherweise keine sehr praktische Lösung für eine große Gruppe.

Hinweis 3 / Bearbeiten (mit freundlicher Genehmigung von @JasonRCoombs): Jetzt, da Phasen in Quecksilber Standard sind, rebasewird es abgelehnt, bereits gepusste Änderungssätze zu ändern. Entweder täuschen Sie es, indem Sie die Phase wieder auf Entwurf (mit hg phases) ändern , oder lassen Sie den alten Zweig dort, wo er ist, und erstellen Sie einfach eine richtig benannte Kopie (z. B. mit `hg rebase --keep ').

alexis
quelle
+1 für kleine Teams, in denen Sie die Benutzer zum Klonen zwingen können, ist eine gute Idee - oder verwenden Sie hg convertstattdessen.
hochl
5
In späten Versionen von Mercurial schlägt der Befehl rebase mit "unveränderliches Änderungsset kann nicht wiederhergestellt werden" fehl, wenn die zu verschiebenden Änderungen "öffentlich" sind. --keepErzwingen Sie entweder, dass sie eingezogen werden (mit hg-Phasen), oder übergeben Sie sie an den Befehl rebase, der die Änderungen kopiert, anstatt sie zu verschieben.
Jason R. Coombs
In Schritt 4 : abort: can't rebase immutable changeset 11b1e2b7dc4f. Beachten Sie, dass ich Änderungssätze aus einem anderen Zweig in diesen Zweig gepfropft habe. Außerdem ist es geteilt und kann kostenlos zusammengeführt werden.
Mark Jeronimus
@ Mark, werfen Sie einen Blick auf Anmerkung 3 oben.
Alexis
6
Anstatt einen Änderungssatz für den neuen Zweig festzuschreiben und dann darüber neu zu basieren, können Sie diesen weglassen und .für Ihren --destWert verwenden, und die Basis übernimmt automatisch den neuen Zweignamen.
weberc2
16

Wenn Sie Änderungssätze haben, müssen Sie die Konvertierungserweiterung mit einer Verzweigungszuordnung verwenden, um sie umzubenennen. Jeder muss dann das neue Repo klonen oder den alten Zweig entfernen.

tghw
quelle
1
Dies ist eine interessante Lösung. Können Sie etwas näher darauf eingehen?
DrM
15

Erstellen Sie einen neuen Zweig namens "Staging" und vergessen Sie den anderen ...

lctr30
quelle
+1 das würde ich tun. Die alten Änderungssätze haben weiterhin den alten Filialnamen, die neuen jedoch den neuen Filialnamen.
Barjak
6

Dies ändert den Verlauf und ist nur für fortgeschrittene Mercurial-Benutzer. Tun Sie dies nicht, wenn Sie nicht wissen, was das bedeutet.

Wenn Stiging nur lokal ist, können Sie es in Staging mit einer Kombination aus Transplantat und Streifen ändern . Beginnen Sie mit der Aktualisierung auf den Ahnen-Änderungssatz, bei dem das Stiggen auseinander gegangen ist. Erstellen Sie den Staging-Zweig und übertragen Sie jedes Commit von Stiging zu Staging. Staging sollte jetzt eine Kopie von Stiging sein. Zerstören Sie zum Schluss das Stiging, indem Sie das erste Commit entfernen.

hg update {SHA-1 of the ancestor changeset}
hg branch staging
hg graft {first changeset in stiging} ... {stiging head-1} {stiging head}
hg strip {first changeset in stiging}
hg push --new-branch
AWrightIV
quelle
1
Für Schritt 3 können Siehg graft {first changeset in stiging}..{stiging head}
KCD