git push
El comando git push
se usa para cargar contenido del repositorio local a un repositorio remoto. El envío es la forma de transferir confirmaciones desde tu repositorio local a un repositorio remoto. Es el equivalente a git fetch, pero mientras que al recuperar se importan las confirmaciones a ramas locales, al enviar estas se exportan a ramas remotas. Las ramas remotas se configuran mediante el comando git remote. Los envíos pueden sobrescribir los cambios, por lo que se debe tener cuidado a la hora de realizarlos. Estas incidencias se describen a continuación.
Uso de git push
git push <remote> <branch>
Envía la rama especificada, junto con todas las confirmaciones y objetos internos necesarios. De este modo se crea una rama local en el repositorio de destino. Para evitar que se sobrescriban las confirmaciones, Git no te permitirá enviarlas 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.
Envía todas tus ramas locales a una rama remota especificada.
git push <remote> --tags
Material relacionado
Git log avanzado
VER LA SOLUCIÓN
Aprende a usar Git con Bitbucket Cloud
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 al repositorio remoto.
Análisis de git push
git push
se usa sobre todo para publicar y cargar cambios locales a un repositorio central. Después de modificar el repositorio local, se ejecuta un envío para compartir las modificaciones con los miembros remotos del equipo.
El diagrama anterior muestra lo que pasa cuando el progreso de tu rama principal
local ha sobrepasado a la rama principal
del repositorio central y publicas los cambios ejecutando git push origin main
. Fíjate en que ejecutar git push
es en esencia lo mismo que ejecutar git merge main
desde el repositorio remoto.
Git push y la sincronización
git push
es uno de los muchos componentes que se usan en el proceso general de "sincronización" de Git. Los comandos de sincronización funcionan en ramas remotas que se configuran mediante el comando git remote. A git push
se le puede considerar un comando de carga, mientras que, a git fetch y a git pull, comandos de descarga. Una vez movidos los conjuntos de cambios mediante una descarga o una carga, se puede ejecutar un comando git merge en el destino para integrarlos.
Envíos a repositorios bare
Una práctica de Git moderna y que se usa muy a menudo consiste en contar con un repositorio --bare
alojado de forma remota que actúa como un repositorio de origen central. Este repositorio de origen se suele alojar fuera de las instalaciones en un tercero fiable, por ejemplo, Bitbucket. Como los envíos interfieren en la estructura de la rama remota, lo más seguro y común es enviar a repositorios creados con la marca --bare
. Los repositorios bare no tienen un directorio en funcionamiento, por lo que un envío no alterará el trabajo en curso sobre el contenido de un directorio en funcionamiento. Para obtener más información sobre la creación de repositorios bare, consulta la sección sobre git init.
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
anula este comportamiento y hace que la rama del repositorio remoto coincida con la local, y se eliminan así todos los cambios en el repositorio remoto que se hayan producido desde que realizaste la última incorporación de cambios. La única situación en la que podrías tener que forzar el envío es cuando te das cuenta de que las confirmaciones que acabas de compartir no están del todo bien y las corriges mediante un comando git commit --amend
o una fusión mediante cambio de base interactiva. No obstante, antes de usar la opción --force
, debes tener la certeza absoluta de que ninguno de tus compañeros de equipo ha incorporado los cambios de esas confirmaciones.
Ejemplos
Comando git push predeterminado
El siguiente ejemplo describe uno de los métodos estándar para publicar contribuciones locales en el repositorio central. En primer lugar, se asegura de que tu rama principal local está actualizada; para ello, recupera la copia del repositorio central y fusiona los cambios sobre esa base. La fusión mediante cambio de base interactiva también constituye una buena oportunidad para limpiar tus confirmaciones antes de compartirlas. Acto seguido, el comando git push
envía todas las confirmaciones de tu rama principal 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 principal 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 las incidencias de la falta de avance rápido analizados anteriormente.
Envío forzado corregido
El comando git commit admite una opción --amend
que actualizará la confirmación anterior. Las confirmaciones suelen corregirse para actualizar el mensaje que contienen o añadir cambios nuevos. En cuanto se corrige una confirmación, git push
da un fallo porque Git contempla tanto la confirmación corregida como la remota como contenido divergente. Hay que usar la opción --force
para enviar una confirmación corregida.
# make changes to a repo and git add
git commit --amend
# update the existing commit message
git push --force origin main
El ejemplo anterior presupone que se está ejecutando en un repositorio existente con un historial de confirmaciones. El comando git commit --amend
sirve para actualizar la confirmación anterior. Acto seguido, la confirmación corregida 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
.
Compartir este artículo
Tema siguiente
Lecturas recomendadas
Consulta estos recursos para conocer los tipos de equipos de DevOps o para estar al tanto de las novedades sobre DevOps en Atlassian.