W3docs

git push

En esta página encontrarás información útil sobre el comando git push, su uso, las opciones más comunes y consejos importantes al respecto.

Esta página explica qué hace git push, la sintaxis y las opciones más útiles, cómo funciona el push contra repositorios bare y non-bare, cómo configurar una rama upstream, cómo hacer force-push de forma segura y cómo eliminar una rama remota. Los ejemplos utilizan comandos Git y salidas reales para que puedas seguirlos paso a paso.

Definición

El comando git push sube los commits de tu repositorio local a un repositorio remoto. El push es lo opuesto del fetch: donde git fetch importa commits a tus ramas de seguimiento locales, git push exporta tus commits locales a las ramas remotas para que los colaboradores puedan verlos.

La sintaxis básica es:

git push <remote> <branch>

<remote> es el nombre del remoto (más comúnmente origin), y <branch> es la rama local cuyos commits quieres publicar.

Uso de git push

El comando git push se utiliza normalmente para publicar cambios locales en un repositorio central. Después de confirmar los cambios localmente, ejecutas git push para compartirlos con el resto del equipo. Es uno de los comandos que forman parte del flujo de trabajo de sincronización. Estos comandos operan sobre las ramas remotas configuradas con el comando git remote: los commits se suben con git push y se descargan con git fetch y git pull. Tras la descarga, git merge integra los cambios en tu rama de trabajo.

Un push exitoso imprime un resumen de lo que se transfirió. Por ejemplo, hacer push de dos nuevos commits a master tiene este aspecto:

$ git push origin master
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Writing objects: 100% (6/6), 612 bytes | 612.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To github.com:example/repo.git
   a1b2c3d..e4f5g6h  master -> master

La línea a1b2c3d..e4f5g6h master -> master confirma qué commits se movieron y que tu master local ahora coincide con el master remoto.

El siguiente diagrama muestra la progresión del master local más allá del master del repositorio central, y la publicación de esos cambios mediante git push origin master.

git push

Opciones comunes

git push <remote> <branch>Hace push de la rama especificada a <remote> con los commits necesarios, creando una rama remota en el repositorio destino.
git push <remote> --forceFuerza el push incluso si resulta en una actualización non-fast-forward. Asegúrate de que nadie ha hecho pull de los commits antes de usar la opción --force.
git push <remote> --allHace push de todas las ramas locales al repositorio remoto.
git push <remote> --tagsHace push de las etiquetas de las ramas locales al repositorio remoto. La opción --all no hace push de las etiquetas.
git push -u <remote> <branch>Hace push de la rama y la registra como rama upstream (de seguimiento), de modo que en el futuro git push y git pull pueden ejecutarse sin argumentos.
git push <remote> --force-with-leaseFuerza el push solo si la rama remota no ha avanzado desde la última vez que hiciste fetch — una alternativa más segura a --force.
git push <remote> --dry-runMuestra lo que se enviaría sin enviar nada al remoto.

Cómo hacer push a repositorios bare

Un repositorio bare es uno creado con el flag --bare (git init --bare o git clone --bare). No tiene directorio de trabajo, por lo que nadie puede editar archivos ni hacer commits directamente en él. Esto lo hace seguro para recibir pushes, razón por la que los repositorios centrales/compartidos (los alojados en un servidor o servicio como GitHub) son bare. Hacer push a un repositorio non-bare cuya rama de trabajo está activa puede entrar en conflicto con el árbol de trabajo de esa rama, motivo por el que Git rechaza dichos pushes por defecto.

# create a shared central repository
git init --bare central.git

Qué ocurre cuando se rechaza un push

Git rechaza tu push cuando la rama remota contiene commits que no tienes en local — una actualización non-fast-forward. Esto suele significar que un compañero hizo push primero. El error tiene este aspecto:

$ git push origin master
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'github.com:example/repo.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.

La solución es traer primero el trabajo remoto y luego volver a hacer push:

git pull origin master   # fetch + merge (or use --rebase)
git push origin master

Recurre a --force solo cuando quieras sobrescribir deliberadamente el historial remoto (ver más abajo) — no para saltarte esta comprobación de seguridad en ramas compartidas.

Force pushing

El flag --force sobrescribe la rama remota con la tuya local, descartando cualquier commit upstream que no hayas descargado. Úsalo solo cuando hayas reescrito intencionalmente el historial — por ejemplo, tras git commit --amend o un git rebase interactivo — y estés seguro de que nadie más ha trabajado sobre los commits que estás reemplazando. Cuando un commit se enmienda o se rebasa, su hash cambia, de modo que Git lo trata a él y al commit remoto como contenido divergente y rechaza un push normal; --force es necesario para publicar el commit reescrito.

Para ramas compartidas, prefiere --force-with-lease (explicado más abajo): rechaza sobrescribir el trabajo que el remoto recibió después de tu último fetch, por lo que no puedes destruir silenciosamente los commits de un compañero.

git push --force

# make changes to a repo and git add
git commit --amend
# update the existing commit message
git push --force origin master

Cómo eliminar una rama remota

Aquí tienes un ejemplo de cómo eliminar la rama remota. El branch_name precedido de dos puntos en git push eliminará la rama remota:

delete remote branch, git push

git branch -D branch_name
git push origin :branch_name

El comando git push origin :branch_name elimina la rama especificada (branch_name) del repositorio remoto (origin) haciendo push de una referencia vacía a ella.

Cómo funciona

  1. git push: sube los cambios de tu repositorio Git local a un repositorio remoto
  2. origin: el nombre del repositorio remoto
  3. :branch_name: un refspec que representa una referencia vacía, eliminando efectivamente la rama especificada del repositorio remoto

Así que cuando ejecutas git push origin :branch_name, Git eliminará la rama branch_name del repositorio remoto origin.

Ten en cuenta que este comando puede ser peligroso si se usa incorrectamente, ya que eliminará la rama sin ninguna confirmación ni posibilidad de recuperación. Asegúrate de verificar dos veces el nombre de la rama y de que realmente deseas eliminarla antes de ejecutar el comando.

Usa el flag -u en el primer push de una rama

Cuando tienes una rama local y quieres hacer push al repositorio remoto por primera vez, debes especificar a qué rama del repositorio remoto te refieres. En Git, el flag -u se usa con el comando git push para establecer la rama upstream de la rama actual. Al usar el flag -u, Git creará un enlace entre tu rama local y la rama remota. Este enlace es útil para simplificar los comandos git pull y git push en el futuro, ya que permite a Git recordar qué rama remota corresponde a tu rama local.

El flag -u es la forma abreviada de --set-upstream. Cuando usas este flag, normalmente lo verás así:

Use -u flag for the first push on a branch

git push -u origin your-branch-name

Después de esto, tu rama local rastrea origin/your-branch-name. A partir de ese momento puedes ejecutar git push y git pull sin argumentos adicionales mientras estés en esa rama, y git status informará cuántos commits de ventaja o desventaja tienes respecto al remoto. Consulta git branch para más información sobre ramas locales y de seguimiento remoto.

Ejemplos de flags de uso común

Aquí tienes ejemplos breves de los flags más útiles de git push.

-f (force)

git push -f origin master

Hace force-push de la rama master local a origin, sobrescribiendo cualquier commit en el master remoto que no tengas en local. -f es la forma abreviada de --force. Úsalo con precaución — puede borrar commits que otras personas subieron si están trabajando en la misma rama.

--tags

git push origin --tags

Hace push de todas tus etiquetas locales a origin. Las etiquetas marcan puntos importantes en el historial, como versiones o hitos. Un git push normal no transfiere las etiquetas, por lo que este flag (o hacer push de una etiqueta específica con git push origin <tagname>) es la forma de publicarlas. Consulta git tag para más información sobre cómo crear etiquetas.

--all

git push origin --all

Hace push de todas las ramas locales a origin con un solo comando. Ten en cuenta que --all no incluye las etiquetas — combínalo con un push separado de --tags si necesitas ambas cosas.

--dry-run

git push --dry-run origin master

Simula el push e informa sobre lo que se enviaría, sin transferir nada. Es útil para confirmar exactamente qué commits y referencias actualizará un push antes de ejecutarlo de verdad.

--force-with-lease

git push --force-with-lease origin master

Hace force-push de master a origin solo si la rama remota apunta al mismo sitio que la última vez que hiciste fetch. Si alguien ha hecho push mientras tanto, el comando se interrumpe en lugar de sobrescribir su trabajo. Esta es la alternativa más segura a -f/--force.

Práctica

Práctica
¿Qué afirmaciones son correctas respecto al comando 'git push'?
¿Qué afirmaciones son correctas respecto al comando 'git push'?
Was this page helpful?