¿Por qué Git piensa que el maestro está por delante del control remoto, cuando está realmente detrás?

Tengo un repository en GitHub donde alguien más ha creado un par de nuevas sucursales, y he hecho clic en "fusionar" en las sucursales en GitHub para fusionarlas en master.

En el historial de commits de GitHub, puedo ver cuatro commits: la confirmación de la persona en la twig ( hash1 y hash2 ), seguido de mis commits de fusión ( hash3 y hash4 ). Esto esta bien.

Pero estoy confundido sobre mi estado de git local y cómo sincronizarlo con el control remoto. Estoy en la twig principal.

Si git whatchanged , los últimos commits que veo localmente son la confirmación de la persona en la twig ( hash1 y hash2 ), no las confirmaciones de fusión remota ( hash3 y hash4 ).

Si git status , veo lo siguiente:

 On branch master Your branch is ahead of 'origin/master' by 2 commits. (use "git push" to publish your local commits) nothing to commit, working directory clean 

¿Por qué git piensa que hash1 y hash2 ponen por delante del maestro remoto? ¿No está, en cambio, detrás de master, porque no tiene hash3 y hash4 ?

Si git pull origin master , veo:

 From github.com:myorg/myrepo * branch master -> FETCH_HEAD Already up-to-date. 

Por lo tanto, no parece saber sobre hash3 y hash4 .

Ahora tengo miedo de realizar un nuevo commit localmente en caso de que estropee el master, tenga fusiones adicionales innecesarias, etc. ¿Qué debo hacer para actualizar todo con el master remoto y comenzar con un borrón y count nueva?

ACTUALIZACIÓN: Aquí está la salida de git remote -v :

 origin git@github.com:myorg/myrepo.git (fetch) origin git@github.com:myorg/myrepo.git (push) 

Y aquí está la salida de git log --graph --decorate --pretty=oneline --abbrev-commit --all :

 * 2315aed (HEAD -> master) Merge branch 'master' of github.com:myorg/myrepo |\ | * 9de7505 (origin/master) Merge pull request #12 from myorg/reposition-video | |\ * | \ 0d1d845 Merge branch 'reposition-video' of github.com:myorg/myrepo |\ \ \ | |/ / |/| / | |/ | * 1067905 (origin/reposition-video, reposition-video) Move the video below the fold. * | a5e8d96 Merge pull request #11 from myorg/update-install-docs |\ \ | |/ |/| | * 9744ffa Minor documentation fixes. |/ * 4b4d507 Update README. * 89da81b Add latest code for feature. 

¡Ah, entonces si hago git log localmente puedo ver cuatro commit de fusión, no dos! Simplemente no aparecen en git whatchanged , que es en parte por qué estaba confundido.

Pregunta ahora: ¿cómo puedo deshacer estas fusiones locales adicionales y volver a sincronizar con el control remoto, que tiene solo dos compromisos de fusión? ¿Y cómo sucedieron en primer lugar? ¿Supongo que debe haber alguna fusión automática durante la git pull ?

Puedes forzar a tu master a estar en el origin/master usando

 git checkout master git reset --hard origin/master 

esto debería descartar 0d1d845 y 2315aed y su networking debería verse así

 * 9de7505 (origin/master, HEAD -> master) Merge pull request #12 from myorg/reposition-video |\ | * 1067905 (origin/reposition-video, reposition-video) Move the video below the fold. * | a5e8d96 Merge pull request #11 from myorg/update-install-docs |\ \ | |/ |/| | * 9744ffa Minor documentation fixes. |/ * 4b4d507 Update README. * 89da81b Add latest code for feature. 

No romperás nada. En caso de que esto no sea lo que usted desea o se rompa inesperadamente, puede volver al "estado desorderado" usando

 git reset --hard 2315aed 

Debe darse count de que todo lo que Git informa sobre el estado de su twig master local es con respecto a la twig de seguimiento local que rastrea el master remoto real que está en GitHub. Cuando ves lo siguiente:

 Your branch is ahead of 'origin/master' by 1 commit. 

significa que su master local se adelanta a la twig de seguimiento local en una confirmación. No implica necesariamente nada más de lo que realmente está sucediendo en el control remoto. Los events que llevaron a este estado fueron probablemente los siguientes:

 git checkout master git pull origin master # work work work git commit git status 

Ahora aquí es donde se pone jugoso. Cuando nuevamente lo hiciste

 git pull origin master 

fusionaste todo el nuevo trabajo en la twig master remota. Entonces, su Git local dice que está actualizado con el control remoto, y lo está haciendo. Pero la trampa es que ahora el control remoto está detrás de ti. Por lo tanto, también debería fusionar su sucursal local en el master remoto. Dado que está utilizando GitHub, emitir una request de extracción es una forma limpia y segura de hacerlo.