El comando git pull se emplea para extraer y descargar contenido desde un repositorio remoto y actualizar al instante el repositorio local para reflejar ese contenido. La fusión de cambios remotos anteriores en tu repositorio local es una tarea habitual de los flujos de trabajo de colaboración basados en Git. El comando git pull es, en realidad, una combinación de otros dos comandos, git fetch seguido de git merge. En la primera etapa de la acción, git pull ejecutará git fetch en la rama local a la que apunta el HEAD. Una vez descargado el contenido, git pull entrará en un flujo de trabajo de fusión. Se creará una nueva confirmación de fusión y se actualizará el HEAD para que apunte a la nueva confirmación.

Uso de git pull

Funcionamiento

El comando git pull ejecuta en primer lugar git fetch, que descarga el contenido del repositorio remoto especificado. Después, se ejecuta git merge para fusionar las referencias y los encabezados del contenido remoto en una nueva confirmación de fusión local. Para ilustrar mejor el proceso de incorporación de cambios y fusión, veamos el siguiente ejemplo. Supongamos que tenemos un repositorio con una rama maestra y un origen remoto.

En este escenario, git pull descargará todos los cambios desde el punto de separación de las confirmaciones locales y la rama maestra. En este ejemplo, ese punto es E. El comando git pull extraerá las confirmaciones remotas divergentes, que son A, B y C. A continuación, el proceso de incorporación de cambios creará una nueva confirmación de fusión local que incluya el contenido de las nuevas confirmaciones remotas divergentes.

En el diagrama anterior, podemos ver la nueva confirmación (H), que es una confirmación de fusión que incluye el contenido de las confirmaciones remotas A, B y C, y tiene un mensaje de registro combinado. Este es un ejemplo de las estrategias de fusión de git pull. La opción --rebase puede combinarse con git pull para usar una estrategia de fusión de reorganización en lugar de una confirmación de fusión. En el siguiente ejemplo, se puede ver cómo funciona una incorporación de cambios de reorganización. Supongamos que nos encontramos en el punto de partida de nuestro primer diagrama y que hemos ejecutado git pull --rebase.

En este diagrama, ahora podemos ver que la incorporación de cambios de reorganización no crea la nueva confirmación H. En su lugar, la reorganización ha copiado las confirmaciones remotas A, B y C, y las ha añadido al historial de confirmaciones de origen local/rama maestra.

Opciones comunes

git pull <remote>

Extrae la copia del origen remoto especificado de la rama actual y fusiónala de inmediato en la copia local. Esto equivale a git fetch <remote> seguido de git merge origin/<current-branch>.

git pull --no-commit <remote>

De manera similar a la invocación predeterminada, extrae el contenido remoto, pero no crea una nueva confirmación de fusión.

git pull --rebase <remote>

Al igual que en la anterior incorporación de cambios, en vez de utilizar git merge para integrar la rama remota en la local, usa git rebase.

git pull --verbose

Proporciona una salida detallada durante una incorporación de cambios que muestra el contenido descargado y los detalles de la fusión.

Análisis de git pull

Puedes pensar en git pull como una versión de Git de svn update. Se trata de una forma sencilla de sincronizar tu repositorio local con los cambios anteriores. En el siguiente diagrama, se explica cada paso del proceso de incorporación de cambios.

Al principio, piensas que tu repositorio está sincronizado, pero después git fetch refleja que la versión de la rama maestra del origen ha cambiado desde la última vez que la comprobaste. Luego, git merge integra al instante la rama maestra remota en la local.

Comando git pull y sincronización

El comando git pull es uno de los muchos que se encargan de "sincronizar" el contenido remoto. El comando git remote se utiliza para especificar los extremos remotos sobre los que operarán los comandos de sincronización. El comando git push sirve para cargar contenido en un repositorio remoto.

El comando git fetch puede confundirse con git pull. Ambos se utilizan para descargar contenido remoto; no obstante, puede hacerse una importante distinción de seguridad entre git pull y git fetch. El comando git fetch puede considerarse la opción más segura y git pull, la menos segura. El comando git fetch descargará el contenido remoto sin modificar el estado del repositorio local. En cambio, git pull descargará el contenido remoto y tratará inmediatamente de cambiar el estado del repositorio local para reflejar ese contenido. De modo accidental, esto puede provocar que el repositorio local entre en conflicto.

Incorporación de cambios mediante la opción rebase

La opción --rebase se puede usar para garantizar que el historial sea lineal evitando las confirmaciones de fusión innecesarias. Muchos desarrolladores prefieren esta opción antes que la fusión, porque es como decir "quiero que mis cambios prevalezcan sobre lo que han hecho los demás". En este sentido, usar git pull con --rebase se parece aún más a svn update que un simple git pull.

De hecho, incorporar cambios con --rebase es un flujo de trabajo tan común que hay una opción de configuración específica para él:

git config --global branch.autosetuprebase always

Después de ejecutar ese comando, se integrarán todos los comandos git pull mediante git rebase en lugar de git merge.

Ejemplos de git pull

En los siguientes ejemplos, se muestra cómo usar git pull en las situaciones más habituales:

Comportamiento predeterminado

git pull

La ejecución de la invocación predeterminada de git pull equivale a git fetch origin HEAD y git merge HEAD, donde HEAD es una referencia que apunta a la rama actual.

Comando git pull en los repositorios remotos

git checkout new_feature
git pull <remote repo>

En este ejemplo, primero se realiza un cambio y se pasa a la rama <newfeature>. Después, se ejecuta git pull en combinación con <remote repo>. De este modo, se incorporará implícitamente la rama "newfeature" de <remote repo>. Una vez finalizada la descarga, se iniciará git merge.

Uso de la opción rebase con git pull en lugar de merge

En el siguiente ejemplo, se muestra cómo realizar la sincronización con la rama maestra del repositorio central mediante la opción rebase:

git checkout master
git pull --rebase origin

Esto simplemente hace que tus cambios locales prevalezcan sobre lo que ya han hecho los demás.