Bifurqué una rama de un repositorio en GitHub y cometí 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é tengo que hacer? Sé 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
Respuestas:
'
git cherry-pick
' debería ser tu respuesta aquí.No olvide leer la respuesta de bdonlan sobre la consecuencia de la selección de cerezas en esta publicación:
"Extraiga todas las confirmaciones de una rama, empuje las confirmaciones especificadas a otra" , donde:
se convierte en:
fuente
Puede usar git cherry-pick para aplicar una sola confirmación por sí mismo a su rama actual.
Ejemplo:
git cherry-pick d42c389f
fuente
git cherry-pick d42c
ogit cherry-pick d42c3
funcionará. Git es inteligente. ;)d42c389f
. Tal vez el OP no se preocupó por crear una fusión per se, pero la diferencia sí importa a veces.Intentemos tomar un ejemplo y entender:
Tengo una rama, digamos master , apuntando a X <commit-id>, y tengo una nueva rama apuntando a Y <sha1>.
Donde Y <commit-id> = <master> confirmaciones de rama - pocas confirmaciones
Ahora, para la rama Y, tengo que cerrar los commits entre la rama maestra y la nueva rama. A continuación se muestra el procedimiento que podemos seguir:
Paso 1:
donde local es el nombre de la sucursal. Cualquier nombre puede ser dado.
Paso 2:
Combine las confirmaciones de la rama maestra a la nueva rama y también cree una confirmación de fusión del mensaje de registro con descripciones de una línea de, como máximo, <n> confirmaciones reales que se fusionan.
Para obtener más información y parámetros sobre la fusión de Git, consulte:
Además, si necesita fusionar una confirmación específica, puede usar:
fuente
Y
en tu oración 3d? "Tengo una nueva rama apuntando a Y" vs "Ahora digamos para la rama Y", parece que Y solía ser una confirmación y luego se convirtió en una ramaEn mi caso de uso, teníamos una necesidad similar de CI CD. Utilizamos git flow con desarrollo y ramas maestras. Los desarrolladores son libres de fusionar los cambios directamente para desarrollar o mediante una solicitud de extracción de una rama de características. Sin embargo, para dominar, fusionamos solo los commits estables de la rama de desarrollo de forma automatizada a través de Jenkins.
En este caso, hacer una selección de cerezas no es una buena opción. Sin embargo, creamos una rama local a partir del commit-id y luego fusionamos esa rama local para dominar y realizar mvn clean verify (utilizamos maven). Si tiene éxito, libere el artefacto de la versión de producción a nexus utilizando el complemento de lanzamiento de Maven con localCheckout = true option y pushChanges = false. Finalmente, cuando todo sea exitoso, empuje los cambios y etiquételos al origen.
Un fragmento de código de muestra:
Suponiendo que está en el maestro si se hace manualmente. Sin embargo, en Jenkins, cuando finalice la compra del repositorio, estará en la rama predeterminada (maestro si está configurado).
Esto te dará un control total con una fusión sin miedo o un infierno de conflicto.
No dude en asesorar en caso de que haya una mejor opción.
fuente
Las respuestas principales describen cómo aplicar los cambios de una confirmación específica a la rama actual. Si eso es lo que quieres decir con "cómo fusionar", simplemente usa cherry-pick como sugieren.
Pero si realmente desea una fusión , es decir, desea una nueva confirmación con dos padres (la confirmación existente en la rama actual y la confirmación a la que desea aplicar los cambios), entonces una selección de cereza no logrará eso.
Puede ser deseable tener un verdadero historial de fusión, por ejemplo, si su proceso de compilación aprovecha la ascendencia git para establecer automáticamente cadenas de versión basadas en la última etiqueta (usando
git describe
).En lugar de seleccionar Cherry, puede hacer un real
git merge --no-commit
y luego ajustar manualmente el índice para eliminar cualquier cambio que no desee.Supongamos que está en la rama
A
y desea fusionar el commit en la punta de la ramaB
:Ahora está configurado para crear un compromiso con dos padres, el consejo actual se compromete con
A
yB
. Sin embargo, es posible que se apliquen más cambios de los que desea, incluidos los cambios de confirmaciones anteriores en la rama B. Debe deshacer estos cambios no deseados y luego confirmar.(Puede haber una manera fácil de configurar el estado del directorio de trabajo y el índice de nuevo a la forma en que estaba antes de la fusión, para que tenga una pizarra limpia sobre la cual elegir el compromiso que quería en primer lugar. Pero No sé cómo lograr esa pizarra limpia,
git checkout HEAD
ygit reset HEAD
ambos eliminarán el estado de fusión, lo que anulará el propósito de este método).Así que deshaga manualmente los cambios no deseados. Por ejemplo, podrías
por cada commit no deseado
012ea56
.Cuando termine de ajustar las cosas, cree su compromiso:
Ahora solo tiene el cambio que desea, y el árbol de ascendencia muestra que técnicamente se fusionó con B.
fuente