Pregunta Cómo fusionar una confirmación específica en Git


He bifurcado una sucursal de un repositorio en GitHub y he dedicado algo específico para mí. Ahora descubrí que el repositorio original tenía una buena característica que estaba en HEAD.

Quiero fusionarlo solo sin compromisos previos. ¿Qué debería hacer? He sabido cómo fusionar todos los commits:

git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git push

795
2018-05-19 05:27


origen


Respuestas:


'git cherry-pick'debería ser tu respuesta aquí.

Aplicar el cambio introducido por una confirmación existente.

No te olvides de leer bdonlanLa respuesta de este acerca de la consecuencia de la selección en este post:
"Extrae todas las confirmaciones de una rama, envía las confirmaciones especificadas a otra", dónde:

A-----B------C
 \
  \
   D

se convierte en:

A-----B------C
 \
  \
   D-----C'

El problema con este compromiso es que git considera commits para incluir toda la historia antes que ellos

Donde C 'tiene una diferente SHA-1 CARNÉ DE IDENTIDAD.
  Del mismo modo, seleccionar un compromiso de una rama a otra consiste básicamente en generar un parche y luego aplicarlo, perdiendo así también la historia.

Este cambio de identificadores de commit rompe la funcionalidad de fusión de git entre otras cosas (aunque si se usa con moderación, hay heurística que tomará en cuenta esto).
  Más importante aún, ignora las dependencias funcionales: si C realmente usó una función definida en B, nunca sabrá.


958
2018-05-19 05:35



Puede usar git cherry-pick para aplicar una sola confirmación por sí mismo a su rama actual.

Ejemplo: git cherry-pick d42c389f


528
2018-05-19 05:35



Tratemos de tomar un ejemplo y entender:

Tengo una rama, digo dominar, señalando X <commit-id>, y tengo una nueva rama apuntando a Y <sha1>.

Dónde Y <commit-id> = <master> branch commits - few commits

Ahora diga para la rama Y que tengo que cerrar las compuertas entre la rama principal y la nueva rama. A continuación está el procedimiento que podemos seguir:

Paso 1:

git checkout -b local origin/new

donde local es el nombre de la sucursal. Cualquier nombre puede ser dado.

Paso 2:

  git merge origin/master --no-ff --stat -v --log=300

Combine las confirmaciones de la rama maestra con la nueva rama y también cree una combinación de compromiso de mensaje de registro con descripciones de una línea de la mayoría de las <n> confirmaciones reales que se fusionan.

Para obtener más información y parámetros sobre la fusión de Git, consulte:

git merge --help

Además, si necesita fusionar una confirmación específica, puede usar:

git cherry-pick <commit-id>

13
2018-05-27 05:29