Résumé des 18 démonstrations Git organisées pour une présentation thématique d'une heure.
- Présentation du projet Git Hero
- Structure des démos interactives
- Objectif : Maîtriser Git au-delà des commandes basiques
Application : Email Templates - Générateur de templates email
Problématique : Besoin de changer de contexte rapidement sans faire de commit
Apprentissage :
- Sauvegarder des modifications en cours sans commit
- Récupérer le travail sauvegardé
- Gérer plusieurs stash
Commandes clés :
git stash push -m "message" # Sauvegarder avec description
git stash list # Voir tous les stash
git stash pop # Restaurer et supprimer
git stash apply # Restaurer mais garder en stashCas d'usage : Interruption urgente, changement de branche, expérimentations temporaires
Application : Shopping Cart - Calculateur de panier e-commerce
Problématique : Deux features modifient la même fonction
feature/tax-calculation: Ajoute la TVA à 20%feature/discount-system: Ajoute les codes promo
Apprentissage :
- Comprendre les marqueurs de conflit diff3 (HEAD, ancêtre commun, incoming)
- Stratégies de résolution manuelle
- Tester après fusion
Commandes clés :
git merge <branch> # Fusionner une branche
git status # Voir les fichiers en conflit
git diff # Voir les détails du conflit
git add <file> # Marquer comme résolu
git merge --abort # Abandonner la fusion
git config merge.conflictstyle diff3 # Activer diff3Résolution : Intégrer les deux features (discount d'abord, puis taxes)
Application : Modern File Restoration
Problématique : git checkout fait trop de choses (branches + fichiers)
Apprentissage :
- Commande moderne pour restaurer des fichiers (Git 2.23+)
- Annuler des modifications locales
- Unstage des fichiers proprement
- Restaurer depuis un commit spécifique
Commandes clés :
git restore <file> # Annuler les modifications
git restore --staged <file> # Unstage (plus clair que reset HEAD)
git restore --source=<commit> <file> # Restaurer depuis un commit
git restore --source=HEAD --staged --worktree . # Reset completMigration :
git checkout -- file→git restore filegit reset HEAD file→git restore --staged filegit checkout branch→git switch branch
Application : Note Taker - Gestionnaire de notes
Problématique : Branche supprimée par erreur, commit "perdu"
Apprentissage :
- Git garde TOUT pendant 90 jours
- Récupérer des branches supprimées
- Récupérer des commits après reset --hard
- Historique de tous les mouvements de HEAD
Commandes clés :
git reflog # Voir tous les changements de référence
git reflog show HEAD # Historique de HEAD
git checkout -b <branch> <hash> # Récupérer depuis reflogMessage clé : Git ne perd presque jamais rien, reflog est votre assurance vie!
Application : Todo List - Gestionnaire de tâches
Problématique : Historique de commits désordonné avant de merger
Apprentissage :
- Nettoyer l'historique avant pull request
- Combiner, réordonner, modifier des commits
- Créer un historique lisible
Commandes clés :
git rebase -i HEAD~N # Rebaser les N derniers commits
git rebase -i --autosquash # Appliquer automatiquement les fixupActions disponibles :
- pick : conserver le commit
- reword : modifier le message
- squash : fusionner avec le précédent (garder les deux messages)
- fixup : fusionner avec le précédent (supprimer ce message)
- drop : supprimer le commit
Attention : Ne jamais rebaser des commits déjà pushés sur une branche partagée!
Application : Calculator - Calculatrice basique
Problématique : Petites corrections à apporter à des commits précédents
Apprentissage :
- Marquer automatiquement des commits pour fusion
- Workflow efficace pour les corrections
- Combinaison avec rebase --autosquash
Commandes clés :
git commit --fixup=<hash> # Créer un commit fixup
git rebase -i --autosquash HEAD~N # Réordonner automatiquementWorkflow :
- Faire des modifications
git commit --fixup=abc123(hash du commit à corriger)- Continuer à travailler
git rebase -i --autosquashà la fin
Application : Understanding --soft, --mixed, --hard
Problématique : Confusion entre les différents modes de reset
Apprentissage :
- Différences entre --soft, --mixed, --hard
- Impact sur HEAD, staging area, working directory
- Quand utiliser chaque mode
Tableau comparatif :
| Mode | HEAD bouge | Staging Area | Working Directory |
|---|---|---|---|
--soft |
✅ | Inchangé | Inchangé |
--mixed |
✅ | Nettoyé | Inchangé |
--hard |
✅ | Nettoyé | Nettoyé |
Commandes clés :
git reset --soft HEAD~1 # Annuler commit, garder changements staged
git reset HEAD~1 # Annuler commit, garder changements unstaged
git reset --hard HEAD~1 # Annuler commit et SUPPRIMER changements ⚠️Cas d'usage :
- --soft : Refaire un commit, combiner plusieurs commits
- --mixed : Unstage des fichiers, réorganiser les commits
- --hard : Revenir à un état propre (DANGER: perte de données)
Attention : Ne JAMAIS reset des commits pushés!
Application : Safe Undo Commits
Problématique : Besoin d'annuler un commit déjà pusté
Apprentissage :
- Annuler sans réécrire l'historique
- Sûr pour les branches partagées
- Parfait pour la production
Commandes clés :
git revert HEAD # Annuler le dernier commit
git revert <hash> # Annuler un commit spécifique
git revert --no-commit HEAD HEAD~1 # Annuler plusieurs commits
git revert --continue / --abort # Gérer les conflitsReset vs Revert :
| Feature | git reset | git revert |
|---|---|---|
| Réécrit l'historique | OUI |
NON ✅ |
| Sûr pour branches partagées | NON ❌ | OUI ✅ |
| Crée nouveau commit | NON | OUI |
| Meilleur pour | Commits locaux | Commits pushés |
Message clé : Commits pushés = revert, commits locaux = reset
Application : Number Guesser - Jeu de devinette
Problématique : Un bug est apparu mais on ne sait pas dans quel commit
Bug simulé : Calcul du point médian cassé (ajout de +5 par erreur)
// Avant (commits 1-4)
Math.floor((low + high) / 2)
// Après (commits 5-8)
Math.floor((low + high) / 2) + 5 // ❌ BUG!Apprentissage :
- Recherche binaire pour trouver le commit fautif
- Automatisation avec des tests
- Efficacité : log2(n) tests au lieu de n tests
Commandes clés :
git bisect start # Démarrer bisect
git bisect bad # Marquer commit actuel comme mauvais
git bisect good <commit> # Marquer un commit connu bon (ex: v1.0.0)
git bisect run npm test # AUTOMATISER avec tests!
git bisect reset # Terminer et revenir à HEADPuissance :
- 8 commits → 3 tests
- 100 commits → 7 tests
- 1000 commits → 10 tests
Application : Git History Search
Problématique : Trouver des commits spécifiques dans un gros historique
Apprentissage :
- Filtrer par auteur, date, message
- Chercher dans le code modifié
- Créer des requêtes complexes
Commandes clés :
# Filtres basiques
git log --oneline --graph --all
git log --author="Alice"
git log --since="2024-01-01" --until="2024-12-31"
# Recherche dans les messages
git log --grep="fix" -i
git log --grep="CRITICAL\|URGENT"
# Recherche dans le code
git log -S "functionName" # Chercher ajout/suppression
git log -G "regex.*pattern" # Chercher avec regex
git log -S "text" -p # Montrer les changements
# Fichiers spécifiques
git log -- app.js
git log --follow -- oldname.js # Suivre les renommages
# Entre tags/commits
git log v1.0.0..v2.0.0
# Format personnalisé
git log --pretty=format:"%h - %an, %ar : %s"Cas pratiques :
- Trouver quand un bug a été introduit
- Générer un changelog
- Voir qui a travaillé sur quoi
Application : Master Diff Viewing
Problématique : Voir précisément ce qui a changé, filtrer le bruit
Apprentissage :
- Différentes vues des changements
- Exclure des fichiers (lock files, etc.)
- Gérer les espaces blancs
- Comprendre working dir vs staging vs commits
Commandes clés :
# Basiques
git diff # Working directory vs staging
git diff --staged # Staging vs HEAD
git diff HEAD # Working directory vs HEAD
# Vues différentes
git diff --stat # Statistiques
git diff --name-status # Noms des fichiers + statut
git diff --compact-summary
# Exclure des fichiers
git diff -- . ':(exclude)package-lock.json'
git diff -- ':!*.lock'
# Espaces blancs
git diff --ignore-all-space # Ignorer tous les espaces
git diff --ws-error-highlight=all # Highlighter erreurs espaces
# Word-level
git diff --color-words # Changements mot par mot
git diff --word-diff # Format texteAstuces :
- Toujours exclure les fichiers générés (lock, build artifacts)
- Utiliser word-diff après reformatage automatique
- Créer des aliases pour les vues fréquentes
Application : API Docs - Générateur de documentation
Problématique : Besoin de travailler sur plusieurs branches simultanément
Apprentissage :
- Créer plusieurs répertoires de travail pour un même repo
- Travailler sur plusieurs branches en parallèle
- Pas besoin de stash ou commit pour changer de contexte
Commandes clés :
git worktree add <path> <branch> # Créer nouveau worktree
git worktree list # Lister tous les worktrees
git worktree remove <path> # Supprimer worktree
git worktree prune # Nettoyer références obsolètesCas d'usage :
- Review de PR pendant développement
- Hotfix urgent pendant feature
- Tester plusieurs approches en parallèle
- Build/deploy pendant développement
Application : Weather CLI - Prévisions météo
Problématique : Besoin d'un commit spécifique sur une autre branche
Apprentissage :
- Appliquer des commits spécifiques d'une branche à une autre
- Sélection chirurgicale de changements
- Gérer les conflits potentiels
Commandes clés :
git cherry-pick <hash> # Appliquer un commit
git cherry-pick <hash1> <hash2> # Plusieurs commits
git cherry-pick --continue # Après résolution conflit
git cherry-pick --abort # AbandonnerCas d'usage :
- Hotfix à appliquer sur plusieurs branches
- Feature développée sur mauvaise branche
- Extraction de commit spécifique d'une grosse PR
14 - SUBMODULES : Version-pin external dependencies (4-5 min)
- Application : Plugin System
- Gestion de dépendances externes versionnées
git submodule add/update --init --recursive
15 - SUBTREE : Alternative plus simple (4-5 min)
- Application : Shared Utils
- Plus simple que submodules, pas de --recursive
git subtree add/pull/push --prefix
16 - FILTER-BRANCH : Réécrire l'historique (4-5 min)
- Application : Logger
- Supprimer fichiers/secrets de tout l'historique
⚠️ Destructif, uniquement sur branches non partagées- Alternative moderne :
git filter-repo
17 - RERERE : Réutiliser résolutions de conflits (4-5 min)
- Application : Recipe Book
- Enregistrer et réutiliser résolutions
- Utile pour rebases répétés
18 - CHECKOUT : Opérations fichiers (legacy) (3-4 min)
- Opérations au niveau fichier
- Remplacé par
git restoreetgit switch(Git 2.23+)
- Sécurité : Git ne perd presque jamais rien (reflog = 90 jours)
- Historique : Reset pour local, Revert pour pushé
- Modernité : Restore/Switch pour plus de clarté
- Debugging : Bisect et Log sont vos meilleurs amis
- Propreté : Rebase interactif avant de partager
- Git Hero : Démos interactives prêtes à l'emploi
- Chaque exemple : setup.sh → demo.sh → reset.sh
- Mode
--no-pausepour tests rapides
git reflog # Tout récupérer
git stash # Sauver rapidement
git revert HEAD # Annuler proprement
git bisect run npm test # Trouver bugs automatiquement
git log --grep="fix" # Chercher dans historiqueLes exemples sont organisés dans l'ordre de présentation :
- 01-stash - Quotidien
- 02-merge - Quotidien
- 03-restore - Quotidien
- 04-reflog - Quotidien
- 05-rebase-interactive - Historique propre
- 06-fixup - Historique propre
- 07-reset - Historique propre
- 08-revert - Historique propre
- 09-bisect - Debugging
- 10-log - Debugging
- 11-diff - Debugging
- 12-worktree - Avancé
- 13-cherry-pick - Avancé
- 14-submodules - Avancé
- 15-subtree - Avancé
- 16-filter-branch - Avancé
- 17-rerere - Avancé
- 18-checkout - Avancé (legacy)
Préparé pour NG Baguette Conf 2026 - Paris, 29 Mai 2026