2011-07-28 12 views
11

Tengo una rama git desprotegida llamada foo.Git buscar y tirar sin argumentos

> git status 
# On branch foo 
nothing to commit (working directory clean) 

Originalmente fue desprotegido usando este comando:

> git checkout origin/foo -b foo --track 

quiero conseguir cambios a esta rama desde el repositorio remoto. Sé que cualquiera de estos comandos será suficiente:

> git fetch origin foo # ignore the lack of merging 
> git pull origin foo 

Si Omito los argumentos a fetch o pull, se git por defecto para ir a buscar (o tirar) la rama que tengo actualmente desprotegido? Es decir, ¿son equivalentes los siguientes pares de comandos?

> git checkout foo 
> git pull 

y

> git checkout foo 
> git pull origin foo 

Respuesta

19

Por desgracia, si son equivalentes o no, en general, depende de la rama que se encuentra, su configuración, fase de la luna, etc.

Puede resolver esto desde la página git pull hombre, que a mí ve descrito a continuación, pero generalmente trataré de evitar tener que resolverlo haciendo: git fetch origin y luego git merge origin/foo. (Escribí un somewhat rambling blog post about this.)

Sin embargo, su pregunta es realmente acerca del comportamiento predeterminado de git pull cuando no especifica un control remoto o un refspec. Podemos resolver esto desde el git pull man page, y en particular el DEFAULT BEHAVIOUR section. Esto es algo difícil de entender, así que he puesto en negrita las únicas partes que realmente se aplican a su pregunta dado que (a) usted está en la rama foo, (b) creó esa rama como describió en la pregunta y (c) no ha cambiado su configuración.

A menudo las personas usan git pull sin dar ningún parámetro. Tradicionalmente, esto ha sido equivalente a decir git pull origin. Sin embargo, cuando la configuración branch.<name>.remote está presente en la rama <name>, ese valor se usa en lugar de origin.

Con el fin de determinar qué URL a usar para traer desde, el valor de la configuración remote.<origin>.url es consultado y si no hay ninguna de estas variables, se utiliza el valor de URL: línea en $GIT_DIR/remotes/<origin> archivo.

Para determinar qué ramas remotas recuperar (y opcionalmente almacenar en las ramas de seguimiento remoto) cuando el comando se ejecuta sin parámetros refspec en la línea de comandos, se consultan los valores de la variable de configuración remote.<origin>.fetch, y si hay no hay ninguno, se consulta el archivo $GIT_DIR/remotes/<origin> y se usan sus líneas Pull:.Además de los formatos refspec descritos en la sección Opciones, puede tener un refspec globbing que tiene este aspecto:

refs/heads/*:refs/remotes/origin/*

Un refspec globbing debe tener una RHS no vacío (es decir, debe almacenar lo que eran exagerado en rastreos de seguimiento remoto), y su LHS y RHS deben terminar con /*. Lo anterior especifica que todas las sucursales remotas se rastrean usando ramas de rastreo remoto en la jerarquía refs/remotes/origin/ con el mismo nombre.

La regla para determinar qué rama remota fusionar después de la recuperación es un poco complicado, para no romper la compatibilidad con versiones anteriores.

Si se proporcionaron refspecs explícitos en la línea de comando de git pull, todos se fusionaron.

Cuando no se proporcionó refspec en la línea de comandos, entonces git pull usa el refspec de la configuración o $GIT_DIR/remotes/<origin>. En tales casos, se aplican las siguientes reglas:

configuración
  1. If branch.<name>.merge de la rama actual existe, que es el nombre de la rama en el sitio remoto que se fusionó.

  2. Si el refspec es globbing uno, nada se fusiona.

  3. De lo contrario, la rama remota del primer refspec se fusiona.

Cuando creó la rama foo con:

git checkout origin/foo -b foo --track 

... se han establecido las siguientes opciones de configuración, que asocian su sucursal foo con refs/heads/foo en el repositorio origin:

branch.foo.remote=origin 
branch.foo.merge=refs/heads/foo 

Por lo tanto, si usted pone eso junto con el s Entences arriba, la respuesta es "Sí, en esta situación que describes, cuando estás en la rama foo, los comandos git pull y git pull origin foo son equivalentes".

+0

No son siempre totalmente equivalente - - mira mi respuesta para más detalles. –

1

Sí, lo son. La información de seguimiento se guarda en .git/config.

3

Incluso en las condiciones que Mark describe, cuando parecen ser iguales, todavía hay una diferencia sutil: git pull origin foo no actualizará la rama de seguimiento remoto, mientras que git pull lo hará. Esto se documenta en la página del manual de git-pull:

A parameter <ref> without a colon is equivalent to <ref>: when pulling/fetching, so it merges <ref> into the current branch without storing the remote branch anywhere locally

Así, en su caso, para el verdadero equivalente a git pull, que había necesidad de hacer git pull origin foo:refs/remotes/origin/foo

Cuestiones relacionadas