Back

Git Force Pull: Cómo sobrescribir de forma segura los cambios locales y sincronizar con el repositorio remoto

Git Force Pull: Cómo sobrescribir de forma segura los cambios locales y sincronizar con el repositorio remoto

¿Alguna vez te has encontrado con el error ""Tus cambios locales serían sobrescritos por el merge"" al intentar hacer git pull? Muchos desarrolladores tienen dificultades para forzar git pull y sobrescribir los archivos locales y sincronizarlos con el repositorio remoto. Este artículo explica la forma adecuada de hacer un force pull en Git sin perder tu trabajo o desordenar tu repositorio.

Puntos clave

  • Usa git fetch + git reset --hard para sobrescribir los cambios locales, no git pull --force
  • git branch <nombre-backup> puede usarse para hacer una copia de seguridad de los cambios locales antes de hacer el reset
  • git stash es útil para guardar temporalmente los cambios, pero puede llevar a conflictos de merge
  • git clean elimina los archivos no rastreados - ¡úsalo con precaución!

¿Qué es Git Force Pull?

git pull --force es un concepto erróneo común. Muchos desarrolladores piensan que este comando sobrescribirá sus cambios locales con la versión remota. Sin embargo, git pull --force en realidad hace algo diferente - permite hacer pull de una rama remota con un historial divergente sobrescribiendo tu historial local. No sobrescribe los cambios locales no confirmados.

Cómo sobrescribir correctamente los cambios locales

Para realmente sobrescribir todos los cambios locales y hacer que tu rama sea idéntica a la versión remota, necesitas usar git fetch y git reset --hard:

git fetch origin
git reset --hard origin/main

Esto es lo que hacen estos comandos:

  1. git fetch origin descarga los últimos cambios del repositorio remoto pero no los fusiona.
  2. git reset --hard origin/main mueve la punta de tu rama local para que coincida con la rama remota main, descartando todos los cambios locales.

:warning: Advertencia: git reset --hard eliminará permanentemente todos los cambios locales no confirmados. ¡Asegúrate de que realmente quieres descartar tu trabajo local antes de ejecutar esto!

Haciendo copia de seguridad de los cambios locales

Si no estás seguro de si necesitas tus cambios locales o no, puedes crear una rama de respaldo antes de hacer el reset:

git branch backup-main
git fetch origin
git reset --hard origin/main

Ahora tus cambios locales se conservan en la rama backup-main, mientras que tu rama main está sincronizada con la remota.

Guardando cambios temporalmente (stashing)

Otra forma de apartar temporalmente las modificaciones locales es git stash:

git stash push
git fetch origin
git reset --hard origin/main
git stash pop

Esto guarda tus cambios locales, restablece tu rama y luego vuelve a aplicar los cambios encima. Ten en cuenta que es posible que debas resolver conflictos de fusión después del stash pop.

Eliminando archivos no rastreados

Por defecto, git reset no toca los archivos que no son rastreados por Git (archivos que nunca has preparado con git add). Para borrar también esos archivos, usa git clean:

git fetch origin
git reset --hard origin/main
git clean -fd

:warning: Advertencia: Al igual que git reset --hard, git clean es irreversible, ¡así que ten cuidado!

Conclusión

Si bien git pull --force puede sonar como el comando correcto, es mejor usar git fetch y git reset --hard para sobrescribir los cambios locales y sincronizar con el repositorio remoto. ¡Solo ten cuidado, ya que reset --hard y clean -fd son irreversibles! En caso de duda, haz una copia de seguridad de tu trabajo local con git branch o git stash antes de hacer el reset. ¡Feliz force-pulling!

Preguntas frecuentes

`git reset --hard` descartará todos los commits locales que no se han subido. Puedes usar `git branch` para respaldarlos primero.

Pueden ocurrir conflictos de merge al volver a aplicar los cambios guardados en el stash sobre nuevos commits. Tendrás que resolver los conflictos manualmente, luego hacer `git add` y `git commit` para terminar de aplicar el stash.

Por lo general, puedes recuperarte de un `git reset --hard` accidental usando `git reflog` para encontrar el commit en el que estabas antes del reset, luego `git reset --hard <commit>` a ese hash de commit.

Listen to your bugs 🧘, with OpenReplay

See how users use your app and resolve issues fast.
Loved by thousands of developers