pull-only repo 'git status' diciendo que la twig está por delante del origen / maestro. ¿Por qué?

Así que aquí está la situación:

estado $ git
# En la twig maestro
# Su sucursal está por delante de 'origin / master' por [x] commits.
#

Ya hay varias preguntas sobre esto en SO, pero ninguna parece abordar específicamente el tipo de escenario que tengo. Esta respuesta a una de las preguntas es la más aproximada, pero no entra en detalles.

Voy a citar textualmente:

Si recibes este post después de hacer una "sucursal remota de git pull", intenta hacer un seguimiento con un "git fetch".

Fetch parece actualizar la representación local de la twig remota, lo que no ocurre necesariamente cuando haces una "twig remota de git pull".

Esa sugerencia realmente funciona. Pero "¿no necesariamente sucede?" Por qué no? Necesito entender esto. ¿Qué es lo que no está haciendo?

No quiero tomar esa pregunta, así que aquí está mi escenario en detalle:

Tres computadoras involucradas. La Mac en la que desarrollo, mi server doméstico donde vive el git repo (es decir, el origen / principal) y una count de Webfaction que se extrae de ese server.

Hago commit y git push origin master solo en la Mac. El único command que se ejecuta en Webfaction como parte del flujo de trabajo normal es el git pull origin master (como parte de un script de deployment Fabric). No modifico el código allí. Soy un desarrollador solitario, por lo que tampoco lo hace nadie más.

De vez en cuando me conecto a Webfaction y verifico cosas, incluyendo un git status . Inevitablemente, siempre recibo el post "Su sucursal está adelante …". Ejecutar git fetch hace que el post desaparezca.

Estoy a punto de agregar git fetch al script de Fabric para que termine con este problema, pero quiero saber por qué es necesario hacerlo, especialmente en un clon pull-only de Origin / Master. No soy muy versado en Git, aunque utilizo la funcionalidad básica a diario, por lo que una explicación amigable para novatos sería apreciada.

Actualice según lo solicitado, los bits relevantes de config :

 [remote "origin"] fetch = +refs/heads/*:refs/remotes/origin/* url = git@[server_address]:[path/to/repo.git] [branch "master"] remote = origin merge = refs/heads/master 

Ok, entonces, desde el principio, estás haciendo todo correctamente. Creo que el comentario que agregaste anteriormente es una buena explicación:

En los términos más simples, "git pull" hace un "git fetch" seguido de "git merge"

Así es como pienso en eso. Así que no deberías tener que llamar a un git fetch después de un truco de git pull , pero, casi puedo garantizarte, esto funciona perfectamente bien en cualquier cosa, EXCEPTO en la twig master .

En una de las publicaciones enlazadas, dice eliminar la siguiente línea:

 [remote "origin"] fetch = +refs/heads/*:refs/remotes/origin/* <--- Remove this 

Y debería solucionar este problema, sin embargo, no puedo dar una explicación de por qué funciona. Es muy difícil investigar, pero creo que cuando llamas a fetch , tu configuration de git realmente especifica exactamente qué agarrar. Cuando ejecutas pull , no estoy seguro de que piense que el master está sincronizado.

Puedo garantizarte que si hiciste esto desde otra sucursal no maestra, no verías este problema. Con suerte, uno de los git gurús puede explicar la línea fetch en config en detalle.

Además, recomendaría ejecutar el siguiente command que establece el HEAD para el repository remoto para asegurar que esté sincronizado con el local: git push -u origin master


Aquí hay otra pregunta interesante:

Tener dificultades para entender git-fetch


Ok, entonces probé esto en uno de mis flujos de trabajo y encontré lo siguiente.

Cuando ejecuta un git pull origin master en su server remoto, hay un file en el directory .git/ que hace reference a dónde se encuentra su HEAD. Dos files para tomar nota de:

ORIG_HEAD

FETCH_HEAD

Notarás que tu FETCH_HEAD es correcta, pero ORIG_HEAD muestra la confirmación anterior, de ahí la razón por la que FETCH_HEAD Ahead by x . Cuando ejecutas git fetch , corregiste la reference en ORIG_HEAD y todo volvió a la normalidad. Estoy buscando cómo cambiar la línea de fetch en la configuration para corregir este comportamiento.

Si ejecuta un git pull origin lugar de un git pull origin master , no existirá el problema con Your branch is ahead of 'origin/master' by ... commits. post.

Vea esta pregunta: ¿Cuál es la diferencia entre 'git pull' y 'git fetch'?

AFAIK un git pull mirará la twig en origen y desplegará los cambios. Pero el índice local de la sucursal no está actualizado. git fetch actualizará el índice de la twig para que comprenda qué debería estar allí. (básicamente, lo que se mencionó en la respuesta a la que se vinculó)

Siempre hago una búsqueda de git antes de un git pull. Realmente hago una búsqueda de git cada vez que voy a hacer algo con sucursales remotas.

También se relaciona la pregunta anterior con esta muy buena descripción de git fetch, pull y merge. http://longair.net/blog/2009/04/16/git-fetch-and-merge/

En mi caso, tenía dos sucursales en Origin y cada vez que sacaba un git pull, mostraba que estaba por delante del origen / master por x. Incluso después de restablecerlo en el origen / maestro como se muestra en Restablecer sucursal de repository local para que sea como el repository remoto HEAD .

La solución ocurrió cuando simplemente ejecuté git fetch y trajo mi twig de desarrollo a mi server de producción.