Uso de git push

git push <remote> <branch>

Envía la rama especificada a una , junto con todos los commits y objetos internos necesarios. De este modo se crea una rama local en el repositorio de destino. Para evitar que se sobrescriban los commits, Git no te permitirá enviarlos cuando el resultado en el repositorio de destino sea una fusión sin avance rápido.

git push <remote> --force

Es igual que el comando anterior, pero fuerza el envío incluso si el resultado es una fusión sin avance rápido. No uses la marca --force a menos de que tengas absoluta certeza de lo que estás haciendo.

git push <remote> --all

Envía todas tus ramas locales a una rama remota especificada.

git push <remote> --tags

Las etiquetas no se envían automáticamente cuando envías una rama o usas la opción --all. La marca --tags envía todas las etiquetas locales a un repositorio remoto.

Análisis de git push

git push se suele usar para publicar y cargar cambios locales a un repositorio central. Después de modificar el repositorio local, se ejecuta un comando push para compartir las modificaciones con miembros remotos del equipo.

Uso de git push para publicar cambios

El diagrama anterior muestra lo que pasa cuando el progreso de tu rama master local ha sobrepasado a la rama master del repositorio central y publicas los cambios mediante la ejecución de un comando git push origin master. Fíjate en que ejecutar git push es similar en su esencia a ejecutar git merge master desde el repositorio remoto.

Git push y la sincronización

Envíos a repositorios bare

Envío forzado

Git evita que sobrescribas el historial del repositorio central al negarse a enviar solicitudes cuando el resultado es una fusión sin avance rápido. De este modo, si el historial remoto difiere de tu historial, tendrás que incorporar una rama remota y fusionarla con la local para después intentar enviarla de nuevo. Este proceso es similar a la forma en la que SVN realiza la sincronización con el repositorio central mediante el comando svn update antes de confirmar un conjunto de cambios.

La marca --force sobrescribe este comportamiento y hace que la rama del repositorio remoto coincida con la local, además de que elimina todos los cambios de nivel superior que se hayan producido desde que realizaste la última incorporación. La única situación en la que deberías requerir un envío forzado es cuando te das cuenta de que los commits que acabas de compartir no están del todo bien y los corriges con un comando git commit --amend o con una reorganización interactiva. No obstante, debes estar absolutamente seguro de que ninguno de tus compañeros de equipo ha incorporado esos commits antes de usar la opción --force.

Ejemplos

Comando git push predeterminado

El siguiente ejemplo describe uno de los métodos estándar para publicar contribuciones locales al repositorio central. En primer lugar, se asegura de que tu rama maestra local está actualizada al recuperar la copia del repositorio central y reorganizar tus cambios sobre esa base. La reorganización interactiva también constituye una buena oportunidad para limpiar tus commits antes de compartirlos. A continuación, el comando git push envía todos los commits de tu rama maestra local al repositorio central.

git checkout main
git fetch origin main
git rebase -i origin/main
# Squash commits, fix up commit messages etc.
git push origin main

Como ya nos hemos asegurado de que la rama maestra local está actualizada, esta acción debería generar una fusión con avance rápido, y el comando git push no debería realizar ningún bloqueo debido a los problemas de la falta de avance rápido analizados anteriormente.

Envío forzado corregido

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

El ejemplo anterior asume que se está ejecutando en un repositorio existente con un historial de commits. git commit --amend se usa para actualizar el commit anterior. A continuación, el commit corregido se envía de forma forzada mediante la opción --force.

Eliminación de una rama o etiqueta remotas

En ocasiones, se deben limpiar las ramas por motivos de organización y mantenimiento de registros. Para eliminar una rama por completo, se debe eliminar tanto de forma local como de forma remota.

git branch -D branch_name
git push origin :branch_name

La opción anterior eliminará la rama remota denominada branch_name al pasar un nombre de rama con dos puntos como prefijo por el comando git push.