Normalmente los conflictos de fusión se producirán cuando dos personas han cambiado las mismas líneas en un archivo o si una de ellas ha borrado un archivo que otra está desarrollando. En estos casos Git no sabe como solventar la situación y generará un conflicto que tendremos que resolver.
Tipos de conflictos de fusión.
- Git no inicia la fusión.
Una fusión no se iniciará si Git detecta que hay cambios en el directorio de trabajo actual, no confirmados que puedan ser sobrescritos en la fusión. Vamos a crear un ejemplo de fusión que cree un error de este tipo:
chema@mcbook:~/Prueba$ git init
Initialized empty Git repository in /home/chema/Prueba/.git/
chema@mcbook:~/Prueba$ > main.py
chema@mcbook:~/Prueba$ git add .
chema@mcbook:~/Prueba$ git commit -m "Primer commit en rama main."
[main (root-commit) b19e412] Primer commit en rama main.
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 main.py
chema@mcbook:~/Prueba$ git branch auxiliar
chema@mcbook:~/Prueba$ git switch auxiliar
Switched to branch 'auxiliar'
chema@mcbook:~/Prueba$ echo "# Un comentario." > main.py
chema@mcbook:~/Prueba$ git add .
chema@mcbook:~/Prueba$ git commit -m "Añadida linea en archivo. Rama
auxiliar."
[auxiliar e195481] Añadida linea en archivo. Rama auxiliar.
1 file changed, 1 insertion(+)
chema@mcbook:~/Prueba$ git switch main
Switched to branch 'main'
chema@mcbook:~/Prueba$ echo "segunda linea" > main.py
chema@mcbook:~/Prueba$ git merge auxiliar
Updating b19e412..e195481
error: Your local changes to the following files would be overwritten
by merge:
main.py
Please commit your changes or stash them before you merge.
Aborting
- Git falla durante la fusión.
Un fallo durante la fusión indica un conflicto entre la rama local actual y la rama que se está fusionando. Git hará lo posible para fusionar los archivos, pero te dejará cosas a solventar en los archivos con conflictos.
Vamos a verlo con un ejemplo.
chema@mcbook:~/Prueba$ git init
Initialized empty Git repository in /home/chema/Prueba/.git/
chema@mcbook:~/Prueba$ echo "Esto es el texto inicial." > merge.txt
chema@mcbook:~/Prueba$ git add .
chema@mcbook:~/Prueba$ git commit -m "Confirmamos el contenido inicial."
[main (root-commit) e951c03] Confirmamos el contenido inicial.
1 file changed, 1 insertion(+)
create mode 100644 merge.txt
Ahora tenemos un repositorio con una única rama main y un poco de texto en el archivo merge.txt. A continuación creamos una nueva rama y la utilizaremos para crear una fusión conflictiva.
chema@macbook:~/Prueba$ git checkout -b nueva_rama_para_mezclar_luego
Switched to a new branch 'nueva_rama_para_mezclar_luego'
chema@macbook:~/Prueba$ echo "Contenido diferente para mezclar luego." > merge.txt
chema@macbook:~/Prueba$ git add .
chema@macbook:~/Prueba$ git commit -m "Editado el contenido del archivo merge.txt para crear un conflicto."
[nueva_rama_para_mezclar_luego 9a77225] Editado el contenido del archivo merge.txt para crear un conflicto.
1 file changed, 1 insertion(+), 1 deletion(-)
Con esta nueva rama, hemos creado una confirmación que sobrescribe el contenido de merge.txt
chema@mcbook:~/Prueba$ git switch main
Switched to branch 'main'
chema@mcbook:~/Prueba$ echo "Contenido para añadir." >> merge.txt
chema@mcbook:~/Prueba$ git add .
chema@mcbook:~/Prueba$ git commit -m "añadido contenido a merge.txt"
[main 4f820aa] añadido contenido a merge.txt
1 file changed, 1 insertion(+)
Esto ahora pone nuestro repositorio de ejemplo en un estado en el que tenemos dos nuevas confirmaciones. Una está en la rama main y la otra en la rama 'nueva_rama_para_mezclar_luego'. En este momento vamos a fusionarlas a ver que pasa.
chema@mcbook:~/Prueba$ git branch
* main
nueva_rama_para_mezclar_luego
chema@mcbook:~/Prueba$ git merge nueva_rama_para_mezclar_luego
Auto-merging merge.txt
CONFLICT (content): Merge conflict in merge.txt
Automatic merge failed; fix conflicts and then commit the result.
Como no podía ser de otra forma Git nos indica que existe un conflicto puesto que las dos ramas intentan escribir en la misma línea del archivo merge.txt.
Como identificar conflictos de fusión.
chema@macbook:~/Prueba$ git status
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: merge.txt
no changes added to commit (use "git add" and/or "git commit -a")
chema@macbook:~/Prueba$ cat merge.txt
<<<<<<< HEAD
Esto es el texto inicial.
Contenido para añadir.
=======
Contenido diferente para mezclar luego.
>>>>>>> nueva_rama_para_mezclar_luego
Como resolver conflictos de fusión mediante la línea de comandos.
Esto es el texto inicial.
Contenido para añadir.
Contenido diferente para mezclar luego.
chema@macbook:~/Prueba$ git add merge.txt
chema@macbook:~/Prueba$ git commit -m "fusionados y resueltos los conflictos de merge.txt"
[main d1d0197] fusionados y resueltos los conflictos de merge.txt
Git merge Vs Git rebase.
$ git switch nuevas_caracteristicas
o
$ git checkout nuevas_caracteristicas
(Para cambiar de rama.)
$ git merge main
$ git checkout nuevas_caracteristicas
o
$ git switch nuevas_caracteristicas
(Para cambiar de rama.)
$ git rebase main
Debido a esto es SUPERIMPORTANTE:
No hay comentarios:
Publicar un comentario