La commande git push est utilisée pour charger le contenu d'un dépôt local vers un dépôt distant. Le push vous permet de transférer les commits de votre dépôt local vers un dépôt distant. C'est l'équivalent de git fetch, mais à l'inverse du fetch qui importe les commits dans des branches locales, le push les exporte vers des branches distantes. Ces dernières sont configurées à l'aide de la commande git remote. Le push est susceptible d'écraser les changements. Vous devez donc prendre des précautions lorsque vous l'exécutez. Ces problèmes sont abordés ci-dessous.

Utilisation de la commande git push

git push <remote> <branch>

La commande ci-dessus fait un push de la branche spécifiée vers , avec tous les commits et objets internes nécessaires. Cela crée une branche locale dans le dépôt cible. Pour éviter toute suppression de commits, Git ne vous autorise pas à faire un push si cela engendre un merge sans fast-forward dans le dépôt cible.

git push <remote> --force

Identique à la commande ci-dessus, mais le push est forcé même s'il entraîne un merge sans fast-forward. N'utilisez pas le flag --force si vous n'êtes pas absolument sûr de ce que vous faites.

git push <remote> --all

Pushe toutes vos branches locales vers le remote spécifié.

git push <remote> --tags

Lorsque vous faites un push d'une branche ou que vous utilisez l'option --all, le push des tags n'est pas automatique. Le flag --tags envoie tous vos tags locaux vers le dépôt distant.

Discussion sur la commande git push

git push est la commande la plus couramment utilisée pour publier des changements locaux et les charger vers un dépôt centralisé. Après qu'un dépôt local a été modifié, un push est exécuté pour partager les changements avec les membres de l'équipe distants.

Utilisation de git push pour publier des changements

Le schéma ci-dessus montre ce qui arrive lorsque votre branche master locale évolue par rapport à la branche master du dépôt centralisé et que vous publiez des changements en exécutant git push origin master. Vous noterez que git push est pratiquement identique à git merge master à l'intérieur du dépôt distant.

Git push et synchronisation

git push est l'un des nombreux composants utilisés dans le processus de « synchronisation » Git global. Les commandes de synchronisation sont exécutées sur des branches distantes qui sont configurées à l'aide de la commande git remote. git push peut être considérée comme une commande de chargement, tandis que git fetch et git pull peuvent être envisagées comme des commandes de téléchargement. Une fois que les ensembles de changements ont été déplacés par une opération de chargement ou de téléchargement, vous pouvez exécuter une commande git merge dans le dépôt cible pour intégrer les changements.

Faire un push vers des dépôts bruts

Une pratique Git moderne et fréquemment utilisée consiste à faire en sorte qu'un dépôt --bare hébergé à distance agisse comme un dépôt origin centralisé. Ce dernier est souvent hébergé hors site, auprès d'un service tiers de confiance comme Bitbucket. Puisque le push altère la structure de la branche distante, il est à la fois plus sûr et plus courant de faire un push vers des dépôts créés à l'aide du flag --bare. Les dépôts bruts ne possèdent pas de répertoire de travail, de sorte que le push ne va pas altérer le contenu en cours dans le répertoire de travail. Pour en savoir plus sur la création de dépôts bruts, lisez notre tutoriel sur git init.

Push forcé

Git vous empêche d'écraser l'historique du dépôt centralisé en refusant les push requests si celles-ci entraînent un merge sans fast-forward. Par conséquent, si l'historique distant a divergé par rapport au vôtre, vous devez faire un pull de la branche distante et la merger dans votre branche locale, avant de tenter un nouveau push. Ce processus est similaire à celui de SVN lorsque vous exécutez svn update afin de synchroniser votre dépôt avec le dépôt centralisé avant de commiter un ensemble de changements.

Le flag --force outrepasse ce comportement et fait correspondre la branche du dépôt distant avec votre branche locale, supprimant au passage les changements en amont qui ont pu être effectués depuis le dernier pull. La seule situation dans laquelle vous devez faire un force push est lorsque vous vous rendez compte que les commits que vous venez de partager ne sont pas totalement corrects et que vous les avez corrigés avec git commit --amend ou un rebase interactif. Cependant, vous devez être absolument certain qu'aucun de vos coéquipiers n'a fait un pull de ces commits avant d'utiliser l'option --force.

Exemples

Git push par défaut

L'exemple suivant décrit l'une des méthodes standard pour publier des contributions locales dans le dépôt centralisé. Tout d'abord, vous devez vous assurer que votre branche master locale est à jour en faisant un fetch de la copie du dépôt centralisé et en faisant un rebase de vos changements par-dessus. Le rebase interactif est également une bonne occasion de nettoyer vos commits avant de les partager. Ensuite, la commande git push envoie tous les commits sur votre branche master locale vers le dépôt centralisé.

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

Comme nous avons déjà vérifié que la branche master locale était à jour, cette opération devrait entraîner un merge en fast-forward, et git push ne devrait pas réagir aux problèmes d'absence de fast-forward que nous avons vus plus haut.

Force push modifié

La commande git commit accepte une option --amend qui va mettre à jour le commit précédent. Un commit est souvent modifié pour mettre à jour le message de commit ou ajouter de nouveaux changements. Après la modification d'un commit, git push échoue, car Git considère le commit modifié et le commit distant comme du contenu qui a divergé. L'option --force doit être utilisée pour faire un push d'un commit modifié.

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

Les exemples ci-dessus partent du principe que la commande est exécutée sur un dépôt existant, qui dispose d'un historique des commits. git commit --amend permet de mettre à jour le commit précédent. On réalise ensuite un force push du commit modifié à l'aide de l'option --force.

Suppression d'une branche distante ou d'un tag

Parfois, il est nécessaire de nettoyer les branches à des fins d'archivage ou d'organisation. Afin de supprimer entièrement une branche, celle-ci doit être supprimée en local et à distance.

git branch -D branch_name
git push origin :branch_name

La commande ci-dessus va supprimer la branche distante appelée « branch_name ». Pour supprimer la branche distante, vous devez transmettre un nom de branche précédé d'un double point à git push.