64

¿Cuáles son específicamente las diferencias entre hacer un git pull y un git fetch?

fedorqui
  • 15,850
  • 17
  • 58
  • 112
jpganz18
  • 1,000
  • 1
  • 7
  • 11
  • 1
    Aquí respondí sobre esa misma pregunta. http://es.stackoverflow.com/questions/191/pull-a-un-branch-remoto-que-no-existe-en-mi-local – roadev Dec 02 '15 at 15:26

5 Answers5

60

Siempre en un repositorio tienes una rama oculta, que puedes ver al usar git branch -a.

Esa rama oculta es origin/master.

Tú al usar git fetch, bajas los cambios del repositorio remoto a la rama origin/master:

git fetch origin

Ahora ya tienes los cambios en origin/master, pero tendrías que pasarlos a la rama master, para eso tienes que usar:

git merge origin/master

A partir de esto tu tienes los nuevos cambios en tu rama master y listo.

Aquí una imagen que hice para explicar esta parte: introducir la descripción de la imagen aquí

Al usar git pull estas combinando git fetch+ git merge.

git pull origin master

En conclusión con git pull te estás ahorrando el usar un comando más, pero te recomiendo que si apenas estás empezando a usar git, sigas usando git fetch y git merge

Fili Santillán
  • 701
  • 4
  • 6
59

De la documentación:

git pull is shorthand for git fetch followed by git merge FETCH_HEAD.

o haciendo una traducción libre:

git pull es una abreviación de git fetch seguido de git merge FETCH_HEAD.

Es decir, git fetch trae los cambios, pero los deja en otro branch, hasta que se hace el git merge para traerlos al branch local.

Marcos Crispino
  • 3,435
  • 12
  • 25
  • 6
    osea que el fetch solo baja los cambios sin hacerles merge localmente? – jpganz18 Dec 02 '15 at 15:22
  • 3
    @jpganz18, correcto. – manix Dec 02 '15 at 15:22
  • 1
    supongo que los dejara en el mismo branch solo para darles git add, no? – jpganz18 Dec 02 '15 at 15:31
  • 1
    'Que los deja en otro branch' ¿en cuál? – dwarandae Dec 06 '15 at 06:07
  • 3
    Los deja en un branch oculto llamado `origin/master`, si quieren ver las ramas ocultas usen: `git branch -a`, lo explico mejor en la respuesta que te deje. - @dwarandae – Fili Santillán Dec 06 '15 at 07:59
  • Es tremendamente confuso que pongas "master" cuando no estamos hablando de una rama master en concreto. Origin/XXXX siendo XXXX el nombre de la rama de la que estás haciendo fetch. Pero no descarga nada de la red, simplemente actualiza los punteros de información. – darkgaze Jun 22 '19 at 18:24
11

En realidad git pull baja los cambios de la rama determinada y la actualiza contra tu repositorio local.

git fetch baja los cambios de la rama determinada y la coloca en una rama espejo que simplemente es una clase de rama escondida en la cual tú puedes mirar los cambios de dicha rama, para posteriormente hacer merge con tu rama local.

El git pull simplemente es un git fecth + git merge. No utilizar el git pull si en realidad está dudoso de qué cambios puedan traerse del repositorio remoto.

3

Cuando haces un git fetch, se van a descargar los cambios de tu repositorio remoto(en el caso de que haya) en una carpeta que se llama origin/master, que es una carpeta oculta. Para incluir los cambios a tu rama local necesitas fusionar master con origin/master.

Git pull hace todo eso automaticamente.

rafaelmd
  • 31
  • 1
0

Muy resumido: con fetch solo consultas los cambios que hay en el repositorio con respecto a tu copia local; y con pull te bajas los cambios a tu local. Creo que Sourcetree al hacer pull, hace antes un fetch también.

eugenio
  • 550
  • 2
  • 8