Cuando se trata de una variedad de compromisos, selección de cerezas es No fue práctico.
Como se menciona a continuación por Keith Kim , Git 1.7.2+ introdujo la capacidad de seleccionar una variedad de confirmaciones (pero aún debe ser consciente de las consecuencias de la selección de cerezas para una futura fusión )
git cherry-pick "aprendió a elegir un rango de confirmaciones
(por ejemplo," cherry-pick A..B
"y" cherry-pick --stdin
"), también lo hizo" git revert
"; sin embargo , estas no admiten el mejor control de secuencia" rebase [-i]
".
Damian comenta y nos advierte:
En la forma " cherry-pick A..B
", A
debe ser anterior aB
.
Si están en el orden incorrecto, el comando fallará en silencio .
Si desea elegir el rango a B
través D
(inclusive) , sería B^..D
.
Consulte " Git create branch from range of previous commits " como ilustración.
Como Jubobs menciona en los comentarios :
Esto supone que B
no es una confirmación de raíz; obtendrá un " unknown revision
" error de lo contrario.
Nota: a partir de Git 2.9.x / 2.10 (Q3 2016), puede elegir un rango de confirmación directamente en una rama huérfana (cabeza vacía): consulte " Cómo hacer que una rama existente sea huérfana en git ".
Respuesta original (enero de 2010)
A rebase --onto
sería mejor, donde reproduzca el rango de compromiso dado en la parte superior de su rama de integración, como Charles Bailey describió aquí .
(también, busque "Aquí es cómo trasplantaría una rama de tema basada en una rama a otra" en la página de manual de git rebase , para ver un ejemplo práctico de git rebase --onto
)
Si su rama actual es la integración:
# 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
Eso reproducirá todo entre:
- después del padre de
first_SHA-1_of_working_branch_range
(de ahí el ~1
): la primera confirmación que desea reproducir
- hasta "
integration
" (que apunta a la última confirmación que desea reproducir, desde la working
rama)
a " tmp
" (que señala hacia dónde integration
apuntaba antes)
Si hay algún conflicto cuando se reproduce uno de esos commits:
- resuélvelo y ejecuta "
git rebase --continue
".
- u omita este parche y, en su lugar, ejecute "
git rebase --skip
"
- o cancele todo con un "
git rebase --abort
" (y vuelva a colocar la integration
rama en la tmp
rama)
Después de eso rebase --onto
, integration
volverá a la última confirmación de la rama de integración (es decir " tmp
" rama + todas las confirmaciones reproducidas)
Con la selección de cerezas o rebase --onto
, no olvides que tiene consecuencias en las fusiones posteriores, como se describe aquí .
Aquícherry-pick
se discute una " " solución pura , e implicaría algo como:
Si desea utilizar un enfoque de parche, entonces "git format-patch | git am" y "git cherry" son sus opciones.
Actualmente, git cherry-pick
sólo acepta un único cometido, pero si usted quiere recoger el rango B
a través de D
eso sería B^..D
en la jerga de Git, por lo
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
Pero de todos modos, cuando necesite "reproducir" una serie de confirmaciones, la palabra "reproducir" debería empujarlo a usar la función " rebase
" de Git.