¿Cómo fusiono un commit específico de una rama a otra en Git?

Respuestas:

233

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 .

ewall
fuente
1
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]
Seth Reno
fuente
2

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í:

ingrese la descripción de la imagen aquí

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í:

ingrese la descripción de la imagen aquí

Ahora puede eliminar la rama de su tema y soltar las confirmaciones que no quería obtener.

artamonovdev
fuente