Come faccio a cherry-pick una singola revisione in Mercurial?
-
13-09-2019 - |
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?
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?
- 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.
- 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.
- 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
.