git: cambiar de rama sin separar la cabeza

102

Tengo un repositorio en github con una rama principal (maestra) y una rama para algún trabajo experimental. Hice algunas confirmaciones y empujé a la rama experimental y todo estuvo bien.

Ahora, en una máquina diferente, trato de clonar mi repositorio (git clone repository ) y luego cambio a la rama experimental (git checkout branchname ) pero cada vez que hago esto, mi cabeza se desprende y no puedo presionar mis cambios. ¿Qué estoy haciendo mal? Tengo 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 soy un idiota, pero no puedo encontrar nada en los documentos que me ayude a volver a unir mi cabeza.

EDITAR

El concepto de rama de seguimiento es lo que me faltaba. Ahora que asimilo ese concepto, todo está claro. Personalmente, encuentro que la git branch --tracksintaxis es mucho más intuitiva que git checkout -b branch-name origin/branch-name.

¡Gracias por la ayuda!

Dana Robinson
fuente
Para cambiar de rama sin separar la cabeza, con Git 2.23 (agosto de 2019), use git switch: vea mi respuesta a continuación .
VonC

Respuestas:

115
# 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, puede usar la misma cadena para localname y branchname.
Cuando realizó el check out origin/branchname, en realidad no estaba revisando una sucursal. origin/branchnamees un nombre "remoto" y puedes obtener una lista con

branch -a 

Si tiene los colores habilitados, las sucursales locales serán de un color y las remotas de otro.

Primero debe hacer un seguimiento local de una sucursal remota para poder cambiar y trabajar en ella.

Kent Fredric
fuente
9
Hombre, ¿por qué "git checkout origin / branchname" no comienza a rastrear la rama automáticamente si aún no se rastrea?
Martin Konicek
4
porque todavía necesita un nombre local para la sucursal extranjera.
Kent Fredric
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 rutas es incompatible con el cambio de ramas. ¿Tenía la intención de verificar 'upstream / topic / fetch' que no se puede resolver como confirmación?
ulu
2
Gracias por el consejo sobre colores. Para habilitar los colores:git config --global --add color.ui true
PonyEars
1
Vale la pena señalar que "origen / nombre de rama" puede ser literalmente cualquier cosa que se resuelva en un SHA1, o un SHA1 en sí mismo =). Lo uso regularmente para crear ramas arbitrarias con raíces arbitrarias.
Kent Fredric
16
git clone [email protected]:abc/def.git
cd def

Ahora crea una rama de seguimiento:

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

Luego, después de trabajar allí, simplemente presione a github por

git push
Christoph Rüegg
fuente
3
git branch -t origin / experimental # no es necesario escribir tanto :)
Dustin
La rama que quiero rastrear 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
1
@Dustin, ese comando crea una rama local 'origen / experimental' que rastrea al maestro local. Supongo que es un error bastante común.
PDug
1
@PDug% git checkout -t origin / experimental Configuración experimental de rama para rastrear la rama remota experimental desde el origen mediante rebase. Cambiado a una nueva rama 'experimental'
Dustin
11

Para ampliar la respuesta de Kent, después de hacer su clonación, la única rama que tendrá (los controles remotos no cuentan) es la que estaba activa en el repositorio desde el que clonó, maestra en su caso.

Entonces, primero querrá crear una nueva rama para rastrear la rama experimental remota:

$ git branch experimental origin/experimental

y luego compruébalo:

$ git checkout experimental

Sin embargo, Kent tiene razón: estos dos comandos se pueden combinar

$ git checkout -b experimental origin/experimental
Pat Notz
fuente
3

Con Git 2.23 (agosto de 2019), usaría el git switchcomando

Si tiene una sucursal remota con el mismo nombre, se rastreará automáticamente:

$ git switch new-topic
Branch 'new-topic' set up to track remote branch 'new-topic' from 'origin'
Switched to a new branch 'new-topic'
VonC
fuente