3 minuto(s) de lectura

Git - Merge

  • Fusiona todos los datos/archivos que tengas en una rama o commit distinto con la que estemos trabajando actualmente y tenga el puntero [HEAD] señalando y además de esa fusión se genera un nuevo commit en el historial de commits

Detalle

  • Este comando se utiliza para fusionar los datos/archivos del último commit de una rama Padre como por ejemplo [rama Master ] con los datos/archivos del último commit de otra rama Padre llamada por ejemplo [rama Alternativa] generando a su vez un nuevo commit de fusión en una de las ramas Padre descritas anteriormente o en otra rama creada expresamente para unir ambos commits anteriores como por ejemplo podría ser la [rama Fusión] la cual fusionará los cambios que queremos realizar

Grafico merge

  • La integración es un proceso que puede producir conflictos que lo interrumpen y se se tiene que resolver utilizando un editor de código

Ejemplos

  • Integra la rama <branch> en el puntero [HEAD] e incluye un mensaje "msg" como descripción del commit de integración que hemos generado

    • Los cambios se registrarán en el {Staged/Index/Staging Area} del repositorio principal
  • La integración con conflictos debe completarse utilizando los siguientes comandos

1º Opción : Para confirmar la unión de los contenidos

git merge --continue

2º Opción : Para confirmar la unión de los contenidos

git commit 
  • Para deshacer la integración de los commits de la rama en la que nos encontremos con la rama que le hayamos indicado y vuelva el archivo a su estado anterior como si no hubiéramos ejecutado ningún comando
git merge --abort
  • Si no hay conflictos en la integración de los commits , se generará un commit de integración entre los 2 commits del tipo auto-merge
git merge -m "msg" <branch>

Integraciones Básicas

  • Las integraciones puede ser sencillas o complejas

  • Dependen de los contenidos de los ficheros/datos que queremos ingresar de un commit de una rama hacia otro commit en otra rama dependiendo de los ancestros comunes que tengan

    • Ficheros/Datos iguales en ambos commits → Incluye el fichero común ( sin conflicto )

    • Ficheros/Datos esta solo en uno de los commits → Incluye el fichero ( sin conflicto )

    • Ficheros/Datos con diferencias en contextos disjuntosFusiona ambos ficheros (sin conflictos)

    • Ficheros/Datos con diferencias en el mismo contexto → Une ambos ficheros y genera conflictos

Tipos de conflictos dentro de los ficheros

  • Ficheros sin conflictos
    • Se quedan en el estado {Staging Area/Index/Staged}
  • Ficheros con conflictos
    • Se quedan en el estado unmerged

      • Los conflictos quedan marcados en el código mediante el símbolos (+) en verde y debe resolverse con el editor

      • Los resultados de los conflictos deben registrare en el {Staging Area/Index/Staged} y se deben de cerrar cuando salgamos de la ejecución del comando merge

      • Merge debe cerrarse con el comando git merge --continue o git commit

Detalle gráfico de la corrección de la solución de conflictos

  • Todo lo que este entre ========== y >>>>>>>>>> master será lo nuevo añadido a la rama fusión
==========
Nuevo Código de la rama master
>>>>>>>>>> master
  • Se considera que se añadirá nuevo código a la rama anfitriona que realiza el git merge <branch> de la rama que le indiquemos
    • Para ejemplo sería desde la rama fusion ejecutamos el comando
git merge master

Ejemplo de código a la hora de corregir el conflicto con un editor de código.

<!DOCTYPE html><html><head>
<title>Calculator</title><meta charset="utf-8">
<script type="text/javascript">
# Parte conflictiva de la rama FUSIÓN
<<<<<<<<< HEAD 
function inverse(){
  var num = document.getElementById("n1");
  num.value = 1/num.value;
}
=========
# TODO ESTE CóDIGO SE AÑADE DE LA RAMA MASTER
function square(){
  var num = document.getElementById("n1");
  num.value = Math.pow(nun.value, 2);
}
>>>>>>>> master
</script>
</head>
<body>
  Number:
  <input type="text" id="n1"<p>
# Parte conflictiva de la rama FUSIÓN
<<<<<<<<< HEAD
  <button onclick="inverse()"> 1/x </button>
=========
# TODO ESTE CóDIGO SE AÑADE DE LA RAMA MASTER
  <button onclick="square()"><sup>2</sup></button>
>>>>>>>> master
</body>
</html>

Integración ff (fast-forward)

  • Cuando se ejecuta el comando git merge si GIT detecta que sobre la rama que estamos ejecutando este comando se ha realizado anteriormente otra integración ff (Fast-Foward)

    • Si es así avanzará el puntero [HEAD] de la rama hasta el commit que contiene la integración solicitada
  • Siguiendo el ejemplo anterior

    • Si hiciéramos de nuevo una integración de commits entre la rama master y la rama fusion , sobre el mismo contenido Git haría en este caso ff → (Fast-Foward)

Deja un comentario