Cuando se trata de una serie de confirmaciones, cherry-picking esfue no es práctico.
Como mentioned below por Keith Kim, Git 1.7.2+ introdujo la posibilidad de cereza recoger una serie de confirmaciones (pero que todavía tienen que ser conscientes de la consequence of cherry-picking for future merge)
git cherry-pick" learned to pick a range of commits
(e.g. " cherry-pick A..B
" and " cherry-pick --stdin
"), so did " git revert
"; these do not support the nicer sequencing control " rebase [-i]
" has, though.
damiancomments y nos advierte:
In the " cherry-pick A..B
" form, A
should be older than B
.
If they're the wrong order the command will silently fail.
Si usted quiere recoger el rango B
través D
(inclusive) eso sería B^..D
.
Consulte "Git create branch from range of previous commits?" como una ilustración.
Como Jubobs menciones in the comments:
This assumes that B
is not a root commit; you'll get an " unknown revision
" error otherwise.
Nota: a partir de Git 2.9.x/2,10 (Q3 2016), se pueden seleccionar los diversos comprometerse directamente en una rama huérfano (cabeza vacía): ver "How to make existing branch an orphan in git".
Respuesta original (enero de 2010)
Un rebase --onto
sería mejor, en el que reproducir la gama dada de comprometerse en la parte superior de la rama de la integración, como Charles Bailey described here.
(también, busca "Así es como se le trasplantar una rama tema sobre la base de una rama a otra" en el git rebase man page, 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 se volverá a reproducir todo lo que entre:
- después de que el padre de
first_SHA-1_of_working_branch_range
(de ahí el ~1
): la primera se comprometen desea volver a reproducir
- hasta "
integration
" (que apunta a la última confirmación desea volver a reproducir, de la rama working
)
a "tmp
" (que apunta hacia donde integration
señalaba antes)
Si existe algún conflicto cuando una de esas confirmaciones se repite:
- o bien resolverlo y ejecutar "
git rebase --continue
".
- o saltarse este parche, y en lugar de correr "
git rebase --skip
"
- o cancelar el todas las cosas con un "
git rebase --abort
" (y volver a poner la rama integration
en la rama tmp
)
Después de eso rebase --onto
, integration
volverá a estar en la última confirmación de la rama de integración (es decir, "tmp
" rama + todas las confirmaciones reproducidas)
Con cherry-picking o rebase --onto
, no olvide que tiene consecuencias en la subsecuencia nt se fusiona, como described here.
Una solución pura "cherry-pick
" es discussed here, e implicaría algo así como:
If you want to use a patch approach then "git format-patch|git am" and "git cherry" are your options.
Currently, git cherry-pick
accepts only a single commit, but if you want to pick the range B
through D
that would be B^..D
in git lingo, so
git rev-list --reverse --topo-order B^..D | while read rev
do
git cherry-pick $rev || break
done
Pero de todos modos, cuando se necesita "repetición" una serie de confirmaciones, la palabra " la repetición "debería empujarte a utilizar la función" rebase
"de Git.
http://www.draconianoverlord.com/2013/09/07/no-cherry-picking.html (no es mi blog) –