Domanda

In Mercurial / TortoiseHg, dato il seguente esempio, qual è il modo più semplice per unire revisione "G" in pronti contro termine A senza prendere D, E ed F (Si supponga che G non ha dipendenze da D, E o F).

Repo A: A - B - C

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

è una patch la migliore scommessa?

È stato utile?

Soluzione

Tonfa è giusto. Quello che stai descrivendo non è 'la fusione' (o 'spingere' o 'tirare'); è 'cherry-picking'. Una spinta o una trazione sposta tutti i changeset da un repo all'altro che non sono già in tale repo. A 'fusione' prende due 'teste' e li fonde fino a un nuovo changeset che è la combinazione di entrambi.

Se si ha realmente bisogno di spostare G finita, ma non puoi rispettare avendo D, E, F lì si dovrebbe 'hg export' G da pronti contro termine A, e poi 'hg import' in pronti contro termine A. estensione trapianto è un wrapper per l'esportazione / importazione con alcune sottigliezze per evitare lo spostamento dello stesso insieme di modifiche su più volte.

Tuttavia , l'inconveniente di utilizzare l'importazione / esportazione, trapianto, e cherry-picking, in generale, è che non si può davvero spostare su G senza i suoi antenati, perché in Mercurial di un changeset nome è il suo 'Hashid' che comprende le hashids dei suoi genitori. Diversi genitori (nuovo genitore del G sarebbero C e non F) si intende una Hashid diversa, quindi non è più G -. È il lavoro di G, ma un nuovo changeset per nome

Il passaggio G come qualcosa di nuovo, chiamiamolo G'(Gee prime), non è un grosso problema per alcuni usi, ma per altri è un grande pita. Quando Repo presto B ottenere un nuovo changeset, H, e si desidera spostarlo sul suo genitore verrà modificata da G a G', che hanno diverse hash. Ciò significa che H si muoverà su come H' -. 100 di modifiche su tutta la linea e dovrete hashids differenti per tutto tutto perché non si poteva stare in piedi avendo D, E, F in pronti contro termine A

Le cose andranno ancora più fuori di colpo se / quando si desidera spostare roba da Repo A in Repo B (direzione opposta del precedente movimento). Se si tenta di fare un semplice 'hg push' da A a B si otterrà G '(e H' e dai discendenti successive) che sarà duplicati dei gruppi di modifiche che già avete nella Repo B.

Che poi, sono le opzioni?

  1. Non importa. I tuoi dati sono ancora lì si finisce con gli stessi gruppi di modifiche con nomi diversi e più lavoro sui futuri scambi tra i due pronti contro termine. Non è sbagliato, è solo un po 'goffo, forse, e alcune persone non si preoccupano.
  2. Spostare tutti D, E, F e verso Repo A. È possibile spostare tutti i gruppi di modifiche sopra se sono innocui e di evitare tutti i problemi. Se non sono così innocuo è possibile spostare più e poi fare un 'hg backout' per annullare gli effetti della D, E ed F in un nuovo changeset H.
  3. Dare G meglio discendenza per cominciare E 'significa per me questo perché è troppo tardi per seguire questa strada (senza modifica la storia ). Quello che dovrebbe hanno fatto prima di lavorare su changeset G è stato quello di hg update C. Se G non si basa su gruppi di modifiche o richiedere D, E, F e quindi non dovrebbe essere il loro bambino.

Se invece si aggiorna a C prima avrete un grafico come questo:

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

dunque, l'intera risposta a questa domanda sarebbe solo essere hg push -r G ../repoA e G si muoveva sopra in modo pulito, mantenendo la sua stessa Hashid, e D, E, F e non sarebbe andare con esso.

UPDATE:

Come sottolineato nei commenti. Con Mercurials moderni il comando hg graft è il modo perfetto per farlo.

Altri suggerimenti

Riferendosi al titolo, che affronta cherry picking, in generale, io do l'esempio di lavorare in un pronti contro termine, come i motori di ricerca Internet potrebbe portare la gente qui per cherry picking in generale. Lavorare in un repository, si sarebbe fatto con hg graft :

hg update C
hg graft G

Il risultato è:

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

avvertimento supplementare: I due gruppi di modifiche saranno trattati come, commit paralleli indipendenti sugli stessi file e potrebbe farvi incorrere in conflitti di unione, che è il motivo per cui cherry picking deve essere evitato in generale per la gestione ramo. Ad esempio, se G è un bug fix applicato ad un ramo versione stabile segnalibro come 1.0.1, si dovrebbe piuttosto Unisci il ramo freeze con esso, e di tanto in tanto fondere il ramo master con correzioni della succursale freeze .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top