Frage

In Mercurial / TortoiseHg, da das folgende Beispiel, was ist der einfachste Weg Revision "G" in Repo-A zu fusionieren, ohne dabei D, E und F (Es sei angenommen, daß G keine Abhängigkeit von D, E oder F hat).

Repo A: A - B - C

Repo B (Clone of A) A - B - C - D - E - F - G

Ist ein Patch die beste Wette?

War es hilfreich?

Lösung

Tonfa ist richtig. Was Sie beschreiben, ist nicht ‚Verschmelzung‘ (oder ‚schieben‘ oder ‚Ziehen‘); es ist ein ‚Rosinenpicken‘. Ein Push oder ein Pull bewegt alle Änderungsmengen von einem Repo zum anderen, die nicht bereits in diesem Repo sind. A ‚merge‘ nimmt zwei ‚Kopf‘ und verschmilzt sie zu einem neuen changeset nach unten, dass die Kombination von beiden ist.

Wenn Sie wirklich G über verschieben müssen, können aber möglicherweise nicht ausstehen D, E mit, da F sollen Sie 'hg Export' G aus Repo-A, und dann 'hg Import' es in Repo A. Die transplantation Erweiterung ist ein Wrapper um Export / Import mit einigen Feinheiten zu vermeiden, um die gleiche changeset über mehr bewegende Zeiten.

Doch , der Nachteil bei der Verwendung Import / Export, Transplantation und Rosinenpicken im Allgemeinen ist, dass Sie nicht wirklich G ohne seine Vorfahren bewegen können, da insgesamt in Mercurial ein changeset der Name ist seine ‚Hashid‘, die die hashids seiner Eltern enthält. Verschiedene Eltern (G der neue Mutter wären C und nicht F) bedeutet eine andere Hashid, so G es ist nicht mehr -. Es ist die Arbeit von G, sondern eine neue changeset mit Namen

Umzug über G als etwas Neues, nennen sie es G‘(Gee prime), ist keine große Sache für einige Anwendungen, aber für andere ist es ein großer Fladen. Wenn bald Repo B get ist ein neues changeset, H, und Sie wollen es über seine Eltern bewegen wird von G bis G werden zu ändern‘, die unterschiedliche Hashes haben. Das bedeutet H wird über wie H bewegen.‘- 100 Changesets auf der ganzen Linie, und Sie werden verschiedene hashids für alles haben, alles, weil Sie nicht ausstehen konnte mit D, E, F in Repo-A

Die Dinge werden noch mehr aus dem Gleichgewicht geraten, wenn / wenn Sie Sachen von Repo A in Repo B (die entgegengesetzte Richtung Ihrer früheren Zug) verschieben möchten. Wenn Sie versuchen, ein einfaches ‚hg Push‘ von A zu tun nach B Sie G bekommen ‚(und H‘ und durch nachfolgende Nachkommen), die Duplikate der Changesets, die Sie bereits in Repo B haben.

Was dann sind Ihre Optionen?

  1. unbeachtlich. Ihre Daten sind immer noch da nur Sie mit den gleichen Changesets mit unterschiedlichen Namen und mehr Arbeit an zukünftigen Austausch zwischen den beiden repos enden. Es ist nicht falsch, es ist nur ein wenig unbeholfen vielleicht, und einige Leute kümmern sich nicht.
  2. Verschieben Sie alle D, E und F über Repo A. Sie können alle Changesets über bewegen, wenn sie harmlos sind und all die Probleme vermeiden. Wenn sie nicht so harmlos sind, können Sie sie über bewegen und dann ein ‚hg backout‘, um die Auswirkungen von D, E und F in einem neuen changeset H rückgängig gemacht werden.
  3. Give G besser Abstammungs beginnen mit Es bedeutet für mich, dies zu erwähnen, weil es zu spät ist, diesen Weg zu gehen (ohne Bearbeitungshistorie ). Was Sie sollte hat vor der Arbeit an changeset getan G hg update C war. Wenn G auf nicht verlassen oder erfordert Change D, E und F, dann sollte es nicht ihr Kind sein.

Wenn Sie stattdessen auf C aktualisieren zuerst wird eine Grafik wie folgt aussehen:

A - B - C - D - E - F
          \
            G

dann würde die ganze Antwort auf diese Frage nur hg push -r G ../repoA und G sauber rücken würde, seine gleiche Hashid zu halten, und D, E und F würde es nicht gehen.

UPDATE:

Wie in den Kommentaren darauf hingewiesen. Mit modernen Merkurialien ist der hg graft Befehl der perfekte Weg, dies zu tun.

Andere Tipps

verweis auf den Titel, die Kirsche im Allgemeinen Kommissionierung Adressen, gebe ich das Beispiel in einem Repo arbeiten, wie Internet-Suchmaschinen könnte die Menschen hier für Kirsche im allgemeinen Kommissionierung bringen. Arbeiten in einem Repository, wäre es mit hg graft :

hg update C
hg graft G

Das Ergebnis ist:

            G'
          / 
A - B - C - D - E - F - G

Zusätzliche Warnung: Die beiden Differenzmengen werden als unabhängige, parallel Commits auf den gleichen Dateien behandelt werden, und könnten Sie in Merge Konflikte laufen zu lassen, weshalb sollte Rosinenpickens für Filialmanagement im Allgemeinen vermieden werden. Zum Beispiel, wenn G ein Bug-Fix auf einen stabile Version Zweig vorgemerkt als 1.0.1 angelegt ist, sollten Sie eher fusionieren der freeze Zweig mit ihm, und von Zeit zu Zeit den master Zweig mit der Fehlerbehebung des freeze Zweig fusionieren .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top