Pregunta: digamos que commit Ase bifurca mastery usted trabaja un poco en él, creando commits secundarios a Btravés de E. Say Esolo tiene 1 línea agregada desde D. Si git cherry-pick Een master, ¿se aplica todos los cambios del Amedio Een la masterrama, o lo hace sólo se aplica el cambio de Da E, es decir, que añade que la única línea de 1 a master? Si el caso es el primero, ¿cómo puedo lograr el segundo? (aparte de copiar y pegar manualmente)
chharvey
77
git cherry-pick -n <commitir> Si no desea que la selección de cereza se confirme automáticamente.
Ben Flynn
6
Si BranchA no se ha enviado a un control remoto, puede reordenar las confirmaciones utilizando rebasey luego simplemente merge. Es preferible utilizar mergemás rebasecuando sea posible, ya que no crea confirmaciones duplicadas.
git checkout BranchA
git rebase -i HEAD~113
... reorder the commits so the 10 you want are first ...
git checkout BranchB
git merge [the 10th commit]
La otra forma de mover el trabajo introducido de una rama a otra es seleccionarlo. Una selección de cereza en Git es como un rebase para un solo commit. Toma el parche que se introdujo en una confirmación e intenta volver a aplicarlo en la rama en la que se encuentra actualmente. Esto es útil si tiene una serie de confirmaciones en una rama de tema y desea integrar solo una de ellas, o si solo tiene una confirmación en una rama de tema y prefiere seleccionarla en lugar de ejecutar rebase. Por ejemplo, suponga que tiene un proyecto que se ve así:
Si desea extraer commit e43a6 en su rama maestra, puede ejecutar
$ git cherry-pick e43a6
Finished one cherry-pick.
[master]: created a0a41a9: "More friendly message when locking the index fails."
3 files changed, 17 insertions(+), 3 deletions(-)
Esto extrae el mismo cambio introducido en e43a6, pero obtiene un nuevo valor SHA-1 de confirmación, porque la fecha aplicada es diferente. Ahora tu historia se ve así:
Ahora puede eliminar la rama de su tema y soltar las confirmaciones que no quería obtener.
Respuestas:
El
git cherry-pick <commit>
comando le permite tomar un solo commit (de cualquier rama) y, esencialmente, volver a crearlo en su rama de trabajo.El capítulo 5 del libro Pro Git lo explica mejor que yo , completo con diagramas y demás. ( El capítulo sobre Rebasar también es una buena lectura).
Por último, hay algunos buenos comentarios sobre la selección de cereza vs fusión vs rebase en otra pregunta SO .
fuente
A
se bifurcamaster
y usted trabaja un poco en él, creando commits secundarios aB
través deE
. SayE
solo tiene 1 línea agregada desdeD
. Sigit cherry-pick E
enmaster
, ¿se aplica todos los cambios delA
medioE
en lamaster
rama, o lo hace sólo se aplica el cambio deD
aE
, es decir, que añade que la única línea de 1 amaster
? Si el caso es el primero, ¿cómo puedo lograr el segundo? (aparte de copiar y pegar manualmente)Si BranchA no se ha enviado a un control remoto, puede reordenar las confirmaciones utilizando
rebase
y luego simplementemerge
. Es preferible utilizarmerge
másrebase
cuando sea posible, ya que no crea confirmaciones duplicadas.fuente
FUENTE: https://git-scm.com/book/en/v2/Distributed-Git-Maintaining-a-Project#Integrating-Contributed-Work
La otra forma de mover el trabajo introducido de una rama a otra es seleccionarlo. Una selección de cereza en Git es como un rebase para un solo commit. Toma el parche que se introdujo en una confirmación e intenta volver a aplicarlo en la rama en la que se encuentra actualmente. Esto es útil si tiene una serie de confirmaciones en una rama de tema y desea integrar solo una de ellas, o si solo tiene una confirmación en una rama de tema y prefiere seleccionarla en lugar de ejecutar rebase. Por ejemplo, suponga que tiene un proyecto que se ve así:
Si desea extraer commit e43a6 en su rama maestra, puede ejecutar
Esto extrae el mismo cambio introducido en e43a6, pero obtiene un nuevo valor SHA-1 de confirmación, porque la fecha aplicada es diferente. Ahora tu historia se ve así:
Ahora puede eliminar la rama de su tema y soltar las confirmaciones que no quería obtener.
fuente