Quando si tratta di una serie di impegni, la raccolta delle ciliegie è non era pratico.
Come menzionato di seguito da Keith Kim , Git 1.7.2+ ha introdotto la possibilità di selezionare una serie di commit (ma è comunque necessario essere consapevoli delle conseguenze della raccolta delle ciliegie per future fusioni )
git cherry-pick "ha imparato a scegliere una serie di commit
(ad es." cherry-pick A..B"e" cherry-pick --stdin"), così ha fatto" git revert", ma questi non supportano il controllo di sequenziamento più bello che ha" rebase [-i]".
Damian commenta e ci avverte:
Nella cherry-pick A..Bforma " ", Adovrebbe essere più vecchio diB .
Se sono nell'ordine sbagliato, il comando fallirà silenziosamente .
Se si vuole scegliere la gamma Battraverso D(compreso) che sarebbe B^..D.
Vedi " Git creare un ramo dall'intervallo di precedenti commit? " Come illustrazione.
Come menziona Jubobs nei commenti :
Questo presuppone che Bnon sia un commit root; in caso unknown revisioncontrario verrà visualizzato un " " errore.
Nota: a partire da Git 2.9.x / 2.10 (3 ° trimestre 2016), è possibile selezionare una gamma di commit direttamente su un ramo orfano (testa vuota): vedere " Come rendere un ramo esistente un orfano in git ".
Risposta originale (gennaio 2010)
A rebase --ontosarebbe meglio, dove si riproduce l'intervallo dato di commit in cima al ramo di integrazione, come Charles Bailey ha descritto qui .
(cerca anche "Ecco come trapiantare un ramo di argomento basato su un ramo all'altro" nella pagina man di git rebase , per vedere un esempio pratico di git rebase --onto)
Se la tua filiale attuale è l'integrazione:
# Checkout a new temporary branch at the current location
git checkout -b tmp
# Move the integration branch to the head of the new patchset
git branch -f integration last_SHA-1_of_working_branch_range
# Rebase the patchset onto tmp, the old location of integration
git rebase --onto tmp first_SHA-1_of_working_branch_range~1 integration
Ciò riprodurrà tutto tra:
- dopo il genitore di
first_SHA-1_of_working_branch_range(quindi il ~1): il primo commit che si desidera riprodurre
- fino a "
integration" (che indica l'ultimo commit che si desidera riprodurre, dal workingramo)
a " tmp" (che indica dove integrationpuntava prima)
In caso di conflitto durante la riproduzione di uno di questi commit:
- o risolverlo ed eseguire "
git rebase --continue".
- o salta questa patch ed esegui invece "
git rebase --skip"
- o annulla il tutto con un "
git rebase --abort" (e rimetti il integrationramo sul tmpramo)
Successivamente rebase --onto, integrationtornerà all'ultimo commit del ramo di integrazione (ovvero " tmp" ramo + tutti i commit riprodotti)
Con la raccolta delle ciliegie o rebase --onto, non dimenticare che ha conseguenze sulle fusioni successive, come descritto qui .
Una " cherry-pick" soluzione pura è discussa qui e implicherebbe qualcosa di simile:
Se vuoi usare un approccio patch allora "git format-patch | git am" e "git cherry" sono le tue opzioni.
Attualmente, git cherry-pickaccetta solo un singolo commit, ma se si vuole scegliere la gamma Battraverso Dche sarebbe B^..Din git gergo, in modo
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
Ma comunque, quando devi "ripetere" una serie di commit, la parola "replay" dovrebbe spingerti ad usare la " rebase" caratteristica di Git.