Risposte:
Raccogliere ciliegia in Git significa scegliere un commit da un ramo e applicarlo a un altro.
Ciò è in contrasto con altri modi come merge
e rebase
che normalmente applicano molti commit su un altro ramo.
Assicurati di essere nel ramo a cui desideri applicare il commit.
git checkout master
Eseguire quanto segue:
git cherry-pick <commit-hash>
NB:
Se scegli una ciliegia da una filiale pubblica, dovresti prendere in considerazione l'utilizzo
git cherry-pick -x <commit-hash>
Ciò genererà un messaggio di commit standardizzato. In questo modo, tu (e i tuoi colleghi) potete ancora tenere traccia dell'origine del commit ed evitare conflitti di unione in futuro.
Se hai delle note allegate al commit, queste non seguono la scelta della ciliegia. Per portarli anche tu, devi usare:
git notes copy <from> <to>
Link aggiuntivi:
git cherry-pick -x <commit-hash>
. Ciò genererà un messaggio di commit standardizzato. In questo modo, tu (e i tuoi colleghi) potete ancora tenere traccia dell'origine del commit ed evitare conflitti di unione in futuro.
git notes copy <from> <to>
per portarli oltre.
"cherry-pick commit applies the changes introduced by the named commit on the current branch"
Most ppl tende a pensare al commit come a cambiamenti (come svn was iirc), ma non lo è, ogni commit fa riferimento all'albero di lavoro completo. Anche se questo non fa differenza in questo caso, può aiutare a capire perché git funziona così.
Questa citazione è presa da; Controllo versione con Git (Davvero un ottimo libro, ti incoraggio a acquistarlo se sei interessato a Git )
Modifica: poiché questa risposta sta ancora ottenendo impressione, vorrei aggiungere un tutorial video molto bello in azione su di esso:
Youtube: Introduzione a Git cherry-pick
Uso di git cherry-pick Il comando git cherry-pick commit applica le modifiche introdotte dal commit denominato sul ramo corrente. Introdurrà un nuovo, distinto commit.A rigor di termini, l'uso di git cherry-pick non altera la storia esistente all'interno di un repository; invece, si aggiunge alla storia. Come per le altre operazioni Git che introducono modifiche attraverso il processo di applicazione di un diff, potrebbe essere necessario risolvere i conflitti per applicare completamente le modifiche da un determinato commit . Il comando git cherry-pick è in genere usato per introdurre particolari commit da un ramo all'interno di un repository su un ramo diverso. Un uso comune è il forwarding o back-port di commit da un ramo di manutenzione a un ramo di sviluppo.
$ git checkout rel_2.3
$ git cherry-pick dev~2 # commit F, above
prima:
dopo:
La raccolta delle ciliegie in Git è progettata per applicare un commit da un ramo a un altro ramo. Si può fare se es. ha commesso un errore e ha commesso una modifica nel ramo sbagliato, ma non desidera unire l'intero ramo. Puoi semplicemente es. ripristina il commit e selezionalo su un altro ramo.
Per usarlo, hai solo bisogno git cherry-pick hash
, dov'è hash
un hash di commit da un altro ramo.
Per la procedura completa, consultare: http://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.html
Breve esempio di situazione, quando hai bisogno di una ciliegia
Prendi in considerazione il seguente scenario. Hai due rami.
a) release1 - Questa filiale andrà al tuo cliente, ma ci sono ancora alcuni bug da correggere.
b) master - ramo master classico, dove ad esempio è possibile aggiungere funzionalità per release2.
SOCIETÀ : È aggiustare qualcosa in RELEASE1 . Naturalmente hai bisogno di questa correzione anche in master . E questo è un tipico caso d'uso per la raccolta delle ciliegie. Quindi in questo scenario la scelta della ciliegia significa che prendi un commit dal ramo release1 e lo includi nel ramo master .
cherry-pick è una funzionalità Git. Se qualcuno desidera eseguire il commit di commit specifici in un ramo in un ramo di destinazione, viene utilizzato cherry-pick.
i passaggi git cherry-pick sono i seguenti.
git cherry-pick <commit id>
Qui commit id è l'id di attività di un altro ramo.
git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
Ho preparato illustrazioni dettagliate su ciò che Cherry-Pick fa - e un'animazione di queste illustrazioni (verso la fine).
L
dal ramo feature
):
git cherry-pick feature~2
feature~2
è il 2 ° commit precedente feature
, ovvero il commit L
):
Nota:
Il commit L'
è dal punto di vista dell'utente (commit = snapshot) la copia esatta del commit L
.
Tecnicamente (internamente), è un nuovo, diverso commit (perché ad esempio L
contiene un puntatore a K
(come suo genitore), mentre L'
contiene un puntatore a E
).
Puoi pensare se una scelta di ciliegia è simile a una rebase, o meglio è gestita come una rebase. Con questo intendo che richiede un commit esistente e lo rigenera assumendo, come punto di partenza, il capo del ramo in cui ci si trova attualmente.
A rebase
accetta un commit che aveva un genitore X e rigenera il commit come se avesse effettivamente un genitore Y, e questo è esattamente ciò che uncherry-pick
fa .
Cherry Pick è più su come selezionare gli commit. Con pull
(rebase), git rigenera implicitamente i tuoi commit locali oltre a ciò che è stato attirato nel tuo ramo, ma concherry-pick
te scegli esplicitamente alcuni commit e rigenerali implicitamente (loro) sopra il tuo ramo corrente.
Quindi il modo in cui lo fai differisce, ma sotto il cofano sono operazioni molto simili: la rigenerazione degli impegni.
cherry-pick
si comporta come quando il ramo di destinazione viene successivamente ricongiunto nel ramo di origine. Grazie Signore.
È un po 'come Copia (da qualche parte) e Incolla (da qualche parte), ma per commit specifici.
Se si desidera eseguire una correzione rapida, ad esempio, è possibile utilizzare cherry-pick
funzione.
Fai il tuo cherry-pick
in un ramo di sviluppo e merge
che si impegnano in un ramo di rilascio. Allo stesso modo, esegui un passaggio cherry-pick
dal ramo di rilascio al master. Ecco
Quando lavori con un team di sviluppatori su un progetto, gestire le modifiche tra un numero di rami git può diventare un'attività complessa. A volte non vuoi unire un intero ramo in un altro e devi solo selezionare uno o due commit specifici. Questo processo è chiamato "cherry picking".
Ho trovato un ottimo articolo sulla raccolta delle ciliegie, guardalo per dettagli dettagliati: https://www.previousnext.com.au/blog/intro-cherry-picking-git
Se si desidera unire senza commit ID è possibile utilizzare questo comando
git cherry-pick master~2 master~0
Il comando precedente unirà gli ultimi tre commit del master da 1 a 3
Se si desidera eseguire questa operazione per un singolo commit, rimuovere l'ultima opzione
git cherry-pick master~2
In questo modo unirai il 3o commit dalla fine del master.
Applicherà un commit particolare alla tua filiale corrente.
Questo significa :
Es: considerare il commit A
added newFileA
modified main:
+ import './newFileA'
commettere B
added newFileB
modified main:
+ import './newFileB'
Se scegli il commit B su un altro ramo, finirai con:
/newFileB
/main :
import './newFileA'
import './newFileB'
poiché commit B contiene newFileB e main , ma non newFileA , con conseguente errore, quindi utilizzare con cautela.
Estratto dai documenti ufficiali:
Dati uno o più commit esistenti, applica la modifica che ognuno introduce, registrando un nuovo commit per ciascuno. Ciò richiede che l'albero di lavoro sia pulito (nessuna modifica dal commit HEAD).
Quando non è ovvio come applicare una modifica, si verifica quanto segue:
Il ramo corrente e il puntatore HEAD rimangono all'ultimo commit eseguito correttamente.
Il riferimento CHERRY_PICK_HEAD è impostato per indicare il commit che ha introdotto la modifica che è difficile da applicare.
I percorsi in cui la modifica applicata in modo pulito vengono aggiornati sia nel file indice che nell'albero di lavoro.
Per percorsi in conflitto, il file indice registra fino a tre versioni, come descritto nella sezione "VERO MERGE" di git-merge. I file dell'albero di lavoro includeranno una descrizione del conflitto racchiusa tra i soliti marker di conflitto <<<<<<< e >>>>>>>.
Non vengono apportate altre modifiche.