Los conflictos durante la fusión son una parte frecuente de la experiencia de Git . Si hay varios desarrolladores trabajando en el mismo archivo, aumentan las probabilidades de encontrar un conflicto de fusión. La mayoría de las veces, Git descubrirá automáticamente cómo integrar nuevos cambios. Los conflictos generalmente surgen cuando dos personas han cambiado las mismas líneas en un archivo, o si un desarrollador eliminó un archivo mientras otro desarrollador lo estaba modificando . En estos casos, Git no puede determinar automáticamente cuál es el correcto. Por lo tanto, Git notificará al desarrollador que realiza la combinación que se encuentra un conflicto, el resto del equipo no estará al tanto del conflicto. Ahora, es responsabilidad del desarrollador que realiza la fusión resolver el conflicto.
Tipos de conflictos de fusión
Al iniciar la fusión: si hay cambios en el directorio de trabajo o en el área de preparación, mientras se fusiona, Git no podrá iniciar la fusión. Esto sucede porque los cambios pendientes pueden ser anulados por las confirmaciones que se fusionan. Este es el mensaje de error proporcionado por Git cuando ocurre este tipo de conflicto de fusión:
error: Entry '<fileName>' not uptodate. Cannot merge. (Changes in working directory) or, error: Entry '<fileName>' would be overwritten by merge. Cannot merge. (Changes in staging area)
Este tipo de conflicto se puede resolver haciendo git stash save «any_message_to_describe_what_is_saved» (guarda cualquier cambio en su área de preparación y directorio de trabajo en un índice separado) O git checkout <file_name> (descarta sus cambios) y luego fusiona se puede completar
Durante la fusión: esto ocurre porque ha confirmado cambios que están en conflicto con los cambios confirmados de otra persona. Git hará todo lo posible para fusionar los archivos y dejará las cosas para que las resuelva manualmente en los archivos que enumera. Este es el mensaje de error proporcionado por Git cuando ocurre este tipo de conflicto de fusión:
CONFLICT (content): Merge conflict in <fileName> Automatic merge failed; fix conflicts and then commit the result.
Este tipo de conflicto se puede resolver reparando manualmente todos los conflictos de fusión para cada archivo O usando git reset ––hard (restablece el repositorio para salir de la situación de conflicto de fusión).
Creación de un conflicto de fusión
Para mostrar un ejemplo simple de cómo puede ocurrir un conflicto de fusión, podemos desenstringr manualmente un conflicto de fusión desde el siguiente conjunto de comandos en cualquier terminal UNIX/GIT bash:
Paso 1: Cree un nuevo directorio usando el comando mkdir y cd en él.
Paso 2: inicialízalo como un nuevo repositorio Git usando el comando git init y crea un nuevo archivo de texto usando el comando touch .
Paso 3: abra el archivo de texto y agregue algo de contenido en él, luego agregue el archivo de texto al repositorio y confírmelo .
Paso 4: ahora es el momento de crear una nueva rama para usarla como fusión conflictiva. Use git checkout para crear y pagar la nueva rama.
Paso 5: ahora, sobrescriba algunos cambios conflictivos en el archivo de texto de esta nueva rama.
Paso 6: agregue los cambios a git y confírmelos desde la nueva rama.
Con esta nueva rama: new_branch_for_merge_conflict, hemos creado una confirmación que anula el contenido de test_file.txt
Paso 7: Vuelva a comprobar la rama principal y, esta vez, agregue un texto al test_file.txt de la rama principal.
Paso 8: agregue estos nuevos cambios al área de preparación y confírmelos .
Paso 9: Ahora, para la última parte, intente fusionar la nueva rama con la rama maestra y encontrará el segundo tipo de conflicto de fusión.
Entonces, ahora hemos desenstringdo con éxito un conflicto de fusión en Git.
Identificar y resolver conflictos
Como hemos experimentado en el ejemplo anterior, Git producirá una salida descriptiva que nos informará que se ha producido un CONFLICTO. Podemos obtener más información ejecutando el comando git status . Esto es lo que obtendremos después de ejecutar el comando git status:
On branch master 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: test_file.txt no changes added to commit (use "git add" and/or "git commit -a")
Al abrir test_file.txt, vemos algunos «divisores de conflicto». Este es el contenido de nuestro test_file.txt:
<<<<<<< HEAD Adding some content to mess with it later Append this text to initial commit ======= Changing the contents of text file from new branch >>>>>>> new_branch_for_merge_conflict
La línea ======= es el “centro” del conflicto. Todo el contenido entre el centro y la línea <<<<<<< HEAD es contenido que existe en el maestro de rama actual al que apunta la referencia HEAD. Alternativamente, todo el contenido entre el centro y >>>>>>> new_branch_for_merge_conflict es contenido que está presente en nuestra rama de fusión.
Para resolver nuestro conflicto de combinación, podemos eliminar manualmente la parte innecesaria de cualquiera de las ramas y solo considerar el contenido de la rama que es importante para su uso posterior, además de eliminar los «divisores de conflicto» de nuestro archivo. Una vez que se ha resuelto el conflicto, podemos usar el comando git add para mover los nuevos cambios al área de preparación y luego git commit para confirmar los cambios.
Publicación traducida automáticamente
Artículo escrito por equbalzeeshan y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA