algo de confusión sobre git pull vs git-fetch [duplicate]

3 minutos de lectura

Entonces, ¿alguien puede aclarar esto?

Corro:

git pull origin master  
git status

Y luego extrae los cambios y dice:

your branch is ahead of origin/master ... blahblah by 6 commits...

Cuando luego corro

git fetch
git status

Dice:

# On branch master
nothing to commit (working directory clean)

Así que pensé git pull git fetch de forma predeterminada, entonces, ¿por qué dice “adelante por 6 confirmaciones” sin información adicional? git fetch?

  • En este caso particular, significa lo que dice: su rama está por delante, es decir, contiene confirmaciones no enviadas, lo que no tiene nada que ver con el tirón, es solo un aviso para usted.

    – bredikhin

    12 de diciembre de 2013 a las 17:19


  • @bredikhin Pero acabo de sacar estas confirmaciones: ¿por qué demonios se clasificarían como no enviadas? Ahí es donde estoy confundido. ¿Por qué cuando extraigo cambios de una rama remota no recibo el mensaje “nada que confirmar (limpiar el directorio de trabajo)” de inmediato?

    – Danny Boy

    12 de diciembre de 2013 a las 17:24


  • es posible que antes de correr git status la segunda vez, corriste git push?

    – micromosis

    12 de diciembre de 2013 a las 17:33

  • @Dannyboy Tus confirmaciones locales no se activan, no las que has extraído.

    – bredikhin

    12 de diciembre de 2013 a las 17:33


  • @bredikhin Pero no tengo confirmaciones locales. y si lo hago git fetch – después git pull -> este mensaje no aparece, solo obtengo “nada que confirmar (limpiar el directorio de trabajo)”

    – Danny Boy

    12 de diciembre de 2013 a las 17:34


El texto “adelante o detrás de X compromisos” en git status se basa en el estado de la rama de seguimiento de la rama actual; remotes/origin/master si estás en masterpor ejemplo.

cuando corres git pull con un control remoto y una rama especificados, obtiene las nuevas confirmaciones y las fusiona con la rama actual, pero no lo hace no actualizar las sucursales de seguimiento remoto del origen. En su lugar, apunta a las confirmaciones recién obtenidas como FETCH_HEAD.

Correr git fetch sin argumentos especificados, por otro lado, lo hace actualice todas las sucursales de seguimiento remoto, para que el mensaje desaparezca. git pull sin argumentos hace lo mismo.

¡Un truco sutil que yo mismo he golpeado un montón de veces! En cambio, deseo que git actualice todas las ramas de seguimiento remoto en cada búsqueda contra un control remoto en particular.

  • Solo por curiosidad, ¿sabes? por qué git pull <remote> <branch> no actualiza el remote/branch ¿árbitro? ¿Es solo pasas histéricas, o hay alguna buena razón?

    – torek

    13 de diciembre de 2013 a las 0:35


  • resulta que en realidad no lo es git pull <remote> <branch> en absoluto; es realmente git pull <remote> <refspec>. Una “refspec” es básicamente un par de origen-destino separados por dos puntos, como master:origin/master; git pull origin master:origin/master significa “ir al origen remoto, darme su rama maestra y actualizar origen/maestro en el repositorio local”. Si omite los dos puntos, la búsqueda no actualizará ninguna referencia local, solo FETCH_HEAD.

    – Ceniza Wilson

    13 de diciembre de 2013 a las 1:11

  • Otras lecturas: git-scm.com/book/en/Git-Internals-The-Refspec

    – Ceniza Wilson

    13 de diciembre de 2013 a las 1:12

¿Ha sido útil esta solución?