← Git

Trabajo remoto

¿Qué es una rama de seguimiento y para qué sirve la bandera `-u` al hacer push?

Ver respuesta — intenta responderla en voz alta primero

Una rama de seguimiento (tracking branch) es una rama local vinculada a una rama remota, su upstream. Ese vínculo permite usar git push y git pull sin escribir el remoto ni la rama cada vez. La bandera -u (o --set-upstream) crea ese vínculo la primera vez que subes una rama.

Cuando tu rama local sabe a qué rama remota corresponde, Git puede hacer varias cosas por ti:

  • git push sin argumentos sabe a dónde subir.
  • git pull sin argumentos sabe de dónde bajar.
  • git status te dice "estás 2 commits adelante / 1 detrás de origin/main".

Ese vínculo se llama upstream. Se establece la primera vez con git push -u origin nombre-rama. La -u es un atajo de --set-upstream: "recuerda que esta rama local sigue a esta rama remota". Después ya no hace falta repetir el remoto ni la rama.

# Primera vez que subes una rama nueva: crea el vínculo con -u
git switch -c mi-feature
git push -u origin mi-feature
# Ahora mi-feature local sigue a origin/mi-feature

# A partir de aquí, basta con:
git push          # sabe que va a origin/mi-feature
git pull          # sabe de dónde traer

# Ver qué upstream tiene cada rama
git branch -vv
# * mi-feature 1a2b3c4 [origin/mi-feature] Agrega login
#   main       5d6e7f8 [origin/main] Version inicial

# Establecer el upstream de una rama ya existente
git branch --set-upstream-to=origin/mi-feature

Olvidar la -u la primera vez y que Git responda con un error tipo "fatal: The current branch has no upstream branch", sin saber por qué. La solución es hacer git push -u origin nombre-rama la primera vez. Otro error es creer que hay que poner -u en todos los push: solo hace falta una vez, para crear el vínculo.

"Una rama de seguimiento es una rama local vinculada a una rama remota, su upstream. Ese vínculo hace que git push y git pull sepan a dónde ir sin que yo escriba el remoto y la rama cada vez, y que git status me diga cuántos commits estoy adelante o detrás. El vínculo se crea la primera vez con git push -u origin nombre-rama; la -u es --set-upstream. Después ya solo hago git push o git pull a secas."

Reto rápido

Creaste una rama local nueva feature-x y haces git push a secas. Git responde con un error de "no upstream branch". ¿Qué comando lo arregla?

Ver respuesta

git push -u origin feature-x. La rama nueva todavía no tiene un upstream (ninguna rama remota asociada), así que Git no sabe a dónde subirla. La -u (--set-upstream) crea el vínculo con origin/feature-x, y a partir de ese momento basta con git push y git pull a secas.