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](/images/git-force-pull/images/hero.png)
¿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, nogit pull --force
git branch <nombre-backup>
puede usarse para hacer una copia de seguridad de los cambios locales antes de hacer el resetgit stash
es útil para guardar temporalmente los cambios, pero puede llevar a conflictos de mergegit 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:
git fetch origin
descarga los últimos cambios del repositorio remoto pero no los fusiona.git reset --hard origin/main
mueve la punta de tu rama local para que coincida con la rama remotamain
, 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.