Acabo de observar algo extraño git pull
que no entiendo.
El viernes trabajé en una sucursal local. llamémoslo mybranch
. Antes de salir de la oficina empujé con el origen (que es mi github repo): git push origin mybranch
.
Ayer en casa, pull
edité mybranch en mi computadora portátil, hice un poco más de codificación y luego empujé mis cambios a github (origen).
Ahora estoy en el trabajo de nuevo e intenté llevar los cambios de ayer a mi máquina de trabajo (no cambié nada en el repositorio local de mi lugar de trabajo durante el fin de semana):
git pull origin mybranch
que provocó una fusión de avance rápido, lo cual está bien. Luego hice una git status
, y dijo:
# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 6 commits.
#
nothing to commit (working directory clean)
¿Eh? ¿Cómo pueden ser 6 confirmaciones por delante cuando ni siquiera lo toqué durante el fin de semana, Y simplemente lo saqué del origen? Entonces ejecuté a git diff origin/mybranch
y las diferencias fueron exactamente los 6 cambios que acabo de extraer del control remoto.
Solo pude "arreglar" esto ejecutando git fetch origin
:
From [email protected]:me/project
af8be00..88b0738 mybranch -> origin/mybranch
Aparentemente, a mi repositorio local le faltaban algunos objetos de referencia, pero ¿cómo puede ser eso? Quiero decir, un tirón ya hace una búsqueda, y no trabajé en nada excepto en esa rama, por lo que un git fetch origin
y git fetch origin mybranch
debería tener el mismo resultado.
¿Debería usar siempre en git pull origin
lugar de git pull origin branchname
?
Estoy confundido.
fuente
git push
también parecerá resolverlo (reportando "todo actualizado").git config --get-regexp br.*
puede decirle si su configuración tiene una sucursal local que está rastreando otra sucursalgit config branch.master.remote yourGitHubRepo.git
su workRepo y verificar (en el siguientegit pull origin
) si el estado permanece con una advertencia de 'adelantado'?git remote show origin
me muestra que el origen apunta a mi repositorio de GitHub, así que supongo que debería estar bien.Your branch is ahead
" mensaje de advertencia después de ungit pull
, primero debe definir también el nombre remoto de una rama . De ahí mi sugerencia: escribagit config branch.master.remote yourGitHubRepo.git
, luego intente aygit pull
agit status
y vea si el problema persiste.Respuestas:
git pull
llamadasgit fetch
con los parámetros apropiados antes de fusionar los encabezados obtenidos explícitamente (o si ninguno, la rama remota configurada para fusionarse) en la rama actual.La sintaxis:
git fetch <repository> <ref>
donde<ref>
es solo un nombre de rama sin dos puntos es una búsqueda de 'una sola vez' que no realiza una búsqueda estándar de todas las ramas rastreadas del control remoto especificado, sino que solo obtiene la rama nombradaFETCH_HEAD
.Actualización: para las versiones de Git desde 1.8.4, si hay una rama de seguimiento remoto que rastrea la referencia que solicitó buscar, la rama de seguimiento ahora se actualizará por
fetch
. Este cambio se ha realizado específicamente para evitar la confusión que provocó el comportamiento anterior.Cuando lo realiza
git pull <repository> <ref>
,FETCH_HEAD
se actualiza como se indicó anteriormente, luego se fusiona con su desprotegido,HEAD
pero ninguna de las ramas de seguimiento estándar para el repositorio remoto se actualizará (Git <1.8.4). Esto significa que, localmente, parece que está por delante de la rama remota, mientras que de hecho está al día con ella.Personalmente, siempre lo hago
git fetch
seguido degit merge <remote>/<branch>
porque veo cualquier advertencia sobre actualizaciones forzadas antes de fusionarme, y puedo obtener una vista previa de lo que estoy fusionando. Si usaragit pull
un poco más de lo que hago, haría un simplegit pull
sin parámetros la mayoría del tiempo, confiarbranch.<branch>.remote
ybranch.<branch>.merge
"hacer lo correcto".fuente
git fetch
después de unagit pull <repository> <ref>
solución al problema ya que la zona de alcance actualizaría las ramas de seguimiento estándar? Además, gracias por esta respuesta, que empieza a tener sentido :)git fetch
seguir adelantegit merge origin/master master
.¿Qué
git remote -v show
devuelve cuando se trata de origen?Si el origen apunta a github, el estado debe estar actualizado y no antes que ningún repositorio remoto. Al menos, con el Git1.6.5 que estoy usando para una prueba rápida.
De todos modos, para evitar esto, defina explícitamente el repositorio remoto de la rama maestra:
luego a
git pull origin master
, seguido de agit status
debería devolver un estado limpio (no adelante).¿Por qué? porque el get fetch origin master (incluido en el git pull origin master) no solo se actualizaría
FETCH_HEAD
(como explica Charles Bailey en su respuesta ), sino que también actualizaría la "rama maestra remota" dentro de su repositorio local de Git.En ese caso, su maestro local ya no parecería estar "por delante" del maestro remoto.
Puedo probar esto, con un git1.6.5:
Primero creo un workrepo:
Simulo un repositorio de GitHub creando un repositorio simple (uno que puede recibir push desde cualquier lugar)
Agrego un modif a mi repositorio de trabajo, que empujo al repositorio de github (agregado como un control remoto)
Creo un repositorio de inicio, clonado de GitHub, en el que hago un par de modificaciones, enviadas a GitHub:
Luego clono workrepo para un primer experimento
En ese repositorio, git status menciona que el maestro se adelanta a '
origin
':Pero eso es solo
origin
que no es github:Pero si repito la secuencia en un repositorio que tiene un origen en github (o no tiene ningún origen, solo un 'github' remoto definido), el estado es limpio:
Si solo hubiera
origin
apuntadogithub
,status
estaría limpio para git1.6.5.Puede ser con una advertencia 'por adelantado' para git anteriores, pero de todos modos, un
git config branch.master.remote yourGitHubRepo.git
definido explícitamente debería poder encargarse de eso, incluso con versiones anteriores de Git.fuente
git remote show origin
.¿Tiene cuidado de agregar todo su control remoto (excepto el
origin
que viene con su clon original) usandogit remote add NAME URL
? He visto este error cuando se acaban de agregar a la configuración de git.fuente
git checkout -b mybranch origin/mybranch
. De acuerdo con la página de manual de git-branch, el origen / mybranch es el punto de inicio y, además, indica para --track: "... Use esto si siempre extrae de la misma rama ascendente a la nueva rama, y si no desea utilizar "git pull <repository> <refspec>" explícitamente. Este comportamiento es el predeterminado cuando el punto de inicio es una rama remota ".