Original article: Git Push to Remote Branch – How to Push a Local Branch to Origin
Dans sa forme la plus simple, la commande que l'on utilise pour transférer une branche locale sur un dépôt distant est git push
.
Cette commande peut cependant prendre plusieurs options et paramètres sur lesquels nous allons nous pencher dans cet article.
Transférer une branche locale Git vers Origin
Quand on utilise la commande de base git push
, Git ajoute deux paramètres par défaut : le dépôt distant sur lequel le transfert doit être effectué ainsi que la branche à transférer.
Voici la forme canonique de cette commande :
$ git push <dépôt> <branche>
Par défaut, Git utilise origin
comme dépôt distant, et votre branche active comme branche à transférer.
C'est-à-dire que si votre branche active est main
, la commande git push
équivaut à sa forme spécifiant ces deux paramètres : git push origin main
.
Prenons un exemple : le dépôt distant sur GitHub est origin
et la branche active est main
:
(main)$ git remote -v
origin git@github.com:johnmosesman/burner-repo.git (fetch)
origin git@github.com:johnmosesman/burner-repo.git (push)
(main)$ git push
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 16 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 274 bytes | 274.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
b7f661f..ab77dd6 main -> main
On voit par ce résultat que la branche locale main
a été transférée vers la branche distante main
:
To github.com:johnmosesman/burner-repo.git
b7f661f..ab77dd6 main -> main
Forcer le transfert d'une branche avec Git
En temps normal, transférer une branche revient à ajouter ses contributions (commits) à la suite de son historique de changements.
Il arrive cependant que l'on doive forcer la réécriture de l'historique de cette branche. On peut vouloir effectuer cette action pour deux raisons :
Dans le cas d'une erreur à corriger. On préférera plutôt créer une nouvelle contribution afin d'annuler ces changements.
Dans le second cas le plus fréquent d'une action telle que le rebasement qui modifie l'historique des contributions.
Voici ce que dit la documentation :
Derrière la scène, Git effectue ce rebasement en créant de nouvelles contributions et en les appliquant à la base indiquée. Il est important de noter que si la branche est similaire elle comporte en fait de toutes nouvelles contributions.
Cette action crée donc de nouvelles contributions. Cela implique que lors du transfert d'une branche rebasée localement vers le dépôt distant, celui-ci détecte que l'historique a changé et l'empêche tant que les différences ne sont pas révisées :
(ma-fonctionnalite)$ git push
To github.com:johnmosesman/burner-repo.git
! [rejected] ma-fonctionnalite -> ma-fonctionnalite (non-fast-forward)
error: failed to push some refs to 'git@github.com:johnmosesman/burner-repo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Dans ce cas, il est possible d'utiliser la commande git pull
pour fusionner ces différences. On peut sinon ajouter l'option --force
à la commande git push
s'il on veut vraiment réécrire l'historique de la branche sur ce dépôt :
(ma-fonctionnalite)$ git push --force origin ma-fonctionnalite
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 184 bytes | 184.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
+ edb64e2...52f54da ma-fonctionnalite -> ma-fonctionnalite (forced update)
(À noter : -f
est un raccourci pour --force
)
Attention cependant : forcer le transfert d'une branche est une action destructive à n'utiliser qu'en pleine conscience de ses conséquences !
Une alternative au transfert forcé
Dans certains cas, il est souhaitable de forcer le transfert d'une branche mais seulement si aucune autre contribution n'a été faite. En effet si une autre personne a créé une contribution et l'a transférée sur le dépôt distant depuis la dernière récupération, tout transfert forcé écrase ces changements.
Pour éviter ce scénario, on peut utiliser l'option --force-with-lease
.
If someone else contributes to your branch and pushes up their changes to the remote—and you force push over it—you will overwrite their changes.
Un autre extrait de la documentation :
--force-with-lease, utilisé tout seul sans plus de détails, protège toutes les références distantes en passe d'être mises à jour en vérifiant que leurs valeurs avant réécriture est la même que celles de la branche à transférer qui la cible.
En deux mots, on ordonne à Git de forcer la mise-à-jour de cette branche distante mais seulement si elle a le même aspect que la dernière fois où on a eu à faire à elle.
En cas d'une collaboration sur une branche, il est préférable d'éviter l'utilisation de --force
, ou au moins d'utiliser --force-with-lease
qui empêche la perte de changements provenant d'autres collaborateurs.
Transférer vers une branche avec un nom différent sur Git
En temps normal, une branche locale est transférée vers une branche distante du même nom, mais ce n'est pas toujours le cas !
Pour cibler une branche avec un nom différent, il suffit de spécifier la branche à transférer suivie d'un double-point (:
) puis de la branche vers laquelle la transférer.
Par exemple, voici comment faire pour transférer une branche appelée une-branche
vers ma-fonctionnalite
:
(une-branche)$ git push origin une-branche:ma-fonctionnalite
Total 0 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
+ 728f0df...8bf04ea une-branche -> ma-fonctionnalite
Transférer toutes les branches locales vers le dépôt distant
Ce n'est pas un scénario fréquent, mais Git peut dans ce cas être utilisé avec l'option --all
:
(main)$ git branch
* main
ma-fonctionnalite
(main)$ git push --all
...
To github.com:johnmosesman/burner-repo.git
b7f661f..6e36148 main -> main
* [new branch] ma-fonctionnalite -> ma-fonctionnalite
En conclusion
La commande git push
est fréquemment utilisée, et elle offre une grande quantité d'options pour modifier son comportement. Je vous encourage à lire la documentation pour les découvrir ainsi que leurs raccourcis.
Vous avez aimé ce tutoriel ? Retrouvez d'autres sujets comme celui-ci sur mon fil Twitter ainsi que sur mon site !