CaenHackYouAcademy
Git

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 serveur

origin/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>.

VérificationQuestion 1 / 3

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 ?

On this page