Combinar con forzar sobrescritura en Git

Abdul Jabbar 6 febrero 2022
Combinar con forzar sobrescritura en Git

La mayoría de las veces, cuando aplicamos git push o git merge, eventualmente se produce algún conflicto. En algunos casos, la solución al conflicto de fusión es tan simple como descartar los cambios locales o los cambios remotos o de otra rama.

Cuando Git no puede descubrir cómo fusionar dos cambios en conflicto, crea una solicitud de conflicto. Una solicitud de conflicto es un tipo especial de parche que describe el problema y contiene ambos lados del cambio en conflicto (el nuestro y el de ellos) y el resultado del intento de fusión.

Mientras dos miembros de equipos trabajaban en los mismos archivos y se produjo un conflicto en ese archivo, Git aplica el conflicto a nuestro archivo de trabajo. Luego podemos editar el archivo resultante y Git registrará nuestros cambios. Si ocurre un cambio conflictivo, Git marcará el archivo como en estado de conflicto. Hay varios comandos para resolver conflictos en esa rama en particular.

Los conflictos son más comunes cuando dos o más personas trabajan en el mismo archivo en el mismo repositorio. Sin embargo, cuando el conflicto se encuentra en un archivo, Git es muy inteligente sobre cómo resolverlo de una manera bastante asombrosa. Git usa marcadores de conflicto para mostrar qué partes del archivo están en conflicto. Los marcadores de conflicto son pequeños hash colocados a cada lado de la sección del archivo en conflicto.

Pull no se usa individualmente. Se usa con la ayuda de obtener datos del servidor remoto y luego aplicar la fusión con los cambios en el repositorio local. Estas dos operaciones mencionadas a continuación se pueden ejecutar si queremos.

git fetch
git merge origin/$CURRENT_BRANCH

El origen/$CURRENT_BRANCH mencionado anteriormente significa a continuación.

  • Git aplicará las opciones de combinación y aplicará los cambios desde el repositorio remoto, es decir, origin.
  • Y eso se suma al $CURRENT_BRANCH
  • Que actualmente no están presentes en nuestra rama local registrada

No solo se recomienda git pull, que simplemente ejecuta git fetch seguido de git merge. Haremos tres fusiones, a través de las cuales Git ejecutará tres operaciones de búsqueda, donde una búsqueda es todo lo que necesitaremos.

git fetch origin   # it will update all our origin/* remote-tracking branches
git checkout new branch        
git merge origin/new branch     
git checkout master
git merge origin/master
git merge -X theirs new branch  
git push origin master   

Los comandos mencionados anteriormente ignorarían efectivamente cualquier cambio que fuera diferente en la rama desde la que nos estábamos fusionando y desarrollarían un nuevo commit en la rama a la que nos estamos fusionando, donde todas los commits se fusionan.

También podemos usar --ours en una fusión normal para fusionar todos los cambios en la rama desde la que nos estamos fusionando, y luego omitir cualquier archivo que exista en la rama con la que nos estamos fusionando, haciendo efectivamente una fusión de tres vías entre los dos ramas y luego simplemente usar los archivos de la rama a la que se está fusionando.

Descubrimos que era mucho más fácil usar git merge --ours para fusionar los archivos y luego usar git rebase -i para volver a aplicar manualmente los cambios de la rama desde la que estaba fusionando.

Los comandos anteriores no funcionarían en archivos que tuvieran conflictos, pero descubrimos que lo siguiente funcionaría para resolver el conflicto.

git checkout file_with_conflict
git merge --ours --no-commit file_from_branch_with_conflict
git reset --hard git add file_with_conflict git commit -m 
Abdul Jabbar avatar Abdul Jabbar avatar

Abdul is a software engineer with an architect background and a passion for full-stack web development with eight years of professional experience in analysis, design, development, implementation, performance tuning, and implementation of business applications.

LinkedIn

Artículo relacionado - Git Merge