2009-01-22 16 views
75

Tengo un repositorio en github con una rama principal (master) y una rama para algunos trabajos experimentales. Hice algunas confirmaciones y fui llevado a la rama experimental y todo estuvo bien.git: switch branch sin desmontar head

Ahora, en una máquina diferente, trato de clonar mi repositorio (git clone repositorio) y luego cambiar a la rama experimental (git checkout BRANCHNAME) pero cada vez que hago esto mi cabeza se separa y se me no puedo impulsar mis cambios ¿Qué estoy haciendo mal? Me da la sensación de que me estoy perdiendo un concepto fundamental de git en algún lugar, pero leer páginas aleatorias de git man no me da ninguna pista.

Soy nuevo en git, así que lo siento si estoy siendo un idiota pero no encuentro nada en los documentos que me ayude a volver a conectar mi cabeza.

EDITAR

El concepto de una rama de seguimiento es lo que me estaba perdiendo. Ahora que entiendo ese concepto, todo está claro. Personalmente, creo que la sintaxis git branch --track es mucho más intuitiva que git checkout -b branch-name origin/branch-name.

¡Gracias por la ayuda!

Respuesta

88
# first time: make origin/branchname locally available as localname 
git checkout -b localname origin/branchname 

# othertimes 
git checkout localname 

git push origin 

Para mayor comodidad, se puede utilizar la misma cadena para nombre_local & BRANCHNAME
Cuando se desprotegió origin/branchname que no estaban realmente mirando una rama. origin/branchname es un nombre "a distancia", y se puede obtener una lista de ellos con

branch -a 

Si ha activado colores, ramas locales serán de un color, y otra remota.

Primero tiene que rastrear localmente una rama remota para poder cambiar y trabajar en ella.

+5

Hombre, ¿por qué "git checkout origin/branchname" comienza a rastrear el sujetador ¿automáticamente si no se sigue? –

+2

porque todavía necesita un nombre local para la sucursal extranjera. –

+0

Esto es lo que estoy haciendo, y el mensaje de error: $ git checkout -b topic/fetch upstream/topic/fetch fatal: git checkout: la actualización de las rutas es incompatible con las ramas de conmutación. ¿Pretendes realizar el checkout 'upstream/topic/fetch' que no se puede resolver como commit? – ulu

12
git clone [email protected]:abc/def.git 
cd def 

Ahora crear una rama de seguimiento:

git branch --track experimental origin/experimental 
git checkout experimental 

Entonces, después de trabajar allí, simplemente empuje a github por

git push 
+3

git branch -t origen/experimental # no necesita escribir tanto :) – Dustin

+0

La rama de la que quiero hacer un seguimiento se llama topic/fetch. Cuando intento hacer $ git branch --track topic/fetch upstream/topic/fetch dice, fatal: No es un nombre de objeto válido: 'upstream/topic/fetch'. – ulu

+0

@Dustin, ese comando crea una rama local 'origen/experimental' que rastrea el maestro local. Supongo que es un error bastante común. – PDug

10

Para ampliar la respuesta de Kent, después de hacer su clon de la solo la rama que tendrá (los controles remotos no cuentan) es la que estuvo activa en el repositorio desde el que clonó: maestro en su caso.

Así, primero se deberá crear una nueva rama para hacer un seguimiento del control remoto rama experimental:

$ git branch experimental origin/experimental 

y luego comprobarlo:

$ git checkout experimental 

Sin embargo, Kent es correcto - estos dos comandos se pueden combinar

$ git checkout -b experimental origin/experimental