Entender mejor el contenido de los commit durante un conflicto de merge en Git


Lección 44 / 53

Entender mejor el contenido de los commit durante un conflicto de merge en Git

Git Guía Git Guía Git español

Al resolver un conflicto de fusión en Git es particularmente importante comprender qué sucedió en las dos versiones diferentes y si los dos contenidos diferentes pueden reconciliarse y cómo.

De hecho, las dos versiones pueden contener código que se comporte de manera muy diferente y es importante comprender lo que se está aprobando antes de continuar.

Una primera sugerencia es configurar su Git para usar el estilo "diff3" para conflictos de merge.

Si volvemos al ejemplo anterior, ejecutando git config merge.conflictstyle diff3 antes de ejecutar git merge, los marcadores agregados por Git para resaltar el contenido en conflicto cambian:

$ git config merge.conflictstyle diff3
$ git merge new_branch_to_merge_later
$ cat merge.txt
<<<<<<< HEAD
initial content to edit later
content added to previous
||||||| 0a99708
initial content to edit later
=======
new content to merge later
>>>>>>> merge-me

Respecto a la versión precedente tenemos:

  • entre ||||||| y ======= el contenido en el commit principal común a los dos commit en conflicto
  • entre <<<<<<< y ||||||| la versión en el branch “current”
  • entre ======= y >>>>>>> la versión en el branch “incoming”

Aún con el fin de comprender lo que se está haciendo, también podría ser útil verificar los mensajes de commit de las ramas respectivas a través de git log --merge, tal vez usando la opción -p que también muestra las diferencias de los dos commit.

$ git log --merge -p merge.txt
commit 90640eb2ecab9ec63fcad24817a314df344e024c (HEAD -> main)
Author: Frank <frank@example.com>
Date:   Sat Jan 14 23:33:22 2023 +0100

    appended content to merge.txt

diff --git a/merge.txt b/merge.txt
index 3480007..c560b6f 100644
--- a/merge.txt
+++ b/merge.txt
@@ -1 +1,2 @@
initial content to edit later
+content added to previous

commit 15416df402028b78858105c84d49a86fee59e2e3 (merge-me)
Author: Me <me@example.com>
Date:   Sat Jan 14 23:31:09 2023 +0100

    edited the content for conflict

diff --git a/merge.txt b/merge.txt
index 3480007..202af08 100644
--- a/merge.txt
+++ b/merge.txt
@@ -1 +1 @@
-initial content to edit later
+new content to merge later

Además, no debe olvidarse que muchos IDE, editores de texto para desarrolladores web y aplicaciones GUI para Git ofrecen métodos visuales más atractivos para comprender las diferencias exactas entre dos commit en conflicto.

Modificare file in conflitto con VSCode

Modificar archivo en conflicto con VSCode

Abriendo un archivo que está en conflicto, el editor VSCode reconoce y destaca los marker de conflicto y ofrece varias opciones para resolver el conflicto. 

Modificare file in conflitto con VSCode

Modificar archivo en conflicto con VSCode
 

También está disponible una vista especial que le permite ver tanto las dos versiones "originales" como la versión que se está reescribiendo.

NOTA: Curiosamente, aunque Git usa el nuestro y el de ellos, algunas interfaces de usuario de Git han optado por usar “current” e “incoming” respectivamente, que hemos tomado prestados para esta guía. No olvides que la acción de fusionar dos ramas tiene una "dirección". Desde este punto de vista, la nomenclatura current/incoming es más explícita en el caso de que, por ejemplo, se fusione una rama con main en la que hay "nuestros" commit y el conflicto es con los commit realizados por otros desarrolladores: en este caso, de hecho, para Git, los commit de otros que ya están en main y los nuestros serían nuestros commit en la rama.

Una vez resuelto el conflicto, el resultado será una nueva versión del archivo y, en concreto, una nueva versión de ese grupo de líneas y, al final de la fusión, habrá que comprobar que el código sigue siendo correcto y laboral.

Por lo tanto, siempre es importante entender lo que uno está aceptando al resolver un conflicto de fusión, pero sobre todo también es importante saber cuándo es apropiado interrumpir la fusión y volver sobre los pasos de uno, tal vez consultando al colega o colegas para entender juntos qué versión de los cambios será finalmente la que se incluirá en el repositorio.

Guía Git en español 1 ¿Qué es Git? 2 Nacimiento de Git 3 Principales características de Git 4 Línea de comando UI en Git 5 Cómo instalar Git 6 5 comandos Git para desarrolladores individuales 7 5 comandos Git para desarrollar en colaboración 8 Repository en Git 9 Commit en Git 10 Working Copy en Git 11 Staging Area en Git 12 Branch en Git 13 Remote en Git 14 Inicializar un nuevo repository con git init 15 Crear una copia de un repository remoto en Git con git clone 16 Configurar las opciones de Git con git config 17 El comando Git add en Git 18 El comando Git commit en Git 19 El comando Git diff en Git 20 El comando Git stash en Git 21 .gitignore : los archivos ignored en Git 22 El comando Git status en Git 23 El comando Git log en Git 24 El comando Git tag en Git 25 El comando Git blame en Git 26 El comando Git checkout en Git 27 El comando Git revert en Git 28 El comando Git reset en Git 29 El comando Git rm en Git 30 La opción Git commit –amend en Git 31 Git rebase –interactive en Git 32 Atajos para comandos frecuentes en Git 33 Repository compartido en Git 34 El modelo Fork & pull 35 El comando Git remote en Git 36 Los principales repository remote de Git: Github, Gitlab y Bitbucket 37 El comando Git fetch en Git 38 El comando Git push en Git 39 El comando Git pull en Git 40 El comando Git branch en Git 41 El comando Git checkout en Git 42 El comando Git merge en Git 43 Resolver un merge conflict en Git 44 Entender mejor el contenido de los commit durante un conflicto de merge en Git 45 Workflow Git centralizado 46 Workflow Git feature branching 47 Workflow Git trunk-based 48 Enfoque “forking” en Git 49 Gitflow en Git 50 Mensajes de commit en Git 51 Tagging & Versioning en Git 52 La opción merge en Git 53 La opción rebase en Git

© 2022 Aulab. Todos los derechos reservados • P.IVA: IT07647440721 • Política de privacidad