Les dépôts distants
fetch contre pull, branches de suivi, et ce qu'un push refusé signifie.
Git est distribué : ton dépôt local contient tout l'historique, et le serveur n'a aucun privilège technique. Ce que tu appelles « le dépôt distant » est simplement un autre dépôt, dont tu gardes une copie des pointeurs.
$ git branch -a
* main ← ta branche locale
remotes/origin/main ← ce que tu SAIS de la branche du serveurorigin/main n'est pas la branche du serveur : c'est ton souvenir de son
état lors du dernier contact. Elle ne bouge que lorsque tu communiques avec le
serveur — jamais spontanément, même si quelqu'un vient de pousser.
fetch puis merge, ou pull
git fetch origin # récupère les objets, met à jour origin/main
# ton travail n'est PAS touché
git merge origin/main # intègre, maintenant que tu as regardégit pull fait exactement ces deux commandes à la suite. C'est pratique, et
c'est aussi pourquoi il surprend : il modifie ton travail avant que tu aies
vu ce qui arrivait. Le réflexe utile, quand la situation est incertaine :
fetch, puis git log HEAD..origin/main pour regarder, puis intégrer.
Ce qu'un push refusé veut dire
! [rejected] main -> main (non-fast-forward)Git dit une chose précise : le serveur a des commits que tu n'as pas. Accepter ton push les ferait disparaître. Le refus n'est pas une contrariété, c'est la protection de ce qu'un collègue a poussé entre-temps.
La réponse correcte est de récupérer d'abord — git pull --rebase pour rejouer
ton travail par-dessus, ou fetch + merge. La réponse dangereuse est
--force, qui écrase le travail du serveur.
`--force` contre `--force-with-lease`
git push --force écrase la branche distante sans condition — y compris des
commits arrivés depuis ton dernier fetch, que tu n'as jamais vus.
--force-with-lease refuse si le serveur a bougé depuis ton dernier contact :
il vérifie que tu écrases bien ce que tu crois écraser. Quand un push forcé est
légitime — après un rebase sur ta propre branche — c'est toujours
--force-with-lease.
Le piège classique
git push envoie la branche courante, pas ton dépôt. Les autres branches locales
restent chez toi tant que tu ne les pousses pas — et les étiquettes ne partent
jamais automatiquement : il faut git push --tags. C'est ainsi qu'une version
étiquetée localement reste invisible pour la chaîne de livraison qui l'attend.
Enfin, supprimer une branche locale ne la supprime pas sur le serveur. La
commande explicite est git push origin --delete <branche>.
Réponse unique
Que représente exactement la branche `origin/main` dans ton dépôt ?
Indice · Quand cette référence est-elle mise à jour ?
[ METTRE EN PRATIQUE ]
Simuler une collaboration
3 étapes · 30 min · 130 XP
[ CETTE LEÇON DANS LES PARCOURS ]
- Fondamentauxétape 5 / 18suivant — Réécrire l'histoire →
- Ingénieur DevOpsétape 8 / 23suivant — Git dans une chaîne CI/CD →