Arc 2 Quête 09

Les Portails Distants

Remote, push, fetch et pull

Le Maître Archiviste t'emmène dans une salle que tu n'avais jamais remarquée. Les murs sont couverts de miroirs immenses, mais chacun montre un lieu différent - une citadelle dans les montagnes, un avant-poste au bord de la mer, une bibliothèque souterraine. Au centre de chaque miroir, une lumière dorée pulse doucement.

« Apprenti, tu as appris à créer des branches, à fusionner des timelines, et à résoudre les conflits entre elles. Mais tu as toujours travaillé seul, dans ta propre citadelle. Or, les Archives de la Guilde ne vivent pas dans un seul lieu. Regarde ces miroirs - ce sont des Portails Distants. Chacun relie notre citadelle à un avant-poste de la Guilde, quelque part dans le royaume. À travers ces portails, les Archivistes envoient leurs chroniques et reçoivent celles des autres. Aujourd'hui, tu vas apprendre à maîtriser ces portails. »

Qu'est-ce qu'un remote ?

Un remote (ou dépôt distant) est un autre dépôt Git auquel le tien est connecté. C'est un portail vers une copie des Archives qui vit ailleurs - sur un serveur, sur la machine d'un collègue, ou même dans un autre dossier de ta propre machine.

Un remote est une connexion vers un autre dépôt Git. C'est le portail magique qui permet aux Archivistes de partager leurs chroniques à travers le royaume.

Quand tu as fait git clone dans la quête 04, Git a automatiquement créé un remote nommé origin qui pointait vers le dépôt source. C'était ton premier portail, même si tu ne le savais pas encore.

Lister les remotes

Pour voir quels portails sont configurés dans ton dépôt :

git remote -v

Le -v (verbose) affiche les URLs associées :

origin  /chemin/vers/depot.git (fetch)
origin  /chemin/vers/depot.git (push)

Chaque remote a deux lignes : une pour fetch (recevoir) et une pour push (envoyer). En général, elles pointent vers le même endroit.

Ajouter un remote

Pour ouvrir un nouveau portail vers un autre dépôt :

git remote add <nom> <url>

Exemple :

git remote add origin /tmp/portail-central.git

Par convention :

  • origin est le remote principal (créé automatiquement par git clone)
  • Tu peux ajouter autant de remotes que tu veux avec les noms de ton choix

Envoyer des commits : git push

Pour envoyer tes commits à travers un portail :

git push <remote> <branche>

Exemple :

git push origin main

Cela envoie tous les commits de ta branche main qui n'existent pas encore sur le remote origin.

Configurer le suivi avec -u

La première fois que tu pousses une branche, tu peux configurer le suivi (tracking) :

git push -u origin main

L'option -u (ou --set-upstream) crée un lien permanent entre ta branche locale main et la branche main du remote origin. Après cela, tu pourras simplement écrire :

git push

Sans préciser le remote ni la branche - Git saura où envoyer.

Récupérer les changements : fetch vs pull

C'est l'une des distinctions les plus importantes à comprendre.

git fetch - Observer sans toucher

git fetch <remote>

git fetch télécharge les nouveaux commits depuis le remote, mais ne modifie rien dans ton travail. Les changements sont stockés dans les branches de suivi (comme origin/main), pas dans tes branches locales.

git fetch, c'est comme regarder à travers le portail pour voir ce que les autres Archivistes ont fait, sans toucher à tes propres parchemins.

git pull - Récupérer et fusionner

git pull <remote> <branche>

git pull fait deux choses en une seule commande :

  1. git fetch - télécharge les nouveaux commits
  2. git merge - fusionne les changements dans ta branche courante

C'est comme ouvrir le portail, attraper les parchemins, et les intégrer directement dans ta chronique.

Quand utiliser l'un ou l'autre ?

Situation Commande Pourquoi
Tu veux voir ce qui a changé avant de décider git fetch Tu gardes le contrôle total
Tu veux récupérer et intégrer immédiatement git pull Plus rapide, moins de contrôle
Tu travailles sur une branche sensible git fetch + git merge Tu inspectes avant de fusionner
Tu es seul sur la branche git pull Pas de risque de conflit surprise

En règle générale : git fetch suivi d'un examen puis d'un git merge est la méthode la plus sûre. git pull est un raccourci pratique quand tu es sûr que tout ira bien.

Les branches de suivi

Quand tu fais git fetch, les commits récupérés sont stockés dans des branches de suivi (tracking branches). Ce sont des branches en lecture seule qui reflètent l'état d'un remote.

# Voir toutes les branches, y compris les branches de suivi
git branch -a

