Git : passer au niveau supérieur
Rebase, cherry-pick, reflog, hooks, signatures, worktrees, bisect. Tout ce que tu utiliseras quand tu sortiras du cycle add/commit/push de base.
À la fin du cours, tu sais
- Choisir un workflow adapté à ton équipe (Git Flow, GitHub Flow, trunk-based)
- Maîtriser rebase, interactive rebase et cherry-pick
- Récupérer un commit perdu avec reflog
- Versionner proprement avec tags et bisect une régression
- Mettre en place des hooks pour la qualité locale
- Signer tes commits et utiliser les worktrees
Prérequis
- Avoir suivi le cours « Premiers pas avec Git et GitHub » ou équivalent
- Être à l'aise avec branch, merge, push, pull, pull requests
Étape 1 sur 11 : Stratégies de branches et workflows
Chapitre 1
Stratégies de branches et workflows
Choisir le bon modèle de collaboration, c'est la décision qui structure tout le reste. Trois grandes familles dominent.
Une fois qu'on maîtrise le cycle add / commit / push, la première vraie décision d'équipe n'est pas technique mais organisationnelle : comment structure-t-on les branches ?. Ce choix, qu'on appelle un workflow, conditionne tout le reste — la façon de collaborer, de livrer, de corriger un bug urgent. Il n'existe pas de workflow universellement meilleur : chacun est un compromis adapté à un contexte, et savoir lequel choisir fait partie de la maturité d'un·e dev.
Trois grandes familles dominent. Git Flow est le plus structuré, avec ses branches main, develop, release/* et hotfix/* : adapté aux logiciels livrés par versions (mobile, desktop, secteurs réglementés), il est en revanche lourd pour du web à déploiement fréquent. GitHub Flow est minimaliste : une seule branche longue, main, et des branches de fonctionnalité courtes fusionnées via pull request puis déployées en continu. Trunk-Based Development pousse la logique à l'extrême : tout le monde intègre très souvent sur main, en masquant le code inachevé derrière des feature flags.
Pour trancher, pose-toi quelques questions concrètes : quelle est la taille de l'équipe, à quelle fréquence déploies-tu, es-tu soumis·e à des contraintes réglementaires, et surtout, ta CI/CD est-elle assez solide ? Le trunk-based, par exemple, exige une chaîne de tests automatisés irréprochable pour être viable. Pour l'immense majorité des équipes web qui déploient plusieurs fois par jour, GitHub Flow est le bon point de départ : simple, parfaitement compatible avec pull requests, CI et déploiement automatique. Dans tous les cas, adopte une convention de nommage de branches qui exprime l'intention (feat/, fix/, hotfix/, refactor/) pour que l'historique se lise d'un coup d'œil.
Les 3 workflows principaux
- Git Flow :
main,develop,release/*,hotfix/*,feature/*. Adapté aux releases versionnées (mobile, desktop, banking) - GitHub Flow : une seule branche longue
main, feature branches courtes, déploiement continu - Trunk-Based Development : tout le monde commit fréquemment sur
main, feature flags pour le code en cours, release every commit
Critères de choix
- Taille de l'équipe
- Fréquence des déploiements (par jour ? par mois ?)
- Contraintes réglementaires (banking, santé : Git Flow souvent imposé)
- Maturité de la CI/CD (le trunk-based exige une CI solide)
Conventions de nommage
git switch -c feat/auth-oauth # nouvelle fonctionnalité
git switch -c fix/null-on-signup # correction de bug
git switch -c chore/upgrade-deps # tâche annexe (upgrade, doc)
git switch -c hotfix/payment-broken # correction critique de prod
git switch -c refactor/extract-auth # refactor sans changement de comportementEn 2025, le plus courant : GitHub Flow
main. Si tu hésites, commence par lui.Chapitre 2
Rebase vs Merge
Comprendre quand réécrire l'historique et quand le préserver. C'est le sujet qui sépare les utilisateurs basiques de Git des autres.
Le débat rebase contre merge est celui qui distingue le plus nettement les utilisateur·ices basiques de Git des autres. Les deux commandes réunissent le travail de deux branches, mais elles racontent l'histoire différemment. Merge préserve l'historique réel : les deux branches restent visibles et un commit de fusion matérialise leur point de rencontre. C'est honnête et fidèle à ce qui s'est passé, au prix d'un historique parfois touffu quand les fusions se multiplient.
Rebase, à l'inverse, rejoue tes commits au sommet de la branche cible, comme si tu avais codé après coup, sur une base à jour. Le résultat est un historique linéaire, bien plus agréable à lire. Mais il faut comprendre ce qui se passe réellement : rebaser ne déplace pas les commits, il en crée de nouveaux, avec de nouvelles empreintes SHA. Autrement dit, le rebase réécrit l'histoire. C'est puissant et propre, mais ça a une conséquence directe sur la sécurité du travail collectif.
D'où la règle d'or à ne jamais transgresser : on ne rebase jamais une branche partagée publiquement. Si tu rebases main alors que des collègues sont basés dessus, leurs historiques divergent du tien et la synchronisation devient un cauchemar. Le bon usage est donc : rebase tes branches de fonctionnalité privées pour les garder propres et à jour, mais jamais après qu'elles aient été tirées par d'autres. En pratique, beaucoup d'équipes évitent complètement le dilemme grâce au bouton Squash and merge de GitHub, qui condense tous tes commits en un seul, propre, sur main — le meilleur des deux mondes sans rebase manuel.
Merge : préserver l'historique
git merge garde l'historique réel : les deux branches restent visibles, un commit de merge matérialise leur réunion. Honnête, lisible si l'équipe est petite.
Rebase : linéariser l'historique
git rebase rejoue tes commits au sommet de la branche cible. Le résultat est un historique linéaire, comme si tu avais codé après l'autre. Plus propre à lire, mais réécrit l'histoire.
# Récupérer les derniers changements de main et rebaser ma feature dessus
git fetch origin
git rebase origin/main
# En cas de conflit
# 1) Résoudre les conflits dans les fichiers
git add fichier-resolu.ts
git rebase --continue
# Pour abandonner et revenir à l'état initial
git rebase --abortLa règle d'or du rebase
main alors que tes collègues sont basés dessus, leurs commits divergent et c'est l'enfer. Rebase tes branches feature avant le merge, jamais après push partagé.Vrai ou faux ?
Un rebase modifie les commits originaux : il leur attribue de nouveaux SHA.
Squash and merge sur GitHub
Le bouton Squash and merge sur GitHub combine les deux : il squashe tous tes commits de feature en un seul, puis le merge sur main. Historique main propre (un commit par PR), pas besoin de rebase manuel.
Chapitre 3
Interactive rebase : nettoyer son historique
Avant de proposer une PR, on peut nettoyer ses commits pour que la review soit lisible. C'est ce que fait l'interactive rebase.
Pendant que tu développes, ton historique se remplit de commits en désordre : un « wip », une correction de typo, un « fix lint », des messages écrits à la va-vite. C'est parfaitement normal — on ne code pas d'un seul jet parfait. Mais avant de soumettre ton travail en revue, tu peux nettoyer cet historique pour qu'il raconte une histoire claire. C'est le rôle du rebase interactif : il te laisse réorganiser, fusionner, renommer ou supprimer tes commits avant de les partager. Un·e reviewer préférera toujours relire deux commits propres que douze commits brouillons.
Concrètement, git rebase -i ouvre un éditeur listant tes commits, chacun précédé d'une commande que tu peux changer. pick garde le commit tel quel. reword modifie son message. squash le fusionne avec le précédent en conservant les deux messages, tandis que fixup le fusionne en jetant son message (idéal pour absorber une correction de typo). drop le supprime, et edit met le rebase en pause pour retoucher le commit. Tu peux même réordonner les lignes : Git applique les commits dans l'ordre que tu choisis.
Un combo rend ce nettoyage quasi automatique. Au moment où tu repères une coquille dans un commit passé, fais git commit --fixup=<sha> : Git crée un commit spécial marqué fixup!. Puis, à la fin, git rebase -i --autosquash replace tout seul chaque fixup juste après son commit cible — tu n'as plus qu'à valider. Attention en revanche : puisque tu as réécrit l'historique, un git push normal sera refusé. Utilise git push --force-with-lease, et surtout pas --force : la variante with-lease refuse de pousser si quelqu'un a poussé entre-temps, ce qui protège le travail des autres.
Lancer un rebase interactif
# Sur les 5 derniers commits
git rebase -i HEAD~5
# Ou jusqu'à la branche main
git rebase -i mainGit ouvre un éditeur avec la liste des commits, et tu peux changer la commande devant chacun :
pick: garder le commit tel quelreword: modifier le message (le contenu reste)squash(ous) : fusionner avec le commit précédent, garder les messagesfixup(ouf) : fusionner avec le précédent, jeter le message (le plus courant)drop(oud) : supprimer le commitedit: s'arrêter sur le commit pour le modifier
Le combo magique : --fixup + --autosquash
# Tu fais ton commit normal
git commit -m "feat: ajout du formulaire de login"
# Tu vois un typo plus tard, tu corriges et tu fais un fixup
git add .
git commit --fixup=<sha-du-commit-cible>
# Ton historique : ...[feat: login]...[fixup! feat: login]...
# Lance interactive rebase avec --autosquash
git rebase -i --autosquash main
# Git positionne automatiquement le fixup au bon endroit. Tu valides.Push après rebase
git push classique sera refusé. Utilise git push --force-with-lease (pas --force). --force-with-lease refuse de pousser si quelqu'un a poussé entre-temps, protégeant le travail des autres.Vrai ou faux ?
git commit --amend permet de modifier un commit déjà poussé sans réécrire l'historique.
Chapitre 4
Cherry-pick, stash, reflog
Trois outils pour manipuler des commits, mettre du travail de côté, ou récupérer un commit qu'on croyait perdu.
Ce chapitre regroupe trois outils qui, ensemble, te donnent une aisance nouvelle avec Git : déplacer un commit précis, mettre du travail de côté, et récupérer ce qu'on croyait perdu. Le premier, cherry-pick, applique un commit donné sur ta branche courante, où qu'il vienne. Le cas typique : tu as corrigé un bug urgent sur main, et tu veux exactement ce correctif — ni plus, ni moins — sur une branche de release en cours. L'option -x ajoute au message une référence au commit d'origine, précieuse pour tracer d'où vient un correctif reporté sur plusieurs branches.
Le deuxième, stash, répond à une situation quotidienne : tu es en plein travail non commité et tu dois changer de branche en urgence. git stash met tes modifications de côté dans une pile, te rend un espace de travail propre, et te permet de les réappliquer plus tard avec git stash pop. Tu peux nommer tes stashes, en garder plusieurs, et inclure les fichiers non suivis avec l'option -u. C'est un tiroir temporaire, pratique pour les interruptions — même si, pour un contexte durable comme un hotfix, les worktrees du dernier chapitre sont souvent préférables.
Le troisième est le plus rassurant de tous : le reflog. Beaucoup de débutant·es croient qu'un git reset --hard malheureux détruit définitivement leur travail. C'est presque toujours faux. git reflog est le journal de toutes les positions par lesquelles ta référence HEAD est passée : chaque commit, reset, rebase y laisse une trace, conservée environ trente jours. Il te suffit d'y repérer la position d'avant l'accident et d'y revenir avec git reset --hard HEAD@{n}, ou d'en faire une nouvelle branche. Retiens la formule qui sauve : quand tu paniques, lance git reflog. Le scénario ci-dessous te fait justement dérouler ce sauvetage après un rebase raté.
Cherry-pick : appliquer un commit ailleurs
# Récupérer un commit précis d'une autre branche
git cherry-pick abc1234
# Avec une référence au commit original dans le message (recommandé)
git cherry-pick -x abc1234
# Cherry-pick d'une plage de commits
git cherry-pick abc1234..def5678Cas typique : tu as fait un hotfix sur main, tu veux l'appliquer aussi sur une branche release en cours.
Stash : mettre du travail de côté
# Tu as des modifs non commitées et tu dois changer de branche d'urgence
git stash push -m "wip: refacto navigation"
# Plus tard, retour à ton travail
git stash list # voir tous les stashes
git stash pop # appliquer le plus récent et le supprimer du stash
git stash apply stash@{1} # appliquer un stash précis sans le supprimer
git stash drop stash@{1} # supprimer un stash
# Inclure les fichiers non suivis (untracked)
git stash push -u -m "wip avec nouveaux fichiers"Reflog : ton filet de sécurité
git reflog est le journal de toutes les positions de HEAD. Même un git reset --hard ne supprime pas vraiment tes commits : ils restent retrouvables via reflog pendant ~30 jours.
# Voir tous les déplacements de HEAD
git reflog
# Output exemple :
# abc1234 HEAD@{0}: reset: moving to HEAD~3
# def5678 HEAD@{1}: commit: feat: ajout du dashboard
# ...
# Récupérer un commit "perdu"
git reset --hard HEAD@{1} # revient à la position d'avant le reset
# Ou créer une branche à partir de ce commit
git switch -c recup HEAD@{1}Tant que tu n'as pas fait git gc
git reflog.🧭 Au secours, j'ai foiré mon rebase
Tu rebases <code>feat/checkout</code> sur <code>main</code>, tu te trompes dans la résolution de conflits, et ton historique est cassé. Qu'est-ce que tu fais ?
Le rebase est encore en cours (tu n'as pas fini de continue). Tu réalises que tu as résolu les conflits n'importe comment.
Chapitre 6
Hooks, aliases et config avancée
Industrialiser ta qualité locale et raccourcir tes commandes.
Les meilleures équipes ne comptent pas sur la discipline individuelle pour maintenir la qualité : elles l'automatisent au plus près du développeur. Les hooks Git sont des scripts que Git exécute automatiquement à des moments clés du cycle de vie d'un commit. Les trois plus utiles côté client : pre-commit, qui se déclenche avant la création du commit (idéal pour lancer le lint et formater le code), commit-msg, qui valide le format du message (par exemple imposer les Conventional Commits), et pre-push, qui vérifie une dernière fois avant l'envoi.
Point important : on ne touche pas au dossier .git/hooks/ à la main. Ce dossier n'est pas versionné, donc tes hooks ne suivraient pas le dépôt et tes collègues ne les auraient pas. On passe par des outils dédiés — Husky et lint-staged dans l'écosystème Node, lefthook en multi-langage — qui versionnent la configuration des hooks dans le projet et les installent automatiquement à l'npm install. Combiné à lint-staged, qui n'analyse que les fichiers réellement modifiés, tu obtiens un pre-commit rapide qui empêche le code mal formé d'entrer, pour toute l'équipe, sans effort de chacun.
Deux autres leviers polissent ton confort au quotidien. Les alias raccourcissent les commandes que tu tapes cent fois : git lg pour un joli graphe d'historique, git unstage pour retirer un fichier du staging, git amend pour amender sans rouvrir l'éditeur. Et quelques réglages globaux bien choisis changent le comportement par défaut de Git : pull.rebase true pour un historique linéaire, rerere.enabled true pour que Git mémorise comment tu as résolu un conflit et le rejoue automatiquement s'il réapparaît. Ces petits ajustements, posés une fois, te suivent sur tous tes projets et font gagner un temps considérable.
Hooks client
pre-commit: lance avant la création du commit (lint, tests rapides)commit-msg: valide le format du message (Conventional Commits)pre-push: avant un push (tests complets, vérifications)
En pratique, on ne touche pas .git/hooks/ à la main. On utilise des outils : Husky (Node), lefthook (multi-langage), pre-commit (Python). Ces outils versionnent les hooks dans le repo et les installent à npm install.
// package.json
{
"scripts": {
"prepare": "husky"
},
"lint-staged": {
"*.{ts,tsx}": ["eslint --fix", "prettier --write"]
}
}
// .husky/pre-commit
npx lint-stagedAliases Git utiles
git config --global alias.co "checkout"
git config --global alias.sw "switch"
git config --global alias.br "branch"
git config --global alias.lg "log --oneline --graph --all --decorate"
git config --global alias.unstage "reset HEAD --"
git config --global alias.last "log -1 HEAD"
git config --global alias.amend "commit --amend --no-edit"Configs à mettre en place
# Pull rebase par défaut (historique linéaire)
git config --global pull.rebase true
# Mémoriser la résolution de conflits
git config --global rerere.enabled true
# Push uniquement la branche courante
git config --global push.default current
# Couleur partout
git config --global color.ui autoChapitre 7
Signatures et sécurité
Prouver que c'est bien toi qui a écrit ce commit. Important pour l'open source et pour les équipes qui imposent des branches protégées.
Par défaut, l'auteur d'un commit repose sur le nom et l'email configurés localement — des informations que n'importe qui peut mettre aux tiennes. Rien n'empêche donc quelqu'un de fabriquer un commit qui semble venir de toi. La signature de commits résout ce problème en apposant une preuve cryptographique que c'est bien toi. C'est particulièrement important dans l'open source, où l'on ne connaît pas les contributeur·ices, et dans les équipes qui protègent leurs branches critiques.
La méthode la plus simple aujourd'hui est la signature SSH (disponible depuis Git 2.34) : tu réutilises la clé SSH que tu as déjà pour te connecter à GitHub, sans rien installer de plus. Il suffit de configurer Git pour signer avec cette clé, puis d'ajouter la clé publique sur GitHub en tant que Signing key (et non Authentication key). Une fois en place, tu peux activer la signature automatique de tous tes commits, et GitHub affichera le badge Verified à côté des tiens. L'ancienne méthode par GPG reste valide, mais impose d'installer et de gérer des clés GPG dédiées — plus de friction pour le même résultat.
La signature prend tout son sens couplée aux branches protégées. Dans les réglages GitHub, tu peux exiger que tous les commits fusionnés sur main soient signés et vérifiés. Combinée à l'obligation de passer par une pull request relue et à une CI verte, cette règle offre une garantie forte sur ce qui entre en production : chaque changement est authentifié, revu et testé. C'est le genre de dispositif attendu sur les projets sensibles, et un excellent argument à mettre en avant si tu prépares un titre professionnel ou un entretien.
Signature SSH (Git 2.34+, le plus simple)
Tu réutilises la clé SSH que tu as déjà pour GitHub. Pas de GPG à installer.
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true
# Signer un commit
git commit -S -m "feat: secure login"
# Vérifier
git log --show-signaturePour que GitHub affiche le badge Verified, ajoute ta clé SSH comme Signing key dans Settings → SSH and GPG keys → New SSH key (en mode Signing key, pas Authentication key).
Signature GPG (historique)
Méthode plus ancienne, mais toujours valide. Demande d'installer GPG, de générer une clé GPG, et de l'uploader sur GitHub. Plus de friction, mais standard de l'open source historique.
Branche protégée + signature obligatoire
main soient signés. Combiné avec Require pull request review, tu obtiens un haut niveau de garantie sur ce qui est mergé.Chapitre 8
Worktrees : plusieurs branches en parallèle
Tu codes une grosse feature, et tu dois faire un hotfix urgent. Avant : tu stashes, tu changes de branche, tu codes, tu reviens, tu unstash. Avec les worktrees : tu ouvres un 2e dossier en parallèle.
Voici une situation que tu vivras souvent : tu es en plein milieu d'une grosse fonctionnalité, avec des fichiers modifiés partout, et un hotfix urgent tombe sur main. La méthode classique impose une gymnastique pénible : stasher ton travail, changer de branche, coder le correctif, revenir, dépiler le stash — en espérant ne rien casser au passage. Les worktrees offrent une bien meilleure réponse : ils te permettent d'avoir plusieurs branches ouvertes simultanément, chacune dans son propre dossier.
Un worktree est un dossier supplémentaire qui partage le même dépôt .git que ton dossier principal. Concrètement, git worktree add ../mon-app-hotfix hotfix/paiement crée un second dossier positionné sur la branche du hotfix, à côté de ton travail en cours. Tu t'y déplaces, tu corriges, tu commites, tu pousses — sans jamais toucher à ta fonctionnalité en chantier, qui t'attend intacte dans l'autre dossier. Une fois le hotfix fusionné, git worktree remove nettoie tout. Une seule contrainte logique : une même branche ne peut être active que dans un seul worktree à la fois, pour éviter les conflits internes.
Au-delà du hotfix, les worktrees brillent dès qu'il faut travailler sur deux états du code en parallèle : reproduire un bug signalé sur une vieille version taguée pendant que tu développes la suivante, comparer deux implémentations, ou lancer une longue suite de tests sur une branche pendant que tu continues sur une autre. C'est l'outil qui remplace avantageusement le va-et-vient de stashes pour tout contexte qui dure plus de quelques minutes. Avec les workflows du premier chapitre, le rebase interactif, le reflog comme filet et les worktrees pour le parallélisme, tu disposes désormais de tout ce qui fait passer Git de « je m'en sors » à « je maîtrise ».
Le concept
Un worktree est un dossier supplémentaire qui partage le même .git. Tu peux avoir 2 versions du repo en parallèle, sur 2 branches différentes, sans cloner deux fois ni stasher.
# Tu es dans ~/projets/mon-app sur la branche feat/dashboard
# Hotfix urgent demandé sur main
# Crée un nouveau worktree pour le hotfix
git worktree add ../mon-app-hotfix hotfix/payment-broken
# Bascule dans le dossier
cd ../mon-app-hotfix
# Tu codes, tu commits, tu pushes
git add . && git commit -m "fix: payment provider URL"
git push -u origin hotfix/payment-broken
# Une fois le hotfix mergé : supprimer le worktree
cd ../mon-app
git worktree remove ../mon-app-hotfix
# Lister les worktrees
git worktree list
# Nettoyer les worktrees obsolètes
git worktree pruneUne branche, un seul worktree
Les worktrees servent aussi à tester un bug rapporté sur une vieille version sans toucher à ton travail courant. Tu sors un worktree sur le tag v1.2.0, tu reproduis, tu fermes.
main. Ne rebase jamais une branche que d'autres ont déjà tirée.cherry-pick quand tu veux un ou deux commits précis ailleurs (typiquement un hotfix à reporter sur une release). rebase quand tu veux déplacer toute ta branche au sommet d'une autre.git reflog, retrouve la position d'avant, et reviens dessus avec git reset --hard HEAD@{n} ou crée une branche avec git switch -c recup HEAD@{n}. Les commits restent récupérables ~30 jours.Pour aller plus loin
- Pro Git (livre officiel, en français) · git-scm.com (nouvel onglet)
- Documentation officielle de Git · git-scm.com (en anglais) (nouvel onglet)
- git rebase : page de manuel · git-scm.com (en anglais) (nouvel onglet)
- git worktree : page de manuel · git-scm.com (en anglais) (nouvel onglet)
🛠️ Exercice optionnel
Nettoyer une feature branch avant le merge
Tu as une branche feat/profile avec 6 commits, dont 2 typos, 1 « wip » et 1 « fix lint ». Avant d'ouvrir la PR, tu vas nettoyer l'historique pour que la review soit lisible.
Ta mission
- Crée la branche et fabrique l'historique pourri :
git switch -c feat/profile main # 6 commits avec des messages comme : # - feat: ajout du composant Profile # - wip # - fix tipo # - feat: ajout des actions # - fix lint # - typo final - Lance
git rebase -i main. - Marque comme
fixuples commits "wip", "fix lint" et les typos. rewordles 2 commits restants au format Conventional Commits.- Vérifie avec
git log --oneline: tu dois avoir exactement 2 commits propres. - Push avec
git push -u origin feat/profile --force-with-lease. - Ouvre la PR sur GitHub.
Tu bloques ? Des indices, à dévoiler quand tu en as besoin.
Indice 1
Indice masqué.
Indice 2
Indice masqué.
Indice 3
Indice masqué.
✅ QCM de fin de cours
Teste tes acquis
10 questions, plusieurs réponses parfois possibles. Coche tout ce qui te semble juste, puis valide pour voir ton score et les explications.
- 1
Quelle commande te permet de récupérer un commit supprimé par un
git reset --hard? - 2
Que fait
git rebase -i --autosquash? - 3
Quelle stratégie de branches convient le mieux au déploiement continu ?
- 4
À quoi sert
git push --force-with-leaseplutôt que--force? - 5
Quelle est la différence entre un tag annoté et un tag léger ?
- 6
Que fait
git cherry-pick -x abc1234? - 7
Quel hook Git valide le format du message de commit ?
- 8
Combien de worktrees peuvent avoir la même branche en checkout simultanément ?
- 9
Quelle config évite les merges parasites lors d'un
git pull? - 10
Que fait
git bisect run ./test.sh?
Tu peux laisser des questions sans réponse, elles compteront comme fausses.
🎓 Attestation
Ton attestation de réussite
Termine le QCM avec au moins 80% de bonnes réponses pour débloquer ton attestation de réussite.
Tu veux ce cours pour ton équipe ?
Je peux adapter et animer ce cours pour tes formateur·ices ou tes apprenant·es, en présentiel ou en distanciel. Parlons-en pendant l'audit gratuit.
Réserver un audit gratuit →