Conflicto de fusión
Un conflicto de fusión ocurre cuando Git está combinando cambios y no puede decidir con seguridad qué versión de un archivo debe ganar.
A pesar del nombre, los conflictos de fusión pueden aparecer durante varias operaciones de Git, no solo al ejecutar git merge. Pueden ocurrir cuando:
- Fusionas una rama en otra con
git merge. - Reaplicas commits encima de otra rama con
git rebase. - Traes cambios remotos con
git pull, porque ese comando normalmente ejecuta una fusión o un rebase después de traer información del remoto. - Aplicas un commit en otro sitio con
git cherry-pick. - Reviertes los cambios de un commit con
git revert, si el cambio inverso no se puede aplicar limpiamente. - Reaplicas cambios guardados en stash con
git stash popogit stash apply.
Los conflictos suelen ocurrir cuando dos ramas han cambiado las mismas líneas de un archivo, o cuando una rama ha cambiado un archivo que otra rama ha eliminado o renombrado. Git detiene la operación para que puedas tomar la decisión final.
Errores relacionados, como "your local changes would be overwritten", no son exactamente lo mismo. En ese caso, Git normalmente se detiene antes de empezar la operación, para que primero puedas guardar o descartar tus cambios locales.
Cuando un archivo de texto tiene un conflicto de contenido, Git escribe marcadores de conflicto dentro del archivo:
<<<<<<< HEAD
la versión de tu rama actual
=======
la versión que Git intenta traer
>>>>>>> feature-branchLa parte que está por encima de ======= es un lado del conflicto. La parte que está por debajo es el otro lado. Tu trabajo consiste en editar el archivo hasta dejar la versión final que realmente quieres y luego eliminar todos los marcadores de conflicto.
Ours y theirs
Git y los editores de código a veces etiquetan los dos lados de un conflicto como ours y theirs. Algunas herramientas usan etiquetas como current e incoming para la misma idea. Ten cuidado con estos nombres: describen los lados de la operación actual de Git, no necesariamente "mi trabajo" y "el trabajo de otra persona".
En una fusión normal, el significado suele ser intuitivo:
git switch maingit merge feature
- Ours es
main, la rama en la que estabas antes de empezar la fusión. - Theirs es
feature, la rama que se está fusionando.
Durante un rebase, las etiquetas pueden parecer del revés:
git switch featuregit rebase main
Git coloca temporalmente tu trabajo encima de main. Si aparece un conflicto mientras Git está reproduciendo un commit de feature:
- Ours es el lado de
main, porque esa es la base actualmente cargada durante el rebase. - Theirs es el commit de
featureque se está reproduciendo.
Esto significa que elegir ours durante un rebase puede descartar el cambio de la rama que tú consideras "tuya". Comandos como git restore --ours path/to/file y git restore --theirs path/to/file eligen un lado entero de un archivo en conflicto, así que úsalos solo cuando tengas claro qué lado quiere decir Git en la operación actual.
Cómo resolver un conflicto
El flujo habitual es:
- Ejecuta
git statuspara ver qué archivos tienen conflictos. - Abre cada archivo en conflicto y edítalo hasta dejar la versión final correcta.
- Elimina las líneas de marcadores
<<<<<<<,=======y>>>>>>>. - Prepara los archivos resueltos con
git add. - Continúa la operación: crea el commit de fusión, ejecuta
git merge --continueo ejecutagit rebase --continue, según lo que te indique Git.
Git no comprueba si tu resolución es correcta en términos lógicos. En cuanto preparas el archivo, Git trata ese contenido como la respuesta. Lee el resultado antes de continuar.
Si el conflicto apareció por sorpresa y no te viene bien resolverlo ahora, a menudo puedes volver al estado anterior con git merge --abort o git rebase --abort.
.gitignoregit checkoutgit configgit taggit worktree