Manos maestras/Shutterstock.com
Para fusionar una rama de desarrollo en la rama actual, use "git merge dev-branch-name". Si recibe advertencias de conflicto sobre una fusión, use "git merge –abort" para retroceder o edite los archivos afectados y luego confírmelos. Git usa ramas para aislar flujos de desarrollo, para evitar que la rama de lanzamiento estable se contamine. Llevar el trabajo de una sucursal al flujo principal significa fusionar sucursales. Así es cómo.
¿Qué es una fusión en Git?
Git fue diseñado para hacer que la bifurcación sea rápida y fácil. A diferencia de otros sistemas de control de versiones, ramificarse en Git es un asunto trivial. En proyectos de múltiples desarrolladores en particular, la ramificación es una de las principales herramientas organizativas de Git. Conecte nuevos esfuerzos de desarrollo en espacio aislado para que el código se pueda cambiar o agregar sin afectar el código en otras ramas, especialmente la rama principal o principal. Esto generalmente contiene la versión estable de su base de código. Aislar estos cambios de su lanzamiento de código estable tiene mucho sentido. Pero tarde o temprano, se probará, revisará y aprobará el nuevo código para su integración en la rama principal. En este punto, debe fusionar su rama con la rama maestra. De hecho, las sucursales pueden tener sucursales secundarias, por lo que puede fusionar su sucursal en otra sucursal en lugar de la sucursal principal. Recuerde que las fusiones siempre toman una rama y la fusionan en una rama de destino, independientemente de esa rama. Si desea fusionar su rama principal en otra rama, incluso puede hacerlo también. Como la mayoría de las acciones en Git, realiza fusiones en su repositorio local y las envía a su repositorio remoto. Tenemos un pequeño proyecto de desarrollo con un repositorio Git local y un repositorio Git remoto. Creamos una rama llamada "bugfix14" de la rama "maestra" y trabajamos en una corrección de errores. Este trabajo está hecho y hemos probado nuestro código. Todo funciona como se esperaba. Queremos aplicar estos cambios a la rama maestra para que nuestra solución sea parte de la próxima versión del software. Hay un poco de preparación que hacer antes de realizar la fusión. Necesitamos asegurarnos de que la rama de destino, en este caso, la rama "maestra", y la rama con la que vamos a fusionarnos estén actualizadas. Para ello, utilizaremos el git status
ordenado.
git status
- En la rama bugfix14: Esta es nuestra sucursal actual.
- Su rama está actualizada con 'origen/corrección de errores': Nuestra rama del repositorio local tiene el mismo historial de confirmaciones que la rama del repositorio remoto. Esto significa que son idénticos.
- nada que cometer No hay cambios en el área de preparación que no se hayan comprometido.
- árbol de trabajo limpio: No hay cambios no preparados en el directorio de trabajo.
Todo esto indica que la sucursal está actualizada y estamos listos para comenzar. Si alguno de ellos indicaba que existían cambios, teníamos que organizarlos, validarlos y enviarlos al control remoto. Si alguien más ha trabajado en estos archivos, es posible que debamos extraer sus cambios del repositorio remoto. Verificar la rama en la que nos vamos a fusionar simplifica el proceso de fusión. También nos permite comprobar que está actualizado. Veamos la rama maestra.
git checkout master
git status
Obtenemos las mismas confirmaciones de que la rama "maestra" está actualizada. Antes de fusionarse, nuestras confirmaciones se ven así.
La rama "bugfix14" se derivó de la rama "maestra". Hubo una confirmación en la rama "maestra" después de la creación de la rama "bugfix14". Ha habido algunas confirmaciones en la rama "bugfix14". Nos aseguramos de que nuestras dos sucursales estén actualizadas y verificamos la sucursal "maestra". Podemos emitir el comando para fusionar la rama "bugfix14" en la rama "maestra".
git merge bugfix14
Se produce la fusión. La rama "bugfix14" todavía existe, pero ahora los cambios realizados en esta rama se han fusionado con la rama "maestra".
En este caso, el comando de fusión realiza una fusión de tres vías. Solo hay dos ramas, pero hay tres compromisos involucrados. Son el encabezado de cualquiera de las ramas y una tercera confirmación que representa la acción de fusión en sí. Para actualizar nuestro repositorio remoto, podemos usar el comando git push.
git push
Algunas personas prefieren eliminar las ramas laterales una vez que las han fusionado. Otros se encargan de mantenerlos como un registro de la verdadera historia de desarrollo del proyecto. Si desea eliminar la sucursal, puede hacerlo mediante el git branch
ordenar con el -d
(borrar).
git branch -d bugfix14
A elimine la rama en el repositorio remoto use este comando:
git push origin --delete bugfix14
Tendrá un historial de confirmación lineal, pero no será el verdadero historial.
Realizar una combinación acelerada en Git
Si no ha realizado ninguna confirmación en la rama "maestra", su historial se verá así. También se verá así si tiene modificó la base de su rama de desarrollo para que se adjunte al final de la rama "maestra".
Dado que no hay confirmaciones en la rama "maestra", para fusionar la rama "bugfix15", todo lo que Git tiene que hacer es apuntar el puntero principal "maestro" a la última confirmación de la rama "bugfix15". . Podemos usar lo habitual git merge
ordenado:
git merge bugfix15
Esto nos da este resultado.
Que es lo mismo que esto:
Que es lo mismo que esto:
Git hará una fusión rápida siempre que pueda. Si las confirmaciones en la rama "maestra" significan que no es posible una fusión rápida, Git utilizará una fusión de tres vías. No puede forzar una combinación de avance rápido (después de todo, puede que no sea posible), pero puede declarar que se trata de una combinación de avance rápido o nada. Hay una opción que le dice a Git que use una combinación rápida si puede, pero que no haga una combinación de tres vías si no puede. la opción es --ff-only
(solo fusión rápida). Esto fusiona la rama "bugfix15" con la rama "maestra", pero solo si es posible una fusión rápida.
git merge --ff-only bugfix15
Git se quejará y saldrá si esto no es posible.
git merge --ff-only bugfix16
En este caso, hubo confirmaciones en la rama "maestra", por lo que no es posible una fusión rápida. Si se han modificado las mismas partes del mismo archivo en ambas ramas, las ramas no se pueden fusionar. Se requiere interacción humana para resolver ediciones en conflicto. Aquí hemos realizado cambios en un archivo llamado "rot.c" en una rama llamada "bugfix17" que queremos fusionar con la rama "maestra". Pero "rot.c" también se ha modificado en la rama "maestra".
git merge bugfix17
Cuando intentamos fusionarlo, recibimos una advertencia de que hay conflictos. Git enumera los archivos en conflicto y nos dice que la fusión falló. Podríamos ir todo el camino de regreso usando el --abort
opción:
git merge --abort
Pero resolver fusiones no es tan aterrador como parece. Git ha hecho algo de trabajo para ayudarnos. Si modificamos alguno de los archivos en conflicto (en nuestro caso, solo tenemos uno), encontraremos resaltadas las secciones de código en conflicto.
Cada conflicto está delimitado por siete caracteres menos de " <<<<<<<
y siete caracteres mayores que " >>>>>>>
", con siete signos iguales" =======
" entre ellos.
- El código sobre los signos de igual proviene de la rama en la que se está fusionando.
- El código debajo del signo igual es el código de la rama que intenta fusionar.
Puede buscar fácilmente cualquiera de los siete conjuntos de caracteres y saltar entre conflictos en su archivo. Para cada conflicto, debe elegir qué conjunto de cambios desea conservar. Debe editar el código que rechaza y las líneas de siete caracteres que agregó Git. Mantendremos el código de la rama "bugfix17". Después de editar, nuestro archivo se ve así.
Ahora podemos proceder con la fusión. Pero cuidado, usamos el commit
para hacerlo, no el merge
ordenado. Confirmamos el cambio preparando el archivo y confirmándolo como de costumbre. Comprobaremos el estado antes de realizar la confirmación final.
git add rot.c
git status
git commit -m "Merged bugfix17"
La fusión está completa. Ahora podemos enviar esto a nuestro repositorio remoto. Todas las ramas deben fusionarse, eventualmente, para que sus cambios no queden huérfanos y olvidados. Fusionar sucursales es fácil, pero gestionar conflictos puede ser complicado en equipos grandes y ocupados. La resolución de conflictos puede requerir el aporte de cada desarrollador solo para explicar qué hace su código y por qué hicieron los cambios. Debe comprender esto antes de poder tomar una decisión informada sobre qué cambios conservar. Desafortunadamente, Git no puede ayudar con eso.
Si deseas encontrar artículos similares a Cómo usar Git Merge, te sugerimos revisar la categoría Tutoriales.
Deja una respuesta