Uso de Git Pull con la opción --ignore-unmerged
Ahora que hemos creado un conflicto entre nuestros repositorios local y remoto, exploremos cómo usar la opción git pull --ignore-unmerged
para resolverlo.
Comprender la opción --ignore-unmerged
La opción --ignore-unmerged
le dice a Git que priorice los cambios remotos sobre tus cambios locales cuando hay conflictos. Esto puede ser útil en situaciones en las que sabes que los cambios remotos son más importantes que tus cambios locales.
Abortar la fusión (merge) actual
Antes de poder usar la opción --ignore-unmerged
, necesitamos abortar la fusión actual en progreso:
cd ~/project/git-pull-demo
git merge --abort
Este comando restaurará tu directorio de trabajo al estado anterior al intento de fusión. Verifiquemos el contenido del archivo:
cat file1.txt
Ahora deberías ver solo tus cambios locales:
This is the first line of the file.
This line was added locally.
Uso de la opción --ignore-unmerged
Ahora, usemos la opción git pull --ignore-unmerged
:
git pull --ignore-unmerged origin main
Puedes notar que Git todavía reporta un conflicto:
From /home/labex/project/remote-repo
* branch main -> FETCH_HEAD
Auto-merging file1.txt
CONFLICT (content): Merge conflict in file1.txt
Automatic merge failed; fix conflicts and then commit the result.
Esto se debe a que la opción --ignore-unmerged
funciona de manera un poco diferente a lo que su nombre sugiere. No resuelve directamente los conflictos ignorando tus cambios locales. En lugar de eso, permite que Git continúe con una fusión incluso cuando hay entradas no fusionadas.
Comprender lo que realmente sucedió
La forma correcta de priorizar los cambios remotos sobre los cambios locales es usar la opción --strategy-option theirs
:
git reset --hard ## Advertencia: Esto descartará todos los cambios no confirmados
git pull -X theirs origin main
La salida debería verse así:
From /home/labex/project/remote-repo
* branch main -> FETCH_HEAD
Updating xxxxxxx..xxxxxxx
Fast-forward
file1.txt | 1 +
1 file changed, 1 insertion(+)
Este comando le dice a Git que resuelva automáticamente los conflictos prefiriendo los cambios remotos ("theirs") sobre tus cambios locales ("ours").
Veamos el contenido del archivo ahora:
cat file1.txt
Deberías ver:
This is the first line of the file.
This line was added by a team member.
Como puedes ver, el cambio remoto se ha priorizado sobre tu cambio local. La opción --strategy-option theirs
es una forma más directa de lograr lo que muchas personas creen incorrectamente que hace --ignore-unmerged
.
Cuándo usar --ignore-unmerged
La opción --ignore-unmerged
es en realidad más útil en casos en los que quieres extraer (pull) actualizaciones para archivos que no tienen conflictos, mientras dejas los archivos conflictivos sin fusionar para resolverlos manualmente más tarde.
Para demostrar esto adecuadamente, creemos otro escenario:
## Agregar un nuevo archivo localmente
echo "This is a new local file." > local_file.txt
git add local_file.txt
git commit -m "Added local_file.txt"
## Crear un cambio en el repositorio del miembro del equipo
cd ~/project/team-member-repo
echo "This is a second line by team member." >> file1.txt
echo "This is a new remote file." > remote_file.txt
git add file1.txt remote_file.txt
git commit -m "Team member made more changes"
git push origin main
## Volver a tu repositorio
cd ~/project/git-pull-demo
## Hacer un cambio diferente en file1.txt
echo "This is another local change." >> file1.txt
git add file1.txt
git commit -m "Made another local change"
Ahora, cuando intentas extraer (pull), obtendrás un conflicto:
git pull origin main
Salida:
From /home/labex/project/remote-repo
* branch main -> FETCH_HEAD
Auto-merging file1.txt
CONFLICT (content): Merge conflict in file1.txt
Automatic merge failed; fix conflicts and then commit the result.
Abortemos la fusión y probemos con --ignore-unmerged
:
git merge --abort
git pull --ignore-unmerged origin main
Esto todavía puede mostrar conflictos, pero te permitirá obtener todos los cambios no conflictivos (como remote_file.txt
) mientras dejas el archivo conflictivo (file1.txt
) para que lo resuelvas manualmente.