Fondamentaux Git¶
Comprendre le modèle Git — les 3 zones, les commits atomiques et les messages conventionnels.
Pourquoi versionner son code¶
Le versioning n'est pas un luxe — c'est la base de toute collaboration et de toute traçabilité. Sans versioning :
- impossible de revenir a un état stable après un changement casse
- impossible de travailler a plusieurs sur le même code sans écraser le travail des autres
- impossible de comprendre pourquoi un changement a été fait il y a 6 mois
Systèmes centralises vs distribués¶
| Critère | Centralise (SVN) | Distribué (Git) |
|---|---|---|
| Dépôt | Un seul serveur central | Chaque développeur a une copie |
| Travail hors ligne | Impossible | Complet (commit, branch, merge) |
| Vitesse | Dépend du réseau | Opérations locales = instantanées |
| Point de défaillance | Serveur central | Aucun — tout le monde à l'historique |
Git a remplacé SVN, Mercurial et les autres parce qu'il combine vitesse, branchement léger et résilience.
Le modèle Git — les 3 zones¶
Tout dans Git repose sur trois zones distinctes. Comprendre ces zones, c'est comprendre 80% de Git.
graph LR
WD["Working Directory<br/>(vos fichiers)"] -->|"git add"| SA["Staging Area<br/>(index)"]
SA -->|"git commit"| LR["Repository<br/>(historique .git)"]
LR -->|"git checkout"| WD
SA -->|"git restore --staged"| WD Working Directory¶
C'est votre répertoire de travail — les fichiers que vous voyez et editez. Git les compare en permanence avec la dernière version committee pour détecter les modifications.
Staging Area (index)¶
Zone intermédiaire entre le working directory et le repository. Vous choisissez précisément quels changements inclure dans le prochain commit avec git add. C'est cette étape qui permet les commits atomiques : vous pouvez modifier 10 fichiers mais n'en committer que 3.
Repository (.git)¶
L'historique complet de votre projet. Chaque commit est un snapshot immutable identifié par un hash SHA-1. Le repository contient toutes les branches, tous les tags et toutes les metadonnees.
Le DAG — Directed Acyclic Graph
L'historique Git n'est pas une liste lineaire — c'est un graphe orienté acyclique. Chaque commit pointe vers un ou plusieurs parents. Les branches sont simplement des pointeurs mobiles vers un commit. Comprendre le DAG, c'est comprendre pourquoi merge, rebase et cherry-pick fonctionnent comme ils fonctionnent.
Commits atomiques¶
Un commit atomique représenté un seul changement logique. Pas "toutes les modifs de la journée", pas "WIP", pas "fix stuff".
Pourquoi c'est important¶
- Bisect :
git bisectpeut identifier le commit exact qui a introduit un bug — mais seulement si chaque commit est un changement isole - Revert : annuler un commit atomique est propre. Annuler un commit fourre-tout casse tout
- Review : un commit de 50 lignes sur un sujet se review en 5 minutes. Un commit de 500 lignes sur 8 sujets ne se review pas
Règles pratiques¶
| Règle | Exemple |
|---|---|
| Un commit = un changement logique | "ajouter la validation email" et non "fix stuff" |
| Si vous dites "et" dans le message, scindez | "ajouter validation et corriger le header" → 2 commits |
| Chaque commit compile et passe les tests | Jamais de commit qui casse le build |
Messages de commit conventionnels¶
Un bon message de commit explique le pourquoi, pas le quoi (le quoi se lit dans le diff).
Format Conventional Commits¶
Types standards¶
| Type | Usage |
|---|---|
feat | Nouvelle fonctionnalité |
fix | Correction de bug |
docs | Documentation uniquement |
style | Formatage, pas de changement de logique |
refactor | Ni fix ni feat — restructuration du code |
test | Ajout ou modification de tests |
chore | Maintenance (deps, CI, scripts de build) |
perf | Amélioration de performance |
Exemples¶
feat(auth): ajouter la validation email a l'inscription
Le formulaire acceptait les emails invalides, ce qui causait des
erreurs silencieuses lors de l'envoi du mail de confirmation.
Closes #42
fix(api): corriger le timeout sur les requetes longues
Le timeout par defaut de 30s etait trop court pour les exports CSV
de plus de 10 000 lignes. Passe a 120s avec un header de progression.
Messages a éviter
fix, update, WIP, misc, changes, stuff — ces messages ne servent à personne. Dans 6 mois, vous ne saurez pas pourquoi ce changement a été fait.
Outils¶
| Outil | Description | Lien |
|---|---|---|
| git | CLI Git — l'outil de base | git-scm.com |
| gitk | Visualiseur d'historique intégré a Git | Inclus avec Git |
| tig | Interface terminal pour naviguer dans l'historique | github.com/jonas/tig |
| lazygit | TUI Git interactive avec staging partiel et log | github.com/jesseduffield/lazygit |