Git: diferencia entre 'git fetch' y 'git pull'

Como programador principiante, o incluso para muchos programadores experimentados, el control de versiones de Git puede ser difícil de aprender y dominar. Gran parte de la razón, en mi opinión,...

Como programador principiante, o incluso para muchos programadores experimentados, el control de versiones de Git puede ser difícil de aprender y dominar. Gran parte de la razón, en mi opinión, se debe a los muchos comandos diferentes que existen y las pequeñas diferencias entre ellos.

Un ejemplo de ello es la diferencia entre git fetch y git pull. A primera vista, el nombre de los comandos no da mucha idea de en qué se diferencian, por lo que en este artículo explicaré la diferencia entre los comandos git fetch y git pull.

Recuperar Git

El comando fetch recupera todas las confirmaciones, referencias (como etiquetas), ramas y archivos de un repositorio remoto, junto con cualquier otro objeto correspondiente. Sin embargo, no se recuperan todas las etiquetas, ya que este comando solo toma las que apuntan a las confirmaciones que está recuperando. Básicamente, este comando obtiene todo lo necesario para reconstruir el historial de la rama en particular que le interesa.

La sintaxis básica es la siguiente:

1
$ git fetch <remote-repo> <remote-branch>

Especificar <remote-branch> solo obtendrá los cambios de esa rama. Si se omite este parámetro, se recuperan los cambios de todas las ramas.

Lo interesante del comando fetch es que en realidad no afecta nada en su repositorio local. No se perderán los cambios de trabajo y no verá ningún efecto directo en sus sucursales locales. Esto se debe a que Git mantiene el contenido obtenido separado del contenido de su propio repositorio hasta que se fusiona.

Entonces, supongamos que desea ver los cambios para la rama "maestra" del repositorio remoto "origen" antes de decidir fusionarlos en su repositorio. Para hacer esto, podría usar los siguientes comandos:

1
$ git fetch origin master

Ahora que tiene los cambios en su repositorio, es probable que desee verlos, lo que puede hacer simplemente consultando la rama:

1
$ git checkout origin/master

Esto le permitirá ver los cambios, y aún no está fusionado con ninguna de sus propias ramas.

Una forma más rápida de ver estos cambios sería simplemente mirar los registros de confirmación, lo que puede hacer con:

1
$ git log master..origin/master

Tenga en cuenta que este se considera un método "más seguro" que pull ya que en realidad no realiza ningún cambio en sus sucursales locales.

Ahora que hemos visto lo que hace fetch y un poco sobre cómo funciona, echemos un vistazo a pull.

Git Pull

El comando git pull es lo que yo llamaría un comando de "alto nivel". Con eso quiero decir que realiza las acciones de algunos otros comandos de Git en secuencia, sobre los cuales explicaré más a continuación. En esta sección, después de describir la diferencia entre fetch y pull, también hablaré brevemente sobre las numerosas formas diferentes en que se puede usar el comando.

La sintaxis general es la siguiente:

1
$ git pull <remote-repo> <remote-branch>

Los parámetros <remote-repo> y <remote-branch> son opcionales, siempre que su rama actual esté rastreando una remota.

Probablemente la forma más sencilla de explicar este comando, y en qué se diferencia de fetch, es que es un alias para otros dos comandos de Git, cuando se usa en su modo predeterminado: fetch y merge. Entonces, al ejecutar git pull, básicamente estás ejecutando estos dos comandos en secuencia:

1
2
$ git fetch <remote-repo>
$ git merge FETCH_HEAD

Aquí FETCH_HEAD es una referencia a la punta de la última búsqueda, que se está fusionando con su rama actual.

Entonces, obviamente, la gran diferencia entre fetch y pull es que pull en realidad realiza una fetch además de una merge.

Aunque dependiendo de la opción que le des a git pull, puede funcionar de forma diferente a esta. Por ejemplo, si agrega la opción --rebase, en su lugar usará git rebase en lugar de git merge.

También existe la opción --no-commit, que realizará el comando merge, pero (como se indica en la documentación oficial) "simulará que la combinación falló" y no la confirmará automáticamente. Esto le permite echar un vistazo a los cambios que acaba de obtener antes de confirmarlos en su código.

Hay bastantes opciones más disponibles, la mayoría de las cuales están fuera del alcance de este artículo. Recomiendo echar un vistazo a la documentación oficial para más información.

Licensed under CC BY-NC-SA 4.0