2011-08-24 28 views
11

El uso de refspec es una manera conveniente de tomar una rama remota y crear una similar pero con un nombre dado (o al revés: crear una remota con un nombre de pila diferente al local)) Estoy confundido acerca de una cosa pequeña - como tirón también lo hará la fusión con la rama de corriente que se puede esperar un comportamiento diferente de:Git pull/fetch con diferencias refspec

git fetch origin master:mymaster 

y desde

git pull origin master:mymaster 

Tanto de los comandos anteriores parecen produce exactamente el mismo resultado - que es una rama local llamada mymaster, igual que origen/maestro. ¿Estoy en lo cierto o hay una diferencia vaga entre los dos?

Por último, el uso de un refspec creará una rama local de no un seguimiento rama, ¿verdad? Dado que las ramas de seguimiento se presionan automágicamente cuando se invoca git push sin argumentos AFAIK

Respuesta

24

Un refspec es solo un par de fuente/destino. El uso de un refspec x:y con fetch le dice a git que haga una rama en este repositorio llamada "y", que es una copia de la rama llamada "x" en el repositorio remoto. Nada más.

Con pull, git lanza una combinación en la parte superior. En primer lugar, se realiza una búsqueda utilizando el refspec dado, y luego la rama de destino se fusiona en la rama actual. Si eso es confuso, aquí hay un paso a paso-:

git pull origin master:mymaster 
  1. Ir al origen y obtener rama "master"
  2. Hacer una copia del mismo nombre local "mymaster"
  3. Combinar "mymaster" en la rama actual

totalmente calificado, eso sería refs/heads/mymaster y refs/heads/master. Para comparar, el refspec predeterminado configurado por git en un clon es +refs/heads/*:refs/remotes/origin/*. refs/remotes es un espacio de nombre conveniente para mantener las sucursales remotas separadas de las locales. Lo que está haciendo es decirle a git que coloque una sucursal de seguimiento remoto en el mismo espacio de nombres que sus sucursales locales.

En cuanto a "rastrear ramas", eso es solo una entrada en su archivo de configuración que le indica a git a dónde debe tirar y empujar una rama local desde/hacia la predeterminada.

3

git fetch origin master:mymaster actualiza Branch mymaster en el repositorio local obteniendo de la rama principal del repositorio remoto.

git pull origin master:mymaster hace lo anterior y lo fusiona en la rama actual.

0

He usado smartgit para crear una bifurcación, por lo que podría estar en esa sucursal que no se fusionó correctamente en la maestra. Rama de soporte creada para el lanzamiento, es decir, soporte/4.2, la etiqueta se crea automáticamente pero ahora wehn. Trato de hacer git pull, me muestra el mismo error. Como soporte/4.2 brannch se crea en github pero no se fusiona correctamente en local. Así que he usado esto: - Git Pull Origin Master: mymaster

En mi caso - git pull origen de soporte/4.2: soporte/4.2

Funciona :)

Cuestiones relacionadas