2012-10-31 3 views
5

Ich habe eine Reihe von dummen Schritten mit meine lokale Kopie unserer gemeinsamen Repository, und ich bin auf der Suche nach einem Weg, wie etwas reparieren. Die Schritte sind:Wie zu pushen, ohne neue Köpfe zu erstellen, nach dem Erstellen Multi-Head-Zweig, Rebase und mehrere Merges

  • ich Lesezeichen mehrere Köpfe einer Entwicklungszweig, dass andere Menschen benutzen verwendet haben:

    -o---o---o-----o--- <- dev branch 
        \----1----1------ <- another head of the dev branch, 
             where I committed stuff 
    
  • Ich habe eine neue Filiale, noch lokal, einige Zeit später

    /---------------x <- new branch 
    -o---o---o-----o--- <- dev branch 
        \----1----1------ <- another head of the dev branch, 
             where I committed stuff 
    
  • für einen Kopf, dass nur meinen Code enthält, habe ich ein Fütterungsmaterial auf einem anderen Zweig

        /-1'--1'-- <- rebase 
        /---------------x   <- new branch 
    -o---o---o-----o---   <- dev branch 
        \----1----1------   <- another head of the dev branch, 
                where I committed stuff 
    
  • dann fusionierte ich das Fütterungsmaterial, und dann ein paar Commits später, ich fusionierte Standard

        ----------d-\  <-default 
               \ 
            /-1'--1'\  \ 
        /---------------x--------x--x-x-x-- <- new branch 
    -o---o---o-----o---   
        \----1----1------   
    

Nun wollte ich meine neue Filiale an den Server (hg push --new-branch -b newBranch) drücken , aber ich bekomme abort: push creates new remote head, da commits 1' Dev Zweig gehören.

Was ist das Richtige? Ich möchte diesen zusätzlichen Kopf vermeiden.

aktualisieren:

pro Anfrage, dies ist die Ausgabe von hg heads:

changeset: 839:f2033d695fcd <- want to push this 
branch:  newBranch 
tag:   tip 
user:  me 
date:  Wed Oct 31 13:05:51 2012 +0100 

changeset: 826:7fde19d7f467 
branch:  devBranch 
user:  my-collegue 
date:  Tue Oct 23 14:59:42 2012 +0200 

changeset: 820:23853bbf68df <- the part after rebase that got merged 
branch:  devBranch 
user:  me 
date:  Mon Oct 22 15:36:26 2012 +0200 

changeset: 807:899344cfb145 <- obsolete (branch with 1's) 
branch:  devBranch 
parent:  711:454f29c03fb1 
user:  me 
date:  Mon Oct 22 15:36:26 2012 +0200 

changeset: 712:d5e8a62a7f5f <- default, needs to stay 
parent:  648:2bbcc01aa191 
user:  me 
date:  Wed Aug 22 16:21:09 2012 +0200 
+0

Verwenden Sie nicht freihändig "Zeichnung" - Sie haben Konsolenbefehle und die Fähigkeit, Befehle in Frage zu stellen ** formatiert ** ('hg log' oder' hg glog' für Baum hier und bei http: // stackoverflow.com/questions/11982648/reassigning-local-commits-to-a-different-branch-in-mercurial, zum Beispiel). Für jetzt, bitte, fügen Sie die Ausgabe von 'hg heads' mit Kommentar hinzu - welcher Kopf ist veraltet und darf nicht existieren (total oder nur in push-target). Lesen Sie auch über -r Option im Push-Befehl –

+0

Hallo @LazyBadger, kann ich nicht die Ausgabe von "log", da es viel mehr Commits als ich beschrieben, und ich habe auch vergessen, die genauen Befehle, die ich ausgeführt, um zu bekommen dieser Zustand ... Frage aktualisiert, um die Ausgabe von Köpfen zu enthalten. Ich verstehe Ihren Hinweis auf die Option "-r" nicht, wie/warum sollte es helfen? –

+0

exakte Befehle werden in diesem Fall nicht benötigt - ** Sie ** (nicht ich) müssen den Baum von devBranch sehen (von gemeinsamen Eltern von 807 und 820 bis 826), definieren Sie die * Möglichkeit * (und * Notwendigkeit *) von fusionieren devBranchs Köpfe. Oder einfach 'push -r f2033d695fcd' wird genug sein –

Antwort

1

löste ich das Problem, ohne einen anderen Kopf zu drängen das Repo, und ohne 23853bbf68df auf newBranch zu verschmelzen. Dies ist wahrscheinlich nicht der sauberste Weg, um es zu tun, aber ich werde es als Referenz verlassen. Kurz gesagt, ich habe die gesamte Branche rekonstruiert, indem ich alle Commits übernommen und erneut angewendet habe.

Erstens, ich tötete die newBranch ‚es Kopf 899344cfb145, indem Sie auf den ersten divergierenden Revision mit Streifen ich getan habe:

hg strip -r 646 

Dann produzierte ich E-Mail-Patches für alle Commits (konnte nicht mit mq spielen) , die in newBranch, da es Anfang:

hg export -g -r 797:808 -r 810 -r 815:822 -r 824:830 -o "%n-%m.patch" 
  • 797:808 sind die Patches in newBranch, die im rebased Teil waren von devBranch (1' entspricht der ursprünglichen Abbildung).
  • 810 und 815:822 sind andere Patches in newBranch. 811:814 gehören zu einem anderen Zweig, also musste ich diese ausschließen.
  • 823 ist ein Merge-Commit mit default, also habe ich diesen übersprungen.
  • 824:830 sind alle Commits nach der Zusammenführung mit default.

Nun importierte ich diesen Patches auf einen neuen Leiter der newBranch:

hg up -r 796 
# there are 29 patches, applying till merge 
hg import --bypass {01..21}*.patch 
hg up tip 
hg merge default 
hg ci -m 'merging in default' 
hg import --bypass {22..28}*.patch 

Schließlich habe ich nur von dem ursprünglichen Kopf newBranch abgestreift.

hg strip -r 797 

Dies funktioniert möglicherweise nicht in jeder Situation. Während der Zusammenführung musste ich einige Konflikte lösen, aber ziemlich gutartig. Hoffe, das hilft jemandem.

7

Sie nur den einen schieben kann den Kopf Sie in Mercurial interessiert sind. Für Sie würde bedeuten, tun:

hg push -r f2033d695fcd 

Wenn das Ziel Repo wurde aktualisiert Sie ziehen müssen, zusammenführen und erneut Push:

hg pull 
hg up -r <remote head> 
hg merge -r f2033d695fcd 
hg ci 
hg push 
+0

Danke für die Antwort, aber wie ich bereits erwähnt habe, erzeugt dies 'abort: Push erstellt neue remote Kopf 23853bbf688df auf Zweig devBranch'. Wie @LazyBadger es vorschlägt, werde ich versuchen, diesen Kopf zusammenzuführen, obwohl das etwas ist, was ich gerne vermeiden würde. –

+0

Das ist ein anderer Kopf als der, den du eigentlich schieben willst. Wenn Sie den Kopf angeben, den Sie mit "-r" drücken möchten, erhalten Sie diesen Kopf nicht. –

Verwandte Themen