Tu verras quelque chose comme :

* main
  remotes/origin/main

origin/main vs main

  • main : ta branche locale. C'est là que tu travailles.
  • origin/main (ou remotes/origin/main) : la branche de suivi. C'est la dernière image connue de la branche main sur le remote origin.

Après un git fetch, la branche de suivi origin/main est à jour avec le remote, mais ta branche locale main n'a pas bougé. C'est à toi de décider quand fusionner.

# Voir les commits distants non encore fusionnés
git log main..origin/main --oneline

# Fusionner quand tu es prêt
git merge origin/main

Supprimer une branche distante

Si une branche n'a plus besoin d'exister sur le remote :

git push <remote> --delete <branche>

Exemple :

git push origin --delete ancienne-expedition

Cela supprime la branche sur le remote seulement. Ta branche locale n'est pas affectée.

Le workflow recommandé

Voici le flux de travail typique quand tu collabores à travers un portail :

  1. git fetch - Télécharge les nouveautés
  2. Examine - git log main..origin/main pour voir ce qui a changé
  3. Fusionne ou rebase - git merge origin/main ou git rebase origin/main
  4. Travaille - Fais tes propres commits
  5. Pousse - git push pour partager ton travail

Ce cycle se répète tout au long de la collaboration.

Exercice pratique - Le Portail Central

« Un avant-poste de la Guilde vient d'être établi : le Portail Central. Tu vas l'ouvrir, y envoyer tes chroniques, puis découvrir qu'un autre Archiviste a également contribué à travers ce même portail. À toi de récupérer son travail et de l'intégrer au tien. »

Crée un bare repo local, connecte-le comme remote, pousse tes commits, simule un deuxième Archiviste, puis récupère ses changements avec fetch et merge.

Étape 1 - Créer ton dépôt de travail

mkdir portails-distants
cd portails-distants

# Crée ton dépôt de travail
mkdir citadelle
cd citadelle
git init -b main
echo "# Chroniques de la Citadelle" > chroniques.md
git add chroniques.md
git commit -m "Fonder la chronique de la Citadelle"
cd ..

Étape 2 - Créer le Portail Central (bare repo)

git init -b main --bare portail-central.git

Étape 3 - Ouvrir le portail depuis ta citadelle

cd citadelle
git remote add origin ../portail-central.git
git remote -v
cd ..

Étape 4 - Envoyer tes chroniques

cd citadelle
git push -u origin main
cd ..

Étape 5 - Un autre Archiviste arrive

# Simuler un deuxième Archiviste
git clone portail-central.git avant-poste
cd avant-poste
echo "Rapport de l'avant-poste : tout est calme aux frontières." >> chroniques.md
git add chroniques.md
git commit -m "Ajouter le rapport de l'avant-poste"
git push origin main
cd ..

Étape 6 - Découvrir les changements (fetch)

cd citadelle
git fetch origin

# Examine ce qui a changé
git log main..origin/main --oneline

Étape 7 - Intégrer les changements (merge)

git merge origin/main

# Vérifie que le fichier contient les deux contributions
cat chroniques.md

Étape 8 - Vérification

Depuis le dossier citadelle/, lance le script de vérification :

bash verifier.sh
.\verifier.ps1

Le script vérifie :

  1. Tu es dans un dépôt Git
  2. Au moins un remote est configuré
  3. Tu as poussé au moins une fois vers un remote
  4. Tu as récupéré des changements depuis un remote

Récapitulatif des commandes

Commande Description
git remote -v Lister les remotes et leurs URLs
git remote add <nom> <url> Ajouter un nouveau remote
git push <remote> <branche> Envoyer des commits vers un remote
git push -u <remote> <branche> Pousser et configurer le suivi
git fetch <remote> Télécharger sans fusionner
git pull <remote> <branche> Télécharger et fusionner
git branch -a Voir toutes les branches (locales + suivi)
git log main..<remote>/main Voir les commits distants non fusionnés
git push <remote> --delete <branche> Supprimer une branche distante

Tu contemples les miroirs de la salle. Chaque portail brille d'une lumière constante - les connexions sont établies, les chroniques circulent librement entre ta citadelle et les avant-postes de la Guilde. Le Maître Archiviste hoche la tête avec satisfaction.

« Tu sais maintenant ouvrir des portails, envoyer tes chroniques à travers le royaume, et recevoir le travail des autres Archivistes. Tu comprends la différence entre observer et intégrer, entre fetch et pull. C'est une compétence essentielle, car un Archiviste qui travaille seul dans sa tour ne sert personne. La vraie puissance vient de la collaboration à travers les portails. »