Git Force Pull
En este tutorial, aprenderemos a extraer cambios del repositorio remoto con fuerza en Git.
A veces, es posible que necesitemos descartar las modificaciones locales y reemplazarlas con actualizaciones del repositorio remoto en un entorno de desarrollo colaborativo.
Usamos el comando git pull
para obtener los cambios del repositorio remoto a la rama local en el repositorio local.
El comando git pull
tendrá éxito solo si los cambios en la rama local están detrás de los cambios en el repositorio remoto.
Si la rama local y los cambios del repositorio remoto han divergido y si deseamos descartar los cambios locales, debemos hacer un git pull
forzado para sobrescribir los cambios locales,
Ahora lo desarrollaremos con un ejemplo.
Uso de git fetch
, git reset
y git merge
para hacer una extracción contundente de los cambios remotos en Git
El comando git pull
no es una sola operación. El comando git pull
ejecuta el comando a saber. git fetch
para obtener los datos del repositorio remoto, y luego el comando git merge
para fusionar esos cambios en el repositorio local.
El comando git pull
ejecuta los dos comandos de la siguiente manera.
$ git fetch
$ git merge origin/$CURRENT_BRANCH
El comando git fetch
descarga los últimos cambios del repositorio remoto. No hace ninguna merge
o rebase
del repositorio local.
El comando git merge
anterior fusiona los cambios del repositorio remoto, proporcionados por el alias origin
, que se han agregado a $CURRENT_BRANCH
, que aún no están presentes en la rama local en el repositorio local.
Por lo tanto, el git pull
fallará si la rama local en el repositorio local es divergente de la rama en el repositorio remoto.
Es posible que hayamos realizado algunos cambios locales en los archivos del árbol de trabajo de la rama local. Por lo tanto, esto hace que el git pull
falle.
Ahora podemos decidir descartar los cambios locales a favor de los cambios en el repositorio remoto.
Por lo tanto, debemos extraer los cambios con fuerza que sobrescribirán las modificaciones locales.
Necesitamos hacer lo siguiente para lograr un tirón contundente de los cambios remotos.
$ git fetch
$ git reset --hard HEAD
$ git merge origin/$CURRENT_BRANCH
El comando git reset
con la opción --hard
restablecerá la rama a lo que acabamos de buscar. También descartará cualquier cambio local en los archivos rastreados y los archivos que no se rastrean se eliminarán.
Por lo tanto, use esto con precaución, ya que se perderán los cambios locales.
Alternativamente, podemos guardar los cambios locales antes de extraer los cambios. Podemos ocultar los cambios usando git stash
junto con la extracción de los cambios.
Podemos hacer lo siguiente.
$ git fetch
$ git stash
$ git merge origin/$CURRENT_BRANCH
$ git stash pop
Así, cuando usamos git stash
, ya no necesitamos hacer un git reset
de la rama local del repositorio local.
Usamos el git stash pop
para obtener cambios locales del alijo.