Was ist in Mercurial / TortoiseHg anhand des folgenden Beispiels der einfachste Weg, die Revision "G" in Repo A zusammenzuführen, ohne D, E und F zu nehmen (Angenommen, G ist nicht von D, E oder F abhängig).
Repo A: A - B - C
Repo B (Clone of A) A - B - C - D - E - F - G
Ist ein Patch die beste Wahl?
mercurial
tortoisehg
cherry-pick
Tom Hubbard
quelle
quelle
Antworten:
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?
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:
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.quelle
In Bezug auf den Titel, der sich mit Kirschernte im Allgemeinen befasst, gebe ich das Beispiel der Arbeit in einem Repo, da Internet-Suchmaschinen Leute hierher bringen könnten, um Kirsche zu pflücken. Wenn Sie in einem Repository arbeiten, geschieht dies mit
hg graft
:Das Ergebnis ist:
Zusätzliche Warnung: Die beiden Änderungssätze werden als unabhängige, parallele Festschreibungen für dieselben Dateien behandelt und können zu Zusammenführungskonflikten führen. Aus diesem Grund sollte das Kirschpflücken für die Zweigstellenverwaltung generell vermieden werden. Zum Beispiel, wenn
G
ein Bug - Fix auf einen stabile Version Zweig angewandt merkten wie1.0.1
, sollten Sie eher fusionieren denfreeze
Zweig mit ihm, und von Zeit zu Zeit merge denmaster
Zweig mit derfreeze
Fehlerbehebung Niederlassung.quelle