2010-06-03 11 views
19

(Ich bin ein relativer Neuling bei TortoiseHg, also ertragen Sie mit mir :-) Ich verwende TortoiseHg auf zwei Rechnern, um mit meinem Remote-Quellen-Repository zu sprechen. Ich habe Änderungen an einer Maschine vorgenommen, sie festgeschrieben und versucht, sie in das Remote-Repository zu verschieben, ABER ich habe vergessen, zuerst einen Pull auszuführen, um den neuesten Code zuerst zu bekommen. Der Push gab mir ein paar Zeilen Output, was darauf hindeutet, dass ich vergessen habe, zuerst zu ziehen (wahr!) Und etwas wie "Abbruch: Push erstellt neue entfernte Zweige ..." erwähnt.Wie versehentliche Verzweigung in TortoiseHg entfernen?

Also habe ich eine Pull, die mehrere Knoten an den Kopf meiner Grafik im Repository Explorer hinzugefügt. Das Problem ist, dass der Push, den ich versucht habe, jetzt als Zweig im Repository-Explorer angezeigt wird. Von der Serverseite (Codeplex) aus gesehen, zeigt es keinen Hinweis auf meinen versuchten Push, was darauf hinweist, dass diese versehentliche Verzweigung immer noch lokal auf meinem Computer ist.

Wie kann ich diese versehentliche Verzweigung entfernen? Ich habe versucht, diesen Knoten in der Grafik auszuwählen und dann "Zurück" zu machen, aber es schien nichts zu tun. Ich frage mich, ob es am einfachsten wäre, einfach meinen Verzeichnisbaum auf meinem lokalen Rechner zu verwerfen und einen komplett neuen, sauberen Zug vom Server zu machen ...?

Antwort

17

Stellen Sie zunächst sicher, dass Sie alle lokalen Änderungen vorgenommen haben. Führen Sie dann die Verzweigungen zusammen, indem Sie hg merge aufrufen und das Ergebnis festschreiben.

Dies sollte Sie zurück zu einem einzigen Zweig bringen, die beiden Köpfe wieder vereint.

+7

Das klingt wie die Filiale wird noch da sein, ja? Ich hoffe, den Zweig komplett zu entfernen, da ich ihn noch nicht dauerhaft auf dem Server eingerichtet habe. –

+0

@msorens: Die zwei Changesets, die "parallel" begangen wurden, bleiben so, aber ist das wichtig? Beim Zusammenführen werden die beiden Zweige in einer einzigen Top-Revision zusammengefügt. Von nun an wird es wieder nur eine einzige neueste Revision geben, obwohl sie in ihren Vorgängern eine kurze Verzweigung in zwei Zweige hat. – sth

+3

@msorens: Ich stimme etw. Zu. Nach einer Weile mit Mercurial merkt man, dass es sich nicht lohnt, die Revisionshistorie quietsch sauber zu halten. Es spielt keine Rolle, dass die Changesets nicht in der richtigen Reihenfolge zwischen Ihrem Server und Ihren lokalen Repos liegen oder dass Sie eine kurzlebige anonyme Verzweigung haben (beides ist zu erwarten, wenn mehr als eine Person an einem Projekt arbeitet)). –

2

Wählen Sie im Repository-Explorer die erste Version Ihrer lokalen Änderungen aus, klicken Sie dann mit der rechten Maustaste auf die Spitze der gerade gezogenen Verzweigung und wählen Sie "Neu auf der ausgewählten Verzweigung" oder "Verlauf ändern-> Neu aufsetzen "Abhängig von Ihrer Client-Version. Dies wird deine Drehzahl auf die gezogenen zurückführen.

Zusätzlich zu helfen, es in Zukunft zu vermeiden ...

In Repository-Explorer Extras-> Einstellungen wählen. Wählen Sie in der Dropdown-Liste oben links "Globale Benutzereinstellungen" aus, dies gilt für alle Repositorys. Wählen Sie dann auf der linken Seite Synchronisieren. Wählen Sie in "After Pull Operation" die Option "Rebase". Dies führt dazu, dass Ihre lokalen Revisionen nach den gerade durchgeführten Revisionen "rebasiert" werden, anstatt sie in einem anderen Zweig zu belassen.

Dies ist, wie ich es mache und ist wahrscheinlich das, was Sie normalerweise wollen. Weitere Informationen finden Sie unter rebase project und rebase extension.

+0

[Ich spalte dies in 2 Kommentare wegen SO Einschränkungen.] Ich mag die Vorstellung davon. Nur ein paar Dinge: Erstens, keine solche Option in meinem Kontextmenü. Die RebaseExtension-Seite lieferte die Antwort - aktivieren Sie sie, indem Sie einige Zeilen in die Konfigurationsdatei einfügen, die unter Abschnitt 5 des Mercurial-Handbuchs zu finden sind. Ich habe das gemacht und dann eine Rebase ausgeführt: Es hat über nicht unterstützte Dateitypen für zwei Dateien mit der Endung .orig geklagt, die durch die Rebase-Operation selbst erstellt wurden! Es zeigte dann an, dass es abgebrochen wurde, damit ich die Konflikte beheben konnte, und sagte "hg rebase --continue" wenn es erledigt ist ... –

+0

[Teil 2 meines geteilten Kommentars] Aber da ich in TortoiseHg nicht die cmd Linie laufe, nicht sicher, wie ich die "Rebase - Fortsetzen" -Operation machen würde ... Schließlich sagt die Bestätigung, in meinem Fall, "14 auf 6 rebase?". Das scheint mir rückständig zu sein: 14 ist der gezogene Hauptzweig; 6 ist meine lokale Filiale. –

+0

@msorens re: Kontextmenü - Es ist irgendwie peinlich. Sie müssen zuerst eine Umdrehung auswählen, indem Sie mit der linken Maustaste klicken, wodurch sie hervorgehoben wird. Dann wähle den nächsten, indem du mit der rechten Maustaste klickst, woraufhin beide Drehzahlen hervorgehoben werden und dir die Rebase-Option gegeben wird. Wenn es nicht für dich auftaucht, hört sich das vielleicht nach einer anderen Frage an. –

5

Führen Sie einen "Zusammenführen mit" aus und aktivieren Sie die Option "Alle Änderungen von der Zusammenführungszielversion (andere) verwerfen". Natürlich sollten Sie sicherstellen, dass das als Zusammenführungsziel angezeigte Ziel wirklich das Ziel ist, das Sie wegwerfen möchten, bevor Sie auf die Schaltfläche Zusammenführen klicken.

+1

Dies würde die Änderungen des Fragestellers wegwerfen, was meiner Meinung nach nicht die Absicht der Frage war. –

+1

das ist, was ich dachte, aber betrachten Sie die Revisions-Code-Referenzen, die Verwerfung erfolgt zu dem, den Sie zum Zusammenführen ausgewählt –

6

Ich hatte eine Verzweigung, die ich nicht wollte, aber ich konnte die Verzweigung nicht zusammenführen (oder es war sehr schwierig für mich, herauszufinden, wie zu verschmelzen), weil es einen Konflikt basierend auf einer Dateinamenänderung enthielt.

Letztendlich entschied ich mich für hg commit --close-branch. Da die Filiale nur auf meinem lokalen Repo existierte, und nicht auf dem Repo, von dem ich geklont hatte, hat der folgende hg push nicht einmal die Mühe gemacht, den geschlossenen Zweig zum Master Repo zu schieben! Sehr angenehm. An diesem Punkt musste ich nur noch meinen lokalen Repo löschen und vom "Master" neu klonen.

0

So wird es mit dem Befehlszeilentool gemacht. Ich denke, es kann leicht zu TortoiseHg gemappt werden (obwohl ich nicht sicher bin, da ich es nie verwende ...) Wie auch immer, da es nur einmal gemacht werden sollte, denke ich, dass es hier kein Problem gibt, das Terminal zu benutzen .

Ein Beispiel Setup

Angenommen, Ihr Remote-Repository so etwas wie dieses:

@ changeset: 3:a4c18a1fba12 
| tag:   tip 
| summary:  commit 4 
| 
o changeset: 2:91c5dbfba15c 
| summary:  commit 3 
| 
o changeset: 1:4c77cb7952ea 
| summary:  commit 2 
| 
o changeset: 0:085dae46f27e 
    summary:  commit 1 

Lokal nicht 4 verpflichten hatte, so dass Sie direkt begehen etwas begangen mehr als 3:

@ changeset: 3:39526003350f 
| tag:   tip 
| summary:  commit 4 made locally 
| 
o changeset: 2:91c5dbfba15c 
| summary:  commit 3 
| 
o changeset: 1:4c77cb7952ea 
| summary:  commit 2 
| 
o changeset: 0:085dae46f27e 
    summary:  commit 1 

So versuchen Sie es zu drücken, und erhalten Sie diese Nachricht:

$ hg push 
pushing to ssh://[email protected]/brandizzi/mercurial-test-repo 
searching for changes 
remote has heads on branch 'default' that are not known locally: a4c18a1fba12 
abort: push creates new remote head 39526003350f! 
(pull and merge or see "hg help push" for details about pushing new heads) 

Wie gewünscht, ziehen Sie es:

$ hg pull 
pulling from ssh://[email protected]/brandizzi/mercurial-test-repo 
searching for changes 
adding changesets 
adding manifests 
adding file changes 
added 1 changesets with 1 changes to 1 files (+1 heads) 
(run 'hg heads' to see heads, 'hg merge' to merge) 

Sie haben es jetzt ...

o changeset: 4:a4c18a1fba12 
| summary:  commit 4 
| 
| @ changeset: 3:39526003350f 
|/ summary:  commit 4 made locally 
| 
o changeset: 2:91c5dbfba15c 
| summary:  commit 3 
| 
o changeset: 1:4c77cb7952ea 
| summary:  commit 2 
| 
o changeset: 0:085dae46f27e 
    summary:  commit 1 

... aber Sie lieber nicht wie gewünscht zusammenführen. Sie möchten dies stattdessen haben:

o changeset: 4:a4c18a1fba12 
| summary:  commit 4 made locally 
| 
o changeset: 3:a4c18a1fba12 
| summary:  commit 4 
| 
o changeset: 2:91c5dbfba15c 
| summary:  commit 3 
| 
o changeset: 1:4c77cb7952ea 
| summary:  commit 2 
| 
o changeset: 0:085dae46f27e 
    summary:  commit 1 

Und dann möchten Sie es auf die Remote-Repo schieben.

Wie bekommen Sie das?

Solving es

das zu bekommen, Sie nicht gedrückt haben, die "commit 4 lokal gemacht". Auch gibt es keine Möglichkeit, es nach die neuen remote commits zu setzen. Sagte, dass wir bekommen können, was wir gefragt haben.

sagte, Sie müssen nur Ihre lokalen auf die neue Fern begehen rebase begehen:

$ hg rebase --source 3 --dest 4 

Wenn Sie Glück haben, das genug sein wird.

Konfliktbehandlung

Wenn Sie Pech haben, können Sie einige Konflikte haben:

$ hg rebase --source 3 --dest 4 
rebasing 3:39526003350f "commit 4 made locally" 
merging test.txt 
warning: conflicts while merging test.txt! (edit, then use 'hg resolve --mark') 
unresolved conflicts (see hg resolve, then hg rebase --continue) 

Dann lösen Sie einfach die Konflikte (durch manuell bearbeiten):

$ hg st 
M test.txt 
$ nano test.txt # Edit and save 

.. .Markiere die Datei als aufgelöst ...

$ hg resolve --mark 
(no more unresolved files) 
continue: hg rebase --continue 

... und fahren Sie mit dem Fütterungsmaterial:

$ hg rebase --continue 
rebasing 3:39526003350f "commit 4 made locally" 
saved backup bundle to /home/adam/software/mercurial-test-repo/.hg/strip-backup/39526003350f-64863882-backup.hg 

Hier ist Ihre neue Geschichte:

@ changeset: 4:ca31fe8a15f0 
| summary:  commit 4 made locally 
| 
o changeset: 3:a4c18a1fba12 
| summary:  commit 4 
| 
o changeset: 2:91c5dbfba15c 
| summary:  commit 3 
| 
o changeset: 1:4c77cb7952ea 
| summary:  commit 2 
| 
o changeset: 0:085dae46f27e 
    summary:  commit 1 

Nun schieben Sie es:

$ hg push 
pushing to ssh://[email protected]/brandizzi/mercurial-test-repo 
searching for changes 
remote: adding changesets 
remote: adding manifests 
remote: adding file changes 
remote: added 1 changesets with 1 changes to 1 files 

Diese Tage, ist es nicht als komplex wie es einmal war, oder?:)

Verwandte Themen