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..B
forma " ", A
dovrebbe essere più vecchio diB
.
Se sono nell'ordine sbagliato, il comando fallirà silenziosamente .
Se si vuole scegliere la gamma B
attraverso 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 B
non sia un commit root; in caso unknown revision
contrario 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 --onto
sarebbe 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 working
ramo)
a " tmp
" (che indica dove integration
puntava 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 integration
ramo sul tmp
ramo)
Successivamente rebase --onto
, integration
tornerà 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-pick
accetta solo un singolo commit, ma se si vuole scegliere la gamma B
attraverso D
che sarebbe B^..D
in 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.