Aller au contenu

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 bisect peut 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

<type>(<scope>): <description>

[body optionnel]

[footer optionnel]

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