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 de nivel superior 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 dos comandos, git fetch seguido de git merge. En la primera etapa de la operación git pull ejecutará un git fetch en la rama local a la que apunta 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á 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 la rama local y la rama maestra. En este ejemplo, ese punto es E. 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 nueva que incluye el contenido de las confirmaciones remotas A, B y C, y tiene un mensaje de registro combinado. Este es un ejemplo de una de las estrategias de fusión de git pull. Una 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 ha reescrito las confirmaciones locales E, F y G para que aparezcan después de ellas en el historial de confirmaciones maestras o de origen locales.

Opciones comunes

git pull <remote>

Fetch the specified remote’s copy of the current branch and immediately merge it into the local copy. This is the same as git fetch followed by git merge origin/.

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 lugar 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

You can think of git pull as Git's version of svn update. It’s an easy way to synchronize your local repository with upstream changes. The following diagram explains each step of the pulling process.

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 en la local.

Comando git pull y sincronización

git pull es uno de los muchos comandos 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 usan para descargar contenido remoto. Puede hacerse una importante distinción de seguridad entre git pull y get fetch. git fetch puede considerarse la opción "segura" y git pull la "no segura". 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 a un simple git pull.

In fact, pulling with --rebase is such a common workflow that there is a dedicated configuration option for it:

git config --global branch.autosetuprebase always

After running that command, all git pull commands will integrate via git rebase instead of 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 una extracción del repositorio y se pasa a la rama . Después, se ejecuta git pull transmitiendo . De este modo, se incorporará implícitamente la rama newfeature de . Una vez finalizada la descarga, se iniciará un 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.