W3docs

git push

Découvrez la commande git push, sa syntaxe, ses options les plus utiles et des conseils importants pour l'utiliser efficacement.

Cette page explique ce que fait git push, sa syntaxe et ses options les plus utiles, comment fonctionne le push vers des dépôts bare et non-bare, comment définir une branche amont, comment forcer un push en toute sécurité, et comment supprimer une branche distante. Les exemples utilisent des commandes et des sorties Git réelles pour vous permettre de les reproduire.

Définition

La commande git push envoie les commits de votre dépôt local vers un dépôt distant. Le push est l'opération inverse du fetch : là où git fetch importe des commits dans vos branches de suivi locales, git push exporte vos commits locaux vers les branches distantes afin que vos collaborateurs puissent les voir.

La syntaxe de base est :

git push <remote> <branch>

<remote> est le nom du dépôt distant (le plus souvent origin), et <branch> est la branche locale dont vous souhaitez publier les commits.

Utilisation de git push

La commande git push est couramment utilisée pour publier des modifications locales vers un dépôt central. Après avoir effectué des commits localement, vous exécutez git push pour les partager avec le reste de l'équipe. C'est l'une des commandes impliquées dans le flux de travail de synchronisation. Ces commandes opèrent sur les branches distantes configurées avec la commande git remote : les commits sont envoyés avec git push et téléchargés avec git fetch et git pull. Après le téléchargement, git merge intègre les modifications dans votre branche de travail.

Un push réussi affiche un résumé de ce qui a été transféré. Par exemple, pousser deux nouveaux commits vers master ressemble à ceci :

$ 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 ligne a1b2c3d..e4f5g6h master -> master confirme quels commits ont été transférés et que votre master local correspond désormais au master distant.

Le diagramme suivant montre la progression de la branche master locale au-delà du master du dépôt central, ainsi que la publication de ces modifications en invoquant git push origin master.

git push

Options courantes

git push <remote> <branch>Pousse la branche spécifiée vers <remote> avec les commits nécessaires, créant une branche distante dans le dépôt de destination.
git push <remote> --forceForce le push même s'il entraîne une mise à jour non-fast-forward. Assurez-vous que personne n'a récupéré les commits avant d'utiliser l'option --force.
git push <remote> --allPousse toutes les branches locales vers le dépôt distant.
git push <remote> --tagsPousse les tags des branches locales vers le dépôt distant. L'option --all ne pousse pas les tags.
git push -u <remote> <branch>Pousse la branche et l'enregistre comme branche amont (tracking), afin que les futurs git push et git pull puissent être exécutés sans arguments.
git push <remote> --force-with-leaseForce le push uniquement si la branche distante n'a pas bougé depuis votre dernier fetch — une alternative plus sûre à --force.
git push <remote> --dry-runAffiche ce qui serait poussé sans rien envoyer au dépôt distant.

Comment pousser vers des dépôts bare

Un dépôt bare est un dépôt créé avec l'option --bare (git init --bare ou git clone --bare). Il n'a pas de répertoire de travail, donc personne ne peut modifier des fichiers ni effectuer de commits directement dedans. Cela le rend sûr pour recevoir des pushs, c'est pourquoi les dépôts centraux/partagés (ceux hébergés sur un serveur ou un service comme GitHub) sont bare. Pousser vers un dépôt non-bare dont la branche de travail est extraite peut entrer en conflit avec l'arbre de travail de cette branche, c'est pourquoi Git refuse de tels pushs par défaut.

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

Que se passe-t-il lorsqu'un push est rejeté

Git refuse votre push lorsque la branche distante contient des commits que vous n'avez pas localement — une mise à jour non-fast-forward. Cela signifie généralement qu'un coéquipier a poussé en premier. L'erreur ressemble à ceci :

$ 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 solution consiste à récupérer d'abord le travail distant, puis à pousser à nouveau :

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

N'utilisez --force que lorsque vous souhaitez délibérément écraser l'historique distant (voir ci-dessous) — et non pour contourner cette vérification de sécurité sur les branches partagées.

Forcer le push

L'option --force écrase la branche distante avec votre branche locale, en supprimant tous les commits amont qui n'ont pas été récupérés. Utilisez-la uniquement lorsque vous avez intentionnellement réécrit l'historique — par exemple après git commit --amend ou un git rebase interactif — et que vous êtes certain que personne d'autre n'a construit sur les commits que vous remplacez. Lorsqu'un commit est amendé ou rebasé, son hash change, donc Git le traite et le commit distant comme du contenu divergent et refuse un push normal ; --force est nécessaire pour publier le commit réécrit.

