Original article: Git Push to Remote Branch – How to Push a Local Branch to Origin

El comando básico para cargar o subir una rama local a un repositorio remoto es git push.

Este comando tiene una variedad de opciones y parámetros que puedes pasarle, y en este artículo aprenderás los que usarás más a menudo.

Cómo subir una rama local de Git al origen (origin)

Si ejecutas el comando simple git push, por defecto, Git elegirá dos parámetros más por ti: el repositorio remoto y la rama a la que subir.

La forma general del comando es esta:

$ git push <remote> <branch>
remote: repositorio remoto / branch: rama

Por defecto, Git elige origin como remoto y tu rama actual como la rama a la que subir.

Si tu rama actual es main, el comando git push suministrará los dos parámetros por defecto — ejecutándolo así git push origin main.

En el ejemplo de abajo, el remoto  origin es un repositorio de GitHub, y la rama actual es main:

(main)$ git remote -v 
origin  git@github.com:johnmosesman/burner-repo.git (fetch)
origin  git@github.com:johnmosesman/burner-repo.git (push)

(main)$ git push
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 16 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 274 bytes | 274.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
   b7f661f..ab77dd6  main -> main

De la salida se puede ver que la rama local  main fue subida a la rama remota  main:

To github.com:johnmosesman/burner-repo.git
   b7f661f..ab77dd6  main -> main

Cómo forzar la subida a una rama en Git

Normalmente, subirás una rama y añadirás a su historial de confirmaciones.

Sin embargo, hay ocasiones en las que es necesario sobrescribir a la fuerza el historial de una rama.

Hay un par de razones por las que puedes querer hacer esto.

La primera razón es para corregir un error - aunque probablemente sea mejor hacer una nueva confirmación que revierta los cambios (git revert).

El segundo y más común escenario es después de una acción como un rebase, que cambia el historial de confirmaciones:

Internamente, Git [hace un rebase] creando nuevas confirmaciones y aplicándolas a la base especificada. Es muy importante entender que, aunque la rama parece la misma, se compone de nuevas confirmaciones por completo.

Un rebase crea confirmaciones completamente nuevas.

Esto significa que si intentas cargar una rama que ha sido rebasada localmente - pero no en el remoto - el repositorio remoto reconocerá que el historial de confirmaciones ha cambiado, y te impedirá subir los cambios hasta que arregles las diferencias:

(my-feature)$ git push
To github.com:johnmosesman/burner-repo.git
 ! [rejected]        my-feature -> my-feature (non-fast-forward)
error: failed to push some refs to 'git@github.com:johnmosesman/burner-repo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Puedes hacer un git pull para fusionar las diferencias, pero si realmente quieres sobrescribir el repositorio remoto puedes añadir la marca --force :

(my-feature)$ git push --force origin my-feature
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 184 bytes | 184.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
 + edb64e2...52f54da my-feature -> my-feature (forced update)

(Nota: puedes usar la versión abreviada -f en vez de  --force.)

Una subida forzada es una acción destructiva - úsala solo cuando tengas la certeza de que es lo que quieres hacer.

Forzar la subida con contrato (--force-with-lease)

A veces puedes querer forzar la subida - pero solo si nadie más ha contribuido a la rama.

Si alguien más contribuye a tu rama y empuja sus cambios a la remota - y tú fuerzas, tu subida sobre ella - sobrescribirás sus cambios.

Para evitar este escenario, puedes utilizar la opción --force-with-lease.

De nuevo de la documentación oficial en inglés:

--force-with-lease solo, sin especificar los detalles, protegerá todas las referencias remotas que vayan a ser actualizadas requiriendo que su valor actual sea el mismo que la rama de seguimiento remoto que tenemos para ellas.

Básicamente, le estás diciendo a Git que fuerce la actualización de esta rama solo si tiene el mismo aspecto que la última vez que la viste.

Si está colaborando con otros en tu rama, sería bueno evitar usar --force o al menos usar --force-with-lease para evitar perder los cambios que otros colaboradores han hecho.

Cómo subir cambios a una rama con diferente nombre en Git

Normalmente, subirás tu rama local a una rama remota con el mismo nombre - pero no siempre.

Para subir a una rama con un nombre diferente, necesitas especificar la rama de la que quieres subir los cambios (nombre de la rama local) y el nombre de la rama a la que quieres subir (nombre de la rama remota) separadas con dos puntos (:).

Por ejemplo, si quieres subir de una rama llamada some-branch a my-feature:

(some-branch)$ git push origin some-branch:my-feature
Total 0 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
 + 728f0df...8bf04ea some-branch -> my-feature
some-branch: alguna-rama; my-feature: mi-funcionalidad

Cómo subir todas las ramas locales al remoto

No necesitarás subir todas las ramas de tu local muy a menudo, pero si lo haces puedes hacerlo añadiendo la marca --all:

(main)$ git branch
* main
  my-feature

(main)$ git push --all
...
To github.com:johnmosesman/burner-repo.git
   b7f661f..6e36148  main -> main
 * [new branch]      my-feature -> my-feature

Conclusión

El comando git push es uno de los que más a menudo vas a utilizar, y hay un montón de opciones que se pueden utilizar con él. Te animo a leer la documentación oficial, para encontrar más opciones y atajos útiles.

Si te ha gustado este tutorial, también hablo de temas como este en Twitter, y escribo sobre ellos en mi página web.