git add enregistre le fichier dans l'historique.
git add enregistre le fichier dans l'historique.
Faux : add remplit l'index ; c'est commit qui écrit l'historique.
Expliquez ce qu'est l'index.
git add f copie l'état actuel de f dans l'index ; git commit enregistre l'index, pas vos fichiers ;add n'est donc pas dans le commit, tant qu'on ne refait pas add ;git add -p) ;git restore --staged f retire f de l'index, sans toucher au fichier. Juste après un
git add, git diff n'affiche rien : working tree et index sont égaux. C'est git diff --staged qui montre ce que le commit contiendra.
Expliquez le trio working tree, index, HEAD.
Presque toutes les commandes de GIT1 déplacent des choses entre ces trois cases. Quand une commande vous surprend, demandez-vous laquelle elle vient de toucher.
Que vous dit git status ?
git status$ git status
On branch main ← la branche courante
Changes to be committed: ← dans l'index : partira au prochain commit
modified: README.md
Changes not staged for commit: ← modifié, mais pas encore "add"
modified: recettes/crepes.md
Untracked files: ← git ne connaît pas ce fichier
notes.tmp
git status compare les trois cases du trio et vous dit ce qui diffère ;git status -s en tient sur deux colonnes : l'index à gauche, le working tree à droite (M, A, ??). Le réflexe :
git status avant et après chaque commande, et git diff --staged avant chaque git commit.
git commit sans add préalable n'enregistre rien de nouveau.
git commit sans add préalable n'enregistre rien de nouveau.
Vrai : le commit enregistre l'index ; rien d'indexé, « nothing to commit ».
À quoi sert le fichier .gitignore ?
.gitignore : ce qu'on ne versionne pas__pycache__/
.venv/
.env
*.png
!logo.png
git status ; Un
.env déjà commité ne disparaît pas en l'ajoutant au .gitignore : il reste suivi (git rm --cached .env), et surtout il reste dans l'historique. Une clé publiée est une clé à changer.
Vrai ou faux : une branche est une copie du projet.
Puis expliquez ce qu'est une branche pour git.
┌─ garniture
▼
a7d3639 ← 7ac8892 ← 093450a ← a9bfd1f ← 12ed6ff
▲
└─ main ◀── HEAD
.git/refs/heads/ : le hash d'un commit ; elle avance à chaque commit ;HEAD dit sur quelle branche vous êtes ; git switch <b> le déplace, et les fichiers suivent ;git switch -c <b> crée et y va ; git branch -d <b> supprime (refuse si non fusionnée) ;git switch --detach <hash> : HEAD détachée, pour regarder le passé ; switch -c pour garder ce qu'on y a fait. Une branche coûte 41 octets : aucune raison de s'en priver, une par idée, par essai, par bug.
git merge garniture crée parfois un nouveau commit, parfois aucun. Expliquez pourquoi.
Fast-forward : main n'a pas bougé depuis la création de la branche ; git avance le pointeur, aucun commit créé.
avant : … ← a9bf (main) ← 12ed (garniture)
après : … ← a9bf ← 12ed (main, garniture)
Merge commit : les deux branches ont avancé ; git crée un commit à deux parents, en comparant à l'ancêtre commun.
* fcd6 Merge branch 'sauce'
|\
| * 1782 Annonce la section sauces
* | 12ed Ajoute les garnitures
|/
* 0934 Ajoute la tarte
Seule la branche courante bouge :
git merge sauce depuis main fait avancer main, jamais sauce.
Un merge fast-forward crée un commit.
Un merge fast-forward crée un commit.
Faux : le pointeur avance, aucun commit n'est créé.
Expliquez ce qu'est un conflit.
Un conflit survient quand les deux branches ont modifié les mêmes lignes depuis leur ancêtre commun. Git ne devine pas : il fusionne tout le reste, et vous laisse trancher ce bloc-là.
<<<<<<< HEAD
Cuisson : 3 min par face, à feu vif. ← votre branche
=======
Cuisson : 1 min 30 par face. ← la branche fusionnée
>>>>>>> cuisson
Deux branches qui modifient le même fichier à cent lignes d'écart ne sont pas en conflit : git raisonne par zones de lignes, pas par fichier.
Deux branches qui modifient le même fichier sont forcément en conflit.
Deux branches qui modifient le même fichier sont forcément en conflit.
Faux : seulement si elles touchent les mêmes lignes : git raisonne par zones, pas par fichier.
Comment sort-on d'un conflit ?
git add <fichier> : « c'est réglé » ;git commit : le message « Merge branch … » est pré-rempli. Tant que vous n'avez pas fait
git add + git commit, vous restez « en cours de merge » : git status vous le rappelle.
Renoncer, à tout moment avant le commit : git merge --abort remet tout comme avant le merge.
Vous avez modifié un fichier, et vous voulez revenir à sa dernière version commitée. Comment faire ?
restore : jeter des modifications$ git restore recettes/crepes.md ← le fichier redevient celui de l'index
$ git restore --staged recettes/crepes.md ← annule un add : l'index redevient égal à HEAD
restore <f> recopie l'index dans le fichier ; restore --staged <f> recopie HEAD dans l'index : ce sont les deux flèches "retour" du trio ;git restore <f> est irréversible : ces modifications n'existaient nulle part ailleurs, rien ne les retrouvera.Un git restore fichier malheureux se rattrape.
Un git restore fichier malheureux se rattrape.
Faux : une modification jamais commitée n'existait nulle part ailleurs : elle est perdue.
Vous venez de commiter, le commit est raté, et vous ne l'avez pas encore poussé. Comment le défaire ?
amend et reset : réécrire ce qui n'est pas partagé$ git commit --amend ← refait le dernier commit (message, fichier oublié)
$ git reset --soft HEAD~1 ← « décommite » : tout reste prêt à être recommité
$ git reset HEAD~1 ← défait le commit et le add ; les fichiers restent modifiés
$ git reset --hard HEAD~1 ← tout disparaît, y compris les modifications non commitées ⚠
reset fait reculer la branche ; le mode dit ce qu'on fait de l'index et du working tree ;reset n'est pas effacé pour autant : l'annexe reflog montre comment le retrouver.git reset --hard ne touche qu'à l'historique, jamais à vos fichiers.
git reset --hard ne touche qu'à l'historique, jamais à vos fichiers.
Faux : --hard recule aussi l'index et le working tree : les modifications non commitées sont perdues.
Cette fois, le commit raté a déjà été poussé, et vos collègues l'ont tiré. Comment l'annuler ?
revert : annuler sans réécrire$ git revert a9bfd1f
[main f65d87e] Revert "Précise la cuisson des crêpes"
revert ne supprime rien : il ajoute un nouveau commit qui applique le changement inverse ;pull ;reset réécrit le passé, revert ajoute au présent : dès qu'un commit est partagé, c'est revert.On annule un commit déjà partagé avec revert.
On annule un commit déjà partagé avec revert.
Vrai : revert ajoute un commit inverse, sans réécrire l'histoire.
| Je veux… | Commande | Rattrapable ? |
|---|---|---|
| jeter mes modifications d'un fichier | git restore <f> |
|
annuler un add |
git restore --staged <f> |
oui, le fichier est intact |
| refaire mon dernier commit | git commit --amend |
oui (cf. annexe reflog) |
| reculer en gardant le travail | git reset --soft / --mixed |
oui (cf. annexe reflog) |
| tout effacer jusqu'à un commit | git reset --hard <c> |
les commits oui, le travail non commité non |
| annuler un commit déjà poussé | git revert <c> |
rien n'est effacé : un commit inverse s'ajoute |
Une seule question avant de défaire : ce commit a-t-il déjà été poussé ? Si oui, revert ; sinon, tout est permis.
clone, fetch, merge, push : échanger avec une autre copie du dépôt
Le dépôt d'exercice de la séance, le carnet de recettes de GIT1, est sur GitHub. Récupérez-le pendant que je vous explique ce qui se passe :
cd ~/mines (ou ce qui vous sert) ;git clone https://github.com/raphaelpra/git-carnet.git ;cd git-carnet, puis ls..git/ : tout l'historique.git/ : tout l'historique.git/ : tout l'historiquegit log vous montre mes commits ;git clone$ git clone https://github.com/raphaelpra/git-carnet.git
Cloning into 'git-carnet'...
$ cd git-carnet
$ git branch -a
* main ← votre branche, à vous
remotes/origin/HEAD -> origin/main
remotes/origin/cuisson
remotes/origin/garniture
remotes/origin/main ← la dernière position connue de main là-bas
remotes/origin/sauce
clone fait quatre choses d'un coup :
.git/ distant (tous les commits, toutes les branches) ;origin ;origin/<b> pour chaque branche distante ;main locale, posée au même endroit, et la lie à origin/main..git/ : tout l'historiqueUn dépôt distant (remote) est une autre copie complète du même dépôt, ailleurs : sur GitHub, sur un serveur, chez un collègue.
Rien n'est synchronisé en continu : les deux copies ne se parlent que lorsque vous tapez fetch, pull ou push. Entre deux, chacune vit sa vie.
Pour ne pas retaper l'URL à chaque fois, git lui donne un surnom. origin est celui que git clone donne au dépôt d'où l'on vient : ce n'est pas un mot-clé, juste une convention.
$ git remote -v
origin https://github.com/raphaelpra/git-carnet.git (fetch)
origin https://github.com/raphaelpra/git-carnet.git (push)
git push origin main se lit donc « envoie main à l'URL surnommée origin » ;Dans git-carnet, cloné tout à l'heure :
git remote -v : quel surnom, quelle URL ?git log --oneline --graph --all : repérez HEAD, main, et des étiquettes que nous n'avons pas expliquées : origin/main, origin/sauce… ;git switch -c echauffement, modifiez le README.md, add, commit ;git switch main, git merge echauffement : fast-forward ou merge commit ? pourquoi ?git branch -d echauffement, puis git status : que veut dire Your branch is ahead of 'origin/main' by 1 commit ?C'est la question de la slide suivante.
origin/mainÀ la fin du hands-on, chez vous :
origin/main est une photo de la position de main sur origin, prise lors du dernier clone, fetch, pull ou push ;main a un commit que origin/main n'a pas ; rien n'est parti tant que vous n'avez pas fait push.Je fais deux commits dans mon clone du carnet, et je les pousse sur GitHub :
$ git switch main
$ printf '# Galettes\n\n- 250 g de farine de sarrasin\n' > recettes/galettes.md
$ git add recettes/galettes.md && git commit -m "Ajoute les galettes" ← commit 1
$ sed -i 's/- 30 g de sucre/- 30 g de sucre\n- 1 gousse de vanille/' recettes/tarte.md
$ git commit -am "Ajoute la vanille à la tarte" ← commit 2
$ git push
$ git log --oneline --graph main origin/main
Sur GitHub, les deux commits sont là : https://github.com/raphaelpra/git-carnet/commits/main
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
Rien n'a bougé : ni vos fichiers, ni votre graphe, ni origin/main. Mes commits sont sur GitHub, mais votre dépôt ne le sait pas encore.
origin/main ne bouge jamais toute seule : il faut aller voir.
git fetch, puis le graphe$ git fetch
$ git log --oneline --graph main origin/main
Vous devez voir, chez vous, exactement ce graphe :
fetch a rapatrié mes 2 commits et déplacé origin/main ; votre main et vos fichiers n'ont pas bougé ;git status : Your branch and 'origin/main' have diverged, and have 1 and 2 different commits each.fetch, pull, push| Commande | Ce qu'elle fait | Touche à vos fichiers ? |
|---|---|---|
git fetch |
rapatrie les nouveaux commits, déplace origin/* |
non, jamais |
git pull |
fetch puis merge origin/main dans votre branche |
oui |
git push |
envoie vos commits, déplace main là-bas (et origin/main ici) |
non |
$ git fetch
$ git status
Your branch and 'origin/main' have diverged,
and have 1 and 2 different commits each, respectively.
$ git log --oneline --graph main origin/main ← regarder avant de décider
$ git merge origin/main ← fusionne leurs commits avec le mien
Le réflexe : fetch, regarder le graphe, puis décider. Sur une histoire qui diverge, faites fetch + merge vous-même : git pull y refuse de choisir à votre place (Need to specify how to reconcile divergent branches).
La dernière étape du TP GIT1 proposait de publier git-homework sur GitHub en suivant une recette. Ligne à ligne :
$ git remote add origin git@github.com:VOUS/git-homework.git ← donne le surnom origin à cette URL
$ git push -u origin main ← envoie main, crée origin/main, lie les deux
$ git remote -v ← vérifie
.gitignore : sinon GitHub crée un premier commit de son côté, et vos deux histoires n'ont aucun ancêtre commun (push refusé ; l'annexe autres dépôts montre comment les réunir) ;-u (upstream) mémorise le lien : git status peut ensuite dire ahead / behind ;git clone frais, ailleurs.Dans git-carnet, votre main et origin/main ont divergé : 1 commit à vous, 2 à moi.
git merge origin/main : l'éditeur s'ouvre pour le message du merge, enregistrez, fermez ;git log --oneline --graph main origin/main : dessinez ce que vous voyez ;git status : que veut dire ahead by 2 commits ?Question : git a créé un commit de plus. Lequel, et pourquoi ?
Vous ne pouvez pas pousser sur git-carnet : c'est mon dépôt. Vous pousserez dans l'atelier, sur votre propre copie sur GitHub (un fork, partie 3). Ce qui arrive quand deux personnes poussent sur le même dépôt, je vous le montre.
Sur mon ordi, trois dossiers : un dépôt qui joue le rôle de GitHub, et deux clones, comme deux collègues.
Bob commite et pousse le premier :
$ cd bob
$ echo "Bob" >> README.md && git commit -am "Bob signe le README"
$ git push
Alice n'a pas fait fetch depuis le push de Bob :
$ cd ../alice
$ echo "note" >> recettes/tarte.md && git commit -am "Alice précise la tarte"
$ git push
! [rejected] main -> main (fetch first)
hint: Updates were rejected because the remote contains work that you do not have locally.
Le refus n'est pas une panne : git refuse d'écraser le travail de Bob. Alice fait ce que vous avez fait au hands-on 2 : fetch, merge, puis elle repousse.
git status dit… |
Ça veut dire | On fait |
|---|---|---|
| up to date with 'origin/main' | rien à échanger (à la date du dernier fetch !) |
rien |
| ahead by 2 commits | vous avez 2 commits qu'origin n'a pas | push |
| behind by 3 commits | origin a 3 commits que vous n'avez pas | pull |
| have diverged | les deux | fetch, merge, push |
Un hébergeur de dépôts git, et tout ce qu'on a construit autour
Git (2005) : un logiciel, sur votre ordi.
clone, fetch, push ;Tout ce que vous avez fait jusqu'ici, c'est git.
GitHub (2008, Microsoft depuis 2018) : un site, qui héberge des dépôts git.
origin ;Le git-carnet de GitHub est un dépôt git ordinaire : une clé USB aurait fait l'affaire. GitLab ou Codeberg font comme GitHub, avec les mêmes commandes git.
GitHub doit savoir qui pousse. Deux façons, selon l'URL du remote :
| URL | Comment on prouve qui on est |
|---|---|
https://github.com/vous/projet.git |
au premier push, une fenêtre de connexion GitHub s'ouvre dans le navigateur ; git retient la réponse (Git Credential Manager, installé avec Git for Windows) |
git@github.com:vous/projet.git (SSH) |
une clé SSH : ssh-keygen -t ed25519, puis la clé publique (~/.ssh/id_ed25519.pub) dans Settings → SSH keys |
$ ssh -T git@github.com
Hi vous! You've successfully authenticated, but GitHub does not provide shell access.
push depuis 2021 : si git vous le demande (sur Mac, souvent), voir l'annexe gh ;git remote set-url origin <url> change l'URL d'un remote existant.Collaborateur : le propriétaire vous donne le droit d'écrire dans son dépôt.
origin = son dépôt ;Fork : une copie du dépôt, sur votre compte, où vous avez tous les droits.
origin = votre fork, upstream = l'original ;Un fork n'est rien d'autre qu'une copie du dépôt, faite par GitHub sur votre compte (bouton Fork), qui garde le lien avec l'original.
origin et upstream$ git clone https://github.com/vous/projet.git ← origin = votre fork
$ git remote add upstream https://github.com/original/projet.git ← upstream = l'original
$ git fetch upstream
$ git log --oneline main..upstream/main ← ce que l'original a et que votre fork n'a pas
$ git merge upstream/main ← l'intégrer, puis git push : votre fork est à jour
upstream n'est qu'un surnom de plus, comme origin : un remote de plus, ses branches de suivi (upstream/main), dans le même .git.
Camille a forké le carnet : https://github.com/raphaelpra/git-carnet-camille. Depuis, j'ai poussé mes 2 commits sur l'original. Mettez-vous à sa place, et mettez son fork à jour :
cd .., git clone https://github.com/raphaelpra/git-carnet-camille.git, cd git-carnet-camille ;git remote add upstream https://github.com/raphaelpra/git-carnet.git, puis git remote -v ;git fetch upstream, puis git branch -r ;git log --oneline main..upstream/main : qu'a l'original que le fork de Camille n'a pas ?git merge upstream/main (l'éditeur s'ouvre : enregistrez, fermez) ; ls recettes/ ;git log --oneline --graph -6.Question : Camille ne peut pas pousser sur git-carnet. Comment me proposerait-elle son correctif des œufs ?
C'est le geste de l'atelier, étape 8. Ici, pas de push : ce fork-là est à moi.
Une pull request (PR) dit : « voici ma branche, voulez-vous l'intégrer dans la vôtre ? »
raphaelpra/…:main ← vous/…:fiche/stash ; on lit cette ligne avant de cliquer ;git push sur fiche/stash ajoute ses commits à la PR, sans rien rouvrir ;git merge côté GitHub, une fois la PR approuvée.En clair : la PR est un git merge qu'on a rendu discutable. Elle n'existe pas dans git, seulement sur GitHub.
10 minutes, puis les workflows, trois outils, worktree et l'atelier
Les commandes sont les mêmes pour tous ; la façon de s'en servir à plusieurs est une décision d'équipe
Git vous donne des branches, des remotes, merge et rebase. Il ne dit rien de :
main, et si quelqu'un relit avant ;merge ou rebase, et à quel moment.Chaque équipe répond à ces questions par un workflow. Aucun n'est « le bon » : chacun répond à un souci précis, et le paie d'un prix. Passons-en trois en revue, du plus simple au plus outillé.
mainLe souci résolu : partager du code, tout simplement. C'est le modèle des outils d'avant git (CVS, SVN), et celui de votre premier projet de groupe : un dépôt GitHub, tout le monde collaborateur, tout le monde pousse sur main.
Le prix :
push refusé en boucle dès qu'on est trois (fetch first), et des pull qui créent des merge commits partout ;main est souvent cassée, puisque c'est là qu'on travaille.Parfait à deux sur un petit projet ; ça craque vite au-delà.
Le GitHub flow (2011), celui de la plupart des équipes aujourd'hui, et celui de notre atelier :
main est toujours en état de marche : on ne travaille jamais dessus ;Le souci résolu : relire avant d'intégrer, garder main saine. Le prix : une étape de plus ; et une branche qui traîne trois semaines finit en conflit avec tout le monde.
Même schéma que le précédent, mais la branche vit sur votre fork, pas dans le dépôt de référence :
upstream (le projet) ◀── PR ─── origin (votre fork) ◀── push ─── votre PC
│ ▲
└──────────────────────── fetch upstream ───────────────────────┘
Le souci résolu : des milliers de contributeurs qui ne se connaissent pas (le noyau Linux, Python, numpy…). Le mainteneur ne donne les clés à personne ; n'importe qui peut proposer, lui seul décide.
Le prix : deux remotes à tenir à jour (git fetch upstream souvent), et votre fork qui prend du retard si vous l'oubliez.
C'est le modèle de l'atelier tout à l'heure : vous forkez raphaelpra/git-atelier-2026, vous poussez sur votre fork, vous proposez par PR.
main a avancéVous avez ouvert votre PR ; depuis, j'ai mergé celles de deux camarades :
main qui n'existe plus ; GitHub affiche This branch is out-of-date, ou This branch has conflicts si vous avez touché les mêmes lignes ;main$ git fetch upstream ← rapatrie le main du dépôt de référence
$ git merge upstream/main ← conflit ? corriger, git add, git commit
$ git push ← la PR se met à jour toute seule
origin/main au lieu d'upstream/main) ;rebase pour garder la PR en ligne droite : annexe rebase.| Workflow | Le souci qu'il résout | Son prix | Typiquement |
|---|---|---|---|
dépôt central, tout sur main |
partager, sans cérémonie | push refusés, main cassée, aucune relecture |
à deux, un petit projet |
| branches + PR (GitHub flow) | relire et tester avant d'intégrer ; main toujours saine |
une étape de plus ; les branches longues divergent | la plupart des équipes |
| fork + PR | contribuer sans droit d'écriture | deux remotes à tenir à jour | le logiciel libre, notre atelier |
Votre prochain projet de groupe, à quatre, pendant trois semaines : lequel choisissez-vous ?
Ma réponse : branches + PR, un relecteur, main protégée. Ce qui compte surtout, c'est de le décider ensemble le premier jour, et de l'écrire dans le README.
stash, blame, et l'art du message de commit
stash : mettre de côtéVous êtes au milieu d'une modification, et il faut changer de branche maintenant (git refuse : vos modifications entreraient en collision) :
$ git stash push -m "essai de graphique" ← range les modifications, working tree propre
$ git switch main ← … le correctif urgent …
$ git switch analyse
$ git stash list
stash@{0}: On analyse: essai de graphique
$ git stash pop ← rétablit, et retire de la pile
git stash tout court marche aussi, sans message : vous ne saurez plus dans une semaine ce que c'était ;-u pour embarquer aussi les fichiers non suivis (untracked) ;blame : qui a écrit cette ligne, et pourquoiDans git-carnet-camille (hands-on 3) :
$ git blame recettes/crepes.md
7ac8892 (Raphael Prasquier 2026-09-10 10:00:00 +0200 3) - 250 g de farine
b6c47e3 (Camille 2026-10-15 09:00:00 +0200 4) - 4 œufs
7ac8892 (Raphael Prasquier 2026-09-10 10:00:00 +0200 5) - 50 cl de lait
7ac8892 (Raphael Prasquier 2026-09-10 10:00:00 +0200 6)
a9bfd1f (Raphael Prasquier 2026-09-10 12:00:00 +0200 7) Cuisson : 3 min par face, à feu vif.
$ git blame -L 4,7 recettes/crepes.md ← seulement les lignes 4 à 7
$ git show b6c47e3 ← le commit entier : son message, ses autres changements
Le nom est mal choisi : l'intérêt n'est pas de trouver un coupable, mais de retrouver le pourquoi d'une ligne étrange avant d'y toucher. Et ce pourquoi n'existe que si le message de commit le dit.
VS Code : l'extension GitLens affiche le
blame de la ligne courante, en gris, au bout de la ligne ; sur GitHub, le bouton Blame au-dessus d'un fichier.
Corrige la moyenne quand la liste est vide ← ≤ 50 caractères, à l'impératif
moyenne([]) levait ZeroDivisionError et faisait ← une ligne vide, puis le pourquoi
planter le rapport du lundi. On renvoie désormais
None, que l'appelant affiche comme « pas de données ».
git add -p pour découper un fichier en morceaux) ;blame dans six mois : le plus souvent, vous.git commit sans -m ouvre l'éditeur : c'est là qu'on écrit un corps de message.
git worktree, à l'heure des agentsPlusieurs branches extraites en même temps, dans un seul dépôt
Le trio de GIT1 n'existe qu'en un exemplaire : vous ne pouvez avoir qu'une branche extraite à la fois. Pour un humain, changer de tâche oblige à stash, à un commit « wip », ou à un second clone.
Pour des agents de code (Claude Code, Codex, Cursor…), qui travaillent seuls plusieurs minutes et que l'on lance à plusieurs, c'est rédhibitoire. Dans un seul dossier :
git add de l'un part dans le commit de l'autre ;git switch, les fichiers changent sous les pieds de tous les autres.Il faut à chaque agent son propre trio, sans cloner trois fois le dépôt.
.git, plusieurs working trees.git ;projet-bug/ est immédiatement visible depuis projet/ (git log --all) : pas de push, pas de fetch ;$ git worktree add ../projet-bug -b fix/moyenne ← nouveau dossier, nouvelle branche
$ git worktree add ../projet-tests -b tests origin/main ← depuis un point précis
$ git worktree list
/home/vous/projet 3f9a1c2 [main]
/home/vous/projet-bug 3f9a1c2 [fix/moyenne]
$ git worktree remove ../projet-bug ← refuse s'il reste du travail non commité
$ git branch -d fix/moyenne ← la branche, elle, survit au dossier
../), jamais dedans ;.venv/, node_modules/, .env sont à recréer dans chaque dossier ;remove dès que la branche est mergée.| 1. la tâche | 2. un worktree, une branche | 3. l'agent | 4. la PR | 5. vous | 6. ranger |
|---|---|---|---|---|---|
| « corrige la moyenne » | worktree add ../projet-bug -b fix/moyenne |
édite, teste, commite, seul dans son dossier | « Corrige la moyenne » | relisez le diff, testez | merge, worktree remove, branch -d |
worktree add pour vous : il faut savoir ce qu'ils font dessous, pour ranger, retrouver un travail, ou reprendre la main ;C'est ainsi que je travaille au quotidien : une demi-douzaine de worktrees ouverts, un agent dans chacun, et mon temps passe en review.
Dans git-carnet :
git worktree add ../git-carnet-essai -b essai ;cd ../git-carnet-essai, modifiez un fichier, add, commit ;git worktree list ; puis cd ../git-carnet et git log --oneline --all : le commit d'essai est là, sans push ;git-carnet, essayez git switch essai : lisez le message ;git worktree remove ../git-carnet-essai, puis git branch -d essai : refusé ? pourquoi ? (merge d'abord, ou -D).Vous referez exactement cela dans l'atelier, étape 9, pour une deuxième fiche pendant que la première attend sa review.
Le dépôt de classe : https://github.com/raphaelpra/git-atelier-2026. Consignes pas à pas sur le site (page de la séance).
upstream = le dépôt de classe ;fiche/<commande>, une fiche « une commande git en 10 lignes » depuis fiches/_modele.md ;SOMMAIRE.md (tout le monde écrit au même endroit : le conflit est voulu) ;push sur votre fork, PR, relecteur mentionné : @votre-voisin-de-droite ;fetch upstream, merge upstream/main, push ;C'est moi qui merge (je suis le mainteneur) ; chaque merge crée un conflit chez tous les autres : c'est le but.
origin/main est la photo de sa position au dernier fetch ;fetch, regarder le graphe, puis décider ; pull = fetch + merge ;fetch, regarder, puis merge ;fetch upstream, puis merge upstream/main (le rebase : en annexe) ;worktree : un dossier par tâche (ou par agent), un seul .git.git help worktree ; learngitbranching, onglet distant : le meilleur moyen de voir fetch, pull et push ;cherry-pick, histoires sans ancêtre commun) et gh (GitHub en ligne de commande).Pour toute question, vous pouvez me contacter par email : raphael@imagine-app.fr.