Pour les branches partagées, préférez --force-with-lease (traité ci-dessous) : cette option refuse d'écraser le travail que la branche distante a reçu depuis votre dernier fetch, vous ne pouvez donc pas silencieusement détruire les commits d'un coéquipier.

git push --force

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

Comment supprimer une branche distante

Voici un exemple de suppression d'une branche distante. Le branch_name précédé d'un deux-points dans la commande git push supprimera la branche distante :

delete remote branch, git push

git branch -D branch_name
git push origin :branch_name

La commande git push origin :branch_name supprime la branche spécifiée (branch_name) du dépôt distant (origin) en lui poussant une référence vide.

Comment ça fonctionne

  1. git push : pousser les modifications de votre dépôt Git local vers un dépôt distant
  2. origin : le nom du dépôt distant
  3. :branch_name : un refspec qui représente une référence vide, supprimant effectivement la branche spécifiée du dépôt distant

Ainsi, lorsque vous exécutez git push origin :branch_name, Git supprimera la branche branch_name du dépôt distant origin.

Notez que cette commande peut être dangereuse si elle est utilisée incorrectement, car elle supprimera la branche sans aucune confirmation ni possibilité de récupération. Assurez-vous de vérifier le nom de la branche et de bien vouloir la supprimer avant d'exécuter la commande.

Utiliser le flag -u pour le premier push sur une branche

Lorsque vous avez une branche locale et que vous souhaitez la pousser vers le dépôt distant pour la première fois, vous devez spécifier quelle branche du dépôt distant vous visez. Dans Git, le flag -u est utilisé avec la commande git push pour définir la branche amont de la branche courante. Lorsque vous utilisez le flag -u, Git crée un lien entre votre branche locale et la branche distante. Ce lien est utile pour simplifier les commandes git pull et git push à l'avenir, car il permet à Git de se souvenir quelle branche distante correspond à votre branche locale.

Le flag -u est l'abréviation de --set-upstream. Lorsque vous utilisez ce flag, vous le verrez généralement utilisé ainsi :

Use -u flag for the first push on a branch

git push -u origin your-branch-name

Après cela, votre branche locale suit origin/your-branch-name. Dès lors, vous pouvez exécuter git push et git pull sans arguments supplémentaires tant que vous êtes sur cette branche, et git status indiquera de combien de commits vous êtes en avance ou en retard par rapport au dépôt distant. Consultez git branch pour en savoir plus sur les branches locales et de suivi distant.

Exemples de flags couramment utilisés

Voici de courts exemples des flags git push les plus utiles.

-f (force)

git push -f origin master

Force le push de la branche master locale vers origin, en écrasant tous les commits sur le master distant que vous n'avez pas localement. -f est la forme abrégée de --force. Utilisez-le avec précaution — il peut effacer des commits que d'autres personnes ont poussés si elles travaillent sur la même branche.

--tags

git push origin --tags

Pousse tous vos tags locaux vers origin. Les tags marquent des points importants de l'historique, comme des versions ou des jalons. Un git push normal ne transfère pas les tags, donc ce flag (ou pousser un tag spécifique avec git push origin <tagname>) est la façon de les publier. Consultez git tag pour en savoir plus sur la création de tags.

--all

git push origin --all

Pousse toutes les branches locales vers origin en une seule commande. Notez que --all n'inclut pas les tags — combinez-le avec un push --tags séparé si vous avez besoin des deux.

--dry-run

git push --dry-run origin master

Simule le push et rapporte ce qui serait envoyé, sans rien transférer. Utile pour confirmer exactement quels commits et refs un push mettra à jour avant de l'exécuter pour de vrai.

--force-with-lease

git push --force-with-lease origin master

Force le push de master vers origin uniquement si la branche distante pointe toujours là où elle pointait lors de votre dernier fetch. Si quelqu'un a poussé entre-temps, la commande s'interrompt au lieu d'écraser son travail. C'est l'alternative plus sûre à -f/--force.

Pratique

Pratique
Lesquelles de ces affirmations sont vraies concernant la commande 'git push' ?
Lesquelles de ces affirmations sont vraies concernant la commande 'git push' ?
Was this page helpful?