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.