2011-12-31 19 views
36

Según la documentación, git pull realiza una git traiga luego un git merge, sin embargo, en ese caso, la realización de git principal origen tirón debe realizar una git traiga principal origen ¿verdad? Sin embargo, no parece estar haciéndolo. Aquí hay un ejemplo.git pull origin master no actualiza origen/master?

Se supone que mi maestro origen remoto (en GitHub en mi caso) tiene la siguiente historia:

commit 1111111 : my first commit 
commit 2222222 : a commit from someone else 

y sólo tengo mi primer comprometerse localmente como haciendo siguiente muestra

git checkout master 
git log --pretty=format:'%h' -n 1 
1111111 

git checkout origin/master 
git log --pretty=format:'%h' -n 1 
1111111 

Desde aquí hacer mi extracción y ver los resultados de la siguiente manera:

git checkout master 
git pull origin master 

git log --pretty=format:'%h' -n 1 
2222222 

git checkout origin/master 
git log --pretty=format:'%h' -n 1 
1111111 

Como se puede ver, la pu De hecho, actualicé mi rama principal con las nuevas confirmaciones desde el origen remoto, pero mi origen/maestro local todavía está donde estaba. Obligándome a hacer lo siguiente

git fetch origin master 

git checkout origin/master 
git log --pretty=format:'%h' -n 1 
2222222 

¿Este comportamiento es correcto para Git Pull o podría tener algo que no se haya configurado? Miré a través de la página man de git pull y no vi nada que sugiriera esto, pero es posible que me lo haya perdido.

+0

ver si esto ayuda a explicar por qué a ti. http://stackoverflow.com/questions/2452226/master-branch-and-origin-master-have-diverged-how-to-undiverge-branches or this one http://stackoverflow.com/questions/2883840/differences -entre-git-pull-origin-master-git-pull-origin-master – carbonbasednerd

+1

posible duplicado de ['git pull origin mybranch' deja local mybranch N confirma antes del origen. ¿Por qué?] (Http: // stackoverflow.com/questions/1741143/git-pull-origin-mybranch-leaves-local-mybranch-n-commits-ahead-of-origin-why) –

+0

Es posible que desee considerar hacer 'git fetch' seguido de' git merge'. En general, terminará con menos sorpresas y tendrá más control sobre cómo fusionarse. –

Respuesta

28

Es un poco raro, pero si usa git pull [remote] <refspec>, en realidad no actualiza las referencias remotas. Tiene sentido si lo piensas de cierta manera: dado que estás especificando una referencia específica para buscar, no tiene que buscar nada sobre tus ramas remotas, por lo que no sabe de forma inherente qué rama remota debería actualizar Por supuesto, podría resolverlo, y no me sorprendería si finalmente se corrige, pero ese es el comportamiento existente. (Puede que haya mensajes en la lista de correo al respecto, no sé).

Sin embargo, puede solucionarlo fácilmente. Si usa git pull origin/master, ya que está especificando qué buscar a través de una rama remota, debe actualizar esa rama remota. Y si está en su rama principal de todos modos (o cualquier otro origen/maestro de seguimiento de bifurcación), puede simplemente hacer git pull y dejar que complete los valores predeterminados, y actualizará las sucursales remotas.

Esto está documentado en la página de manual de git-pull, de manera más concisa bajo EJEMPLOS pero también en otros lugares. La parte pertinente:

Combinar en la rama actual de la rama a distancia al lado:

$ git pull origin next 

Esto deja una copia de la siguiente forma temporal en FETCH_HEAD, pero no actualiza ningún ramas de seguimiento a distancia. Usando ramas de seguimiento a distancia, el mismo se puede hacer mediante la invocación de traer y Merge:

$ git fetch origin 
$ git merge origin/next 
+0

¿Está esto documentado en cualquier lugar de las páginas del manual de git? –

+0

Está enterrado en algún lugar de la página de '' git-pull'', creo. Trataré de cazarlo algún tiempo después si no recuerdo mal. – Cascabel

+0

@KennethBaltrinic: Está en la sección de ejemplos, y puede deducirse del resto de la documentación también. – Cascabel

Cuestiones relacionadas