git pull comando: --force, --rebase option, fetch difference, conflict resolve
Este artículo cubre las preguntas más comunes sobre el comando git pull
.
Cubriremos los conceptos básicos y su uso, la opción --force
, la opción --rebase
, y cómo resolver conflictos.
1. Entendiendo git pull
El comando git pull
aplica cambios desde un repositorio remoto a tu repositorio local.
Esto se hace en dos pasos. El comando git pull
utiliza el comando git fetch
internamente para obtener los cambios del repositorio remoto localmente y almacenarlos en caché,
El comando git merge para fusionar esos cambios en el repositorio local.
Si el commit en el repositorio remoto está justo delante, el pull se completa fácilmente usando una estrategia de avance rápido. Sin embargo, como indica git merge post, pueden surgir conflictos durante la fase de fusión, momento en el que se da al desarrollador la oportunidad de resolver el conflicto. Opcionalmente, puedes utilizar la estrategia rebase en lugar de fusionar.
Es fácil de usar. Cuando se extraen cambios de una rama específica en un repositorio remoto, se especifica el nombre remoto y el nombre de la rama.
$ git pull origin main
Si no escribe el nombre del repositorio remoto y el nombre de la rama como se muestra a continuación, puede tener consecuencias no deseadas, dependiendo de su rama de trabajo actual y de su configuración. Siempre que sea posible, utilice el nombre del repositorio remoto y el nombre de la rama juntos, como se muestra en el comando anterior.
$ git pull
Ahora veamos los resultados de ejecutar `git pull' en cada situación.
1.1 Estrategia de avance rápido
En git pull
, la estrategia de avance rápido significa que la rama remota está unas pocas confirmaciones por delante de la última confirmación en la rama local.
Por ejemplo, si la rama local tiene commit A <- commit B
y la rama remota tiene commit A <- commit B <- commit C
, entonces git pull
sólo tomará commit C
de la rama remota y la añadirá a la rama local.
a la rama local.
En este caso, no se requiere ninguna fusión, por lo que el proceso de fusión no se interrumpe, y no hay necesidad de crear una confirmación de fusión separada. Veámoslo en acción.
Como puedes ver en la salida, hemos usado la estrategia fast-forward, y el proceso git pull
se ha completado automáticamente.
1.2. Cuando necesitas resolver un conflicto de fusión
Si hay líneas en conflicto entre las ramas remota y local, git pull
se detendrá, especialmente el proceso de fusión. Por ejemplo, si las ramas remota y local han hecho nuevos commits con cambios diferentes.
En este caso, sólo se realizará git fetch y tendremos que terminar la fase merge. Ya aprendimos a resolver el conflicto de merge en el post de git merge, así que veamos el resultado de la ejecución de inmediato.
Puedes ver en el log que hubo un conflicto merge durante el pull, que resolvimos y luego confirmamos.
2. Diferencia con git fetch
Como ya hemos mencionado, el comando git pull
incluye el comando git fetch
.
El comando git fetch
obtiene y guarda toda la información de la rama remota que la rama actual está siguiendo.
Las ramas remotas suelen tener un formato de nombre origin/main
y pueden verse con el comando git branch -r
, como vimos en el post git branch.
Utiliza el siguiente comando
$ git fetch [remote-name]
El resultado de la ejecución es
Mirando la salida, puedes ver que algunos de los mensajes mostrados en la salida git pull
de arriba son del comando fetch
.
Como hemos introducido el comando fetch
, también podemos obtener el historial de la rama remota de esta forma
3. Opción --force
La opción --force
que puede usarse con el comando git pull
es en realidad una opción para el comando git fetch
.
Se usa cuando el historial de la rama remota y la rama local no coinciden, por ejemplo debido a borrados de confirmaciones.
En estos casos, git fetch
será rechazado, pero la opción --force
forzará que el historial de confirmaciones de la rama remota actual sea sobrescrito por el de la rama local.
Sin embargo, esta opción no se aplica a la fase de fusión, por lo que incluso si fuerza una obtención, si entra en conflicto con la rama actual tendrá que resolver manualmente el conflicto de fusión.
Utilice el siguiente comando
$ git fetch --force [remote-name]
o
$ git pull --force [remote-name] [branch-name]
4. Opción --rebase
El comando git pull
funciona con una estrategia merge por defecto.
La opción --rebase
le dice a git fetch
que realice un comando git rebase en lugar de un merge.
Las diferencias entre merge y rebase se resumen aquí.
Un pull con rebase adjunta los commits de la rama remota al ancestro común de las ramas remota y local, y adjunta los commits de la rama local a ese último commit. Este proceso cambia el historial de confirmaciones, por lo que debe utilizarse con cuidado.
Para utilizarlo, ejecute el siguiente comando
$ git pull --rebase <remote-name> <branch-name>
5. git pull Otras opciones
5.1. Opción --No-commit
$ git pull --no-commit
Esta opción se usa cuando quieres comprobar de nuevo los resultados del git pull
o añadir algunas manipulaciones.
Esta opción detendrá el proceso git pull
justo antes de confirmar. En este punto puedes añadir cualquier nueva operación que desees, y luego confirmar manualmente para completar el comando pull.
5.2. La opción --ff-only
$ git pull --ff-only
Esta opción fuerza a que el pull se complete sólo en una situación de avance rápido, de lo contrario el pull será descartado. Con esta opción puedes garantizar que tu rama local no será modificada, ni siquiera accidentalmente, y que sólo la rama remota será copiada completamente.
5.3. opciones -depth
git pull --depth [depth-number]
Esta opción, que también se encuentra en muchos otros comandos, te permite extraer sólo el número de confirmaciones que desees. Si no necesitas todo el historial de commits de una rama remota, esto puede ahorrarte sobrecarga, espacio en disco, etc.
5.4. Opción --Prune
$ git pull --prune
Esta opción se utiliza para limpiar ramas locales que siguen ramas que no existen actualmente en el repositorio remoto. Si estás seguro de que el repositorio remoto es la fuente de la verdad, puedes usar esta opción para mantener tu entorno Git local más limpio.
5.5. Opción --autostash
$ git pull --autostash
Esta opción almacenará automáticamente, o guardará temporalmente, los cambios que estés haciendo y continuará con el pull. Los cambios almacenados volverán automáticamente una vez finalizado el pull. Esto puede ser útil si usted necesita tirar antes de confirmar.
6. Reflexiones finales
El comando git pull
es uno de los comandos más importantes para sincronizar repositorios remotos y locales.
Una de las maneras más fáciles de solucionar problemas cuando se utiliza el comando git pull
es pensar siempre en un pull como un fetch y un merge o rebase como dos pasos separados.
Para una explicación más detallada del comando git merge
, ver este post.
