El comando git push
se utiliza para subir el contenido del repositorio local a un repositorio remoto. Con el comando
Pushing
se transfieren los commits del repositorio local a un repositorio remoto. Es la contrapartida de git fetch
, pero mientras que fetch importa los commits a las ramas locales, pushing exporta los commits a las ramas remotas. Las ramas remotas se configuran con el comando git remote
. El empuje tiene el potencial de sobrescribir los cambios, se debe tener cuidado al empujar. Estos problemas se discuten a continuación.
Uso de Git push
git push <remote> <branch>
Pulsar la rama especificada a , junto con todos los commits y objetos internos necesarios. Esto crea una rama local en el repositorio de destino. Para evitar que sobrescribas commits, Git no te dejará hacer un push cuando resulte en una fusión no rápida en el repositorio de destino.
git push <remote> --force
Igual que el comando anterior, pero forzando el push incluso si resulta en una fusión no rápida. No use la bandera --force
a menos que esté absolutamente seguro de que sabe lo que está haciendo.
git push <remote> --all
Empuje todas sus ramas locales a la remota especificada.
git push <remote> --tags
Las etiquetas no se empujan automáticamente cuando se empuja una rama o se utiliza la opción --all
. La bandera --tags
envía todas tus etiquetas locales al repositorio remoto.
Discusión sobre Git push
git push
se utiliza más comúnmente para publicar una subida de cambios locales a un repositorio central. Después de modificar un repositorio local se ejecuta un push para compartir las modificaciones con los miembros del equipo remoto.
El diagrama anterior muestra lo que ocurre cuando tu master
local ha pasado el master
del repositorio central y publicas los cambios ejecutando git push origin master
. Fíjate en que git push
es esencialmente lo mismo que ejecutar git merge master
desde dentro del repositorio remoto.
git push
es un componente de los muchos que se utilizan en el proceso general de «sincronización» de Git. Los comandos de sincronización operan sobre ramas remotas que se configuran mediante el comando git remote
git push
puede considerarse un comando de «subida» mientras que, git fetch
y git pull
pueden considerarse comandos de «descarga». Una vez que los conjuntos de cambios se han movido a través de una descarga o una subida, se puede realizar un git merge
en el destino para integrar los cambios.
Empujar a los repositorios desnudos
Una práctica moderna y frecuentemente utilizada de Git es tener un repositorio alojado remotamente --bare
que actúe como repositorio de origen central. Este repositorio de origen suele estar alojado fuera de las instalaciones de un tercero de confianza como Bitbucket. Dado que empujar desordena la estructura de la rama remota, es más seguro y más común empujar a los repositorios que han sido creados con la bandera --bare
. Los repositorios desnudos no tienen un directorio de trabajo, por lo que un push no alterará ningún contenido del directorio de trabajo en curso. Para más información sobre la creación de repositorios desnudos, lee sobre git init
.
Forzar el empuje
Git evita que se sobrescriba el historial del repositorio central rechazando las peticiones push cuando resultan en una fusión no rápida. Así que, si el historial remoto ha divergido de tu historial, tienes que tirar de la rama remota y fusionarla con la local, y luego intentar empujar de nuevo. Esto es similar a cómo SVN hace que se sincronice con el repositorio central a través de svn update
antes de confirmar un conjunto de cambios.
La bandera --force
anula este comportamiento y hace que la rama del repositorio remoto coincida con la local, eliminando cualquier cambio de aguas arriba que pueda haber ocurrido desde la última extracción. La única vez que debería necesitar forzar el push es cuando se da cuenta de que los commits que acaba de compartir no eran del todo correctos y los arregla con un git commit --amend
o un rebase interactivo. Sin embargo, debes estar absolutamente seguro de que ninguno de tus compañeros de equipo ha sacado esos commits antes de usar la opción --force
.
Git push por defecto
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 maestro local está actualizado, recuperando la copia del repositorio central y volviendo a basar tus cambios sobre ellos. El rebase interactivo es también una buena oportunidad para limpiar sus confirmaciones antes de compartirlas. Entonces, el comando git push
envía todos los commits de tu master local al repositorio central.
git checkout master
git fetch origin master
git rebase -i origin/master
# Squash commits, fix up commit messages etc.
git push origin master
Dado que ya nos hemos asegurado de que el maestro local estaba actualizado, esto debería resultar en una fusión rápida, y git push
no debería quejarse de ninguno de los problemas no rápidos comentados anteriormente.
Forzar push modificado
El comando git commit
acepta una opción --amend
que actualizará el commit anterior. Una confirmación se modifica a menudo para actualizar el mensaje de confirmación o añadir nuevos cambios. Una vez que se modifica un commit, un git push
fallará porque Git verá el commit modificado y el commit remoto como contenido divergente. La opción --force
debe utilizarse para empujar un commit modificado.
# make changes to a repo and git add
git commit --amend
# update the existing commit message
git push --force origin master
El ejemplo anterior supone que se está ejecutando en un repositorio existente con un historial de commits. git commit --amend
se utiliza para actualizar el commit anterior. El commit modificado es entonces forzado a ser empujado usando la opción --force
.
Eliminación de una rama o etiqueta remota
A veces las ramas necesitan ser limpiadas por motivos de contabilidad o de organización. Para eliminar completamente una rama, hay que borrarla localmente y también remotamente.
git branch -D branch_name
git push origin :branch_name
Lo anterior borrará la rama remota llamada nombre_de_rama pasando un nombre de rama prefijado con dos puntos a git push
borrará la rama remota.