Resolución de conflictos de Git: una guía rápida y completa

Git es una herramienta increíble para fusionar diferentes ramas de código. La mayoría de las veces, los cambios realizados por usted y su equipo se fusionan automáticamente, pero de vez en cuando surgen conflictos. En este artículo, aprenderá cómo resolver estos conflictos y cómo evitar que sucedan.

En términos simples, un conflicto de fusión en Git ocurre cuando dos desarrolladores cambian la misma pieza de código y la única forma de resolver este conflicto es a través de la intervención manual, cambiando el código en cuestión y enviando una nueva confirmación.

Los conflictos pueden ocurrir tanto al fusionar ramas como al fusionar confirmaciones dentro de la misma rama. El concepto parece simple. Comprenda a continuación cómo ocurren los conflictos y cómo resolverlos.

Git
Git

Cómo suceden los conflictos

Los conflictos en Git son bastante comunes y siempre ocurren cuando el mismo archivo ha sido modificado por dos versiones diferentes, y estas versiones no se pueden fusionar automáticamente. Así es como pueden ocurrir los conflictos:

Digamos que usted y su amigo están trabajando en la misma rama en un repositorio remoto de GitHub. Estás trabajando en el código de un sitio web.

Abres el archivo “index.html” y cambias el código que corresponde al título del sitio a “Hello World”.

Guardas lo que acabas de hacer a través de una nueva confirmación local.

git add index.html
git commit -m "Changing website title"

Luego, debe usar git pullpara recibir el repositorio remoto, fusionar el código en su máquina para que luego pueda actualizar el repositorio remoto con sus propios cambios.

CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

¡Ups! Un mensaje de CONFLICTO. Sabemos que el conflicto ocurrió en index.html, porque el mensaje de conflicto lo indica.

Cuando abre el archivo index.html, ahora contiene el siguiente texto:

<html>
	<head>
<<<<<<< HEAD
		<title>Hello World</title>
=======
		<title>Welcome to the website</title>
>>>>>>> master
	</head>
	<body>
		Lorem ipsum dolor sit amet consectetur ...
	</body>
</html>

Bueno, resulta que tu amigo envió un cambio seguido de un empujón antes que tú, cambiando la misma línea de código de una manera diferente. En este caso, escribió “Bienvenido al sitio web” en el título, mientras que tú, lo cambiaste por “Hola mundo”.

Git es excelente para fusionar código automáticamente, pero en los casos en que se realizan dos cambios diferentes en la misma pieza de código, el sistema de control de versiones no tiene forma de saber qué versión es la correcta. Entonces necesitamos intervenir manualmente en el código, y para eso, Git crea esta bandera, con “<<<<<<<“, “=======” y “>>>>>>>”, haciendo explícito que había un conflicto.

Comprender el marcado de conflicto de Git

Para comprender la sintaxis del conflicto, primero debe comprender que el conflicto ocurre entre dos versiones de lo que Git considera la misma pieza de código.

  1. El primero siendo su versión (HEAD), y;
  2. La segunda es la versión de la rama en la que estamos tratando de fusionarnos (maestro, en este caso).

Entonces, la sintaxis de marcado siempre será la siguiente:

<<<<<<< HEAD
	Here's your code change
=======
	Here's your friend's code change that Git tried to merge
>>>>>>> master

Cómo resolver conflictos

Primero, necesitamos ubicar todos los archivos donde se han producido conflictos. Recomiendo inspeccionar los mensajes de conflicto después git pullcomo en el siguiente ejemplo:

CONFLICT (content): Merge conflict in index.html

Al final del mensaje, tiene el archivo donde ocurrió el conflicto, pero si por casualidad ya cerró la terminal y no tiene ninguna indicación de qué archivos tienen un conflicto, puede usar git statusy ver qué archivos fueron modificados por la fusión o haga una búsqueda general en el proyecto (dependiendo de su editor de código puede ser Ctrl + Shift + F) por “<<<<<<<“, o “=======”.

Como se explicó anteriormente, Git genera este marcado con dos versiones del mismo código: la versión que tiene y la versión con la que está tratando de fusionarse.

Por lo tanto, para resolver el conflicto, debe cambiar el archivo para que contenga solo una versión. Eliminando el código incorrecto y eliminando las banderas de conflicto. Revisa el ejemplo a continuación:

<html>
	<head>
<<<<<<< HEAD
		<title>Hello World</title>
=======
		<title>Welcome to the website</title>
>>>>>>> master
	</head>
	<body>
		Lorem ipsum dolor sit amet consectetur ...
	</body>
</html>

Nuestro objetivo es dejarlo así, eliminando la versión incorrecta así como el marcado de conflicto:

<html>
	<head>
		<title>Hello World</title>
	</head>
	<body>
		Lorem ipsum dolor sit amet consectetur ...
	</body>
</html>

La pregunta principal aquí era simplemente elegir qué versión del código eliminar. Pero habrá casos en los que una versión sea complementaria a la otra , por lo que puedes copiar parte del código de tu colega y parte de tu código, generando una tercera versión final a partir de ese conflicto.

No hay reglas sobre qué conservar o eliminar para resolver un conflicto. La regla es cambiar el archivo, manteniéndolo en su versión funcional y correcta.

Una vez que haya resuelto el conflicto, debe agregar la resolución a una nueva confirmación para que su código pueda guardarse en el repositorio remoto.

git add index.html
git commit -m "Resolving conflicts"
git push

Cómo evitar conflictos de Git

De vez en cuando, es inevitable que dos personas cambien la misma pieza de código, por lo que no recomiendo evitar los conflictos a toda costa, sino familiarizarse con la resolución de conflictos y adoptar esto como parte de la rutina de desarrollo.

Pero hay casos en los que los conflictos pueden crear un desorden, especialmente en proyectos grandes, donde cientos de archivos pueden cambiarse automáticamente en ciertos casos.

Para hacer eso, mi consejo es intentar que todos en el equipo estén siempre actualizados con la rama remota a través de git pull frecuentes , porque cada vez que alguien tiene un código muy desactualizado, esa persona puede realizar nuevos cambios en el código que tiene 20 versiones. pasado.

Esto suele generar retrabajo y dolor de cabeza a quienes tienen que resolver conflictos e interpretar cuál sería la versión correcta de ese código. ¡Aquí hay algunos otros consejos y herramientas de resolución de conflictos que pueden ayudarlo!

Consejos y herramientas para facilitar la resolución de conflictos

Si el conflicto apareció durante una fusión, pero se pudo evitar, es posible que desee deshacer la fusión. Para esto, puede usar el siguiente comando, que deshace la combinación y vuelve a la versión de la rama antes de la combinación y antes de que ocurrieran los conflictos.

git merge --abort

Si desea deshacer los cambios en un archivo específico que está causando un conflicto y simplemente descartar sus cambios locales para que no ocurra el conflicto, puede usar el comando git reset.

git reset

Para comprobar el estado de los archivos modificados, así como lo que se ha cambiado en cada archivo, son útiles dos comandos. El comando de estado muestra el estado de todos los archivos modificados en su rama actual.

git status

El comando git diff muestra todos los cambios locales, línea por línea, en los archivos modificados, incluidos los archivos que tienen conflictos y que aún no se agregaron a la última confirmación.

git diff

El comando de registro seguido del parámetro de fusión muestra una lista de confirmaciones que tuvieron conflictos al fusionar dos ramas.

git log --merge

Leave a reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *