Tonfa hat recht. Was Sie beschreiben, ist nicht "verschmelzen" (oder "drücken" oder "ziehen"); es ist "Kirschernte". Durch Drücken oder Ziehen werden alle Änderungssätze von einem Repo zu einem anderen verschoben, die noch nicht in diesem Repo enthalten sind. Eine 'Zusammenführung' nimmt zwei 'Köpfe' und führt sie zu einem neuen Änderungssatz zusammen, der die Kombination aus beiden ist.
Wenn Sie G wirklich verschieben müssen, aber möglicherweise D, E, F dort nicht aushalten können, sollten Sie G aus Repo A 'hg exportieren' und dann in Repo A 'hg importieren'. Die Transplant-Erweiterung ist ein Wrapper Export / Import mit einigen Feinheiten, um zu vermeiden, dass derselbe Änderungssatz mehrmals verschoben wird.
Der Nachteil bei der Verwendung von Import / Export, Transplantation und Kirschernte im Allgemeinen ist jedoch, dass Sie sich ohne seine Vorfahren nicht wirklich über G bewegen können, da in Mercurial der Name eines Änderungssatzes sein "Hashid" ist, das die Hashids seiner Eltern enthält . Unterschiedliche Eltern (Gs neuer Elternteil wäre C und nicht F) bedeuten ein anderes Hashid, also ist es nicht mehr G - es ist die Arbeit von G, sondern ein neuer Änderungssatz mit Namen.
Sich als etwas Neues über G zu bewegen, nennen wir es G '(Gee prime), ist für einige Anwendungen keine große Sache, für andere ist es eine große Pita. Wenn Repo B bald ein neues Änderungsset erhält, ändert sich H, und Sie möchten es über das übergeordnete Element verschieben, von G zu G ', die unterschiedliche Hashes haben. Das bedeutet, dass H als H '- 100 Änderungssätze auf der ganzen Linie übergeht und Sie für alles verschiedene Hashhids haben, weil Sie es nicht ertragen konnten, D, E, F in Repo A zu haben.
Die Dinge werden noch schlimmer, wenn Sie Sachen von Repo A nach Repo B verschieben möchten (die entgegengesetzte Richtung Ihres früheren Zuges). Wenn Sie versuchen, einen einfachen 'hg-Push' von A nach B durchzuführen, erhalten Sie G '(und H' und nachfolgende Nachkommen), die Duplikate der Änderungssätze sind, die Sie bereits in Repo B haben.
Was sind dann Ihre Optionen?
- Ist mir egal. Ihre Daten sind immer noch da. Sie haben nur die gleichen Änderungssätze mit unterschiedlichen Namen und arbeiten mehr am zukünftigen Austausch zwischen den beiden Repos. Es ist nicht falsch, es ist vielleicht nur ein bisschen ungeschickt, und einige Leute kümmern sich nicht darum.
- Verschieben Sie alle D, E und F auf Repo A. Sie können alle Änderungssätze verschieben, wenn sie harmlos sind, und den ganzen Ärger vermeiden. Wenn sie nicht so harmlos sind, können Sie sie verschieben und dann ein "hg backout" durchführen, um die Auswirkungen von D, E und F in einem neuen Änderungssatz H rückgängig zu machen.
- Geben Sie G zunächst eine bessere Abstammung. Es ist gemein für mich, dies zu erwähnen, weil es zu spät ist, diesen Weg zu gehen (ohne den Verlauf zu bearbeiten ). Was Sie hätten tun sollen , bevor Sie an Änderungssatz G gearbeitet haben, war zu
hg update C
. Wenn G sich nicht auf die Änderungssätze D, E und F verlässt oder diese benötigt, sollte es nicht ihr Kind sein.
Wenn Sie stattdessen zuerst auf C aktualisieren, erhalten Sie ein Diagramm wie das folgende:
A - B - C - D - E - F
\
G
dann wäre die ganze Antwort auf diese Frage einfach hg push -r G ../repoA
und G würde sauber übergehen und den gleichen Hash verbergen, und D, E und F würden nicht dazu passen.
AKTUALISIEREN:
Wie in den Kommentaren ausgeführt. Bei modernen Mercurials ist der hg graft
Befehl der perfekte Weg, dies zu tun.