Pourquoi Git existe
Le problème que Git résout et les trois zones de travail.
Objectifs
À la fin de cette leçon, vous saurez :
- expliquer le problème que Git résout, avec vos mots ;
- situer working directory, zone de staging et dépôt ;
- décrire ce qu'est un commit et ce que garantit la chaîne d'historique ;
- comprendre pourquoi « distribué » change tout.
Le problème sans versioning
Sans outil dédié, tout projet qui dure finit ainsi :
projet.zip
projet-final.zip
projet-final-v2.zip
projet-final-v2-corrigé.zip
projet-final-v2-corrigé-VRAIMENT-final.zip
Trois problèmes, tous fatals à terme :
- On ne sait plus quelle version est la bonne, ni pourquoi elle a changé — l'information vit dans votre mémoire, qui s'efface ;
- Impossible de revenir en arrière proprement : la correction d'hier a cassé ce qui marchait, et l'ancienne version n'existe plus ;
- Travailler à plusieurs devient un cauchemar : qui a la dernière version ? Comment fusionner deux modifications faites en parallèle ?
Git répond aux trois : il enregistre chaque état du projet avec son auteur, sa date et son message explicatif, dans une base locale appelée dépôt (repository). Revenir en arrière devient un déplacement dans l'historique ; collaborer devient une synchronisation contrôlée. C'est pour cela que Git est présent dans pratiquement chaque projet logiciel au monde — y compris celui-ci : le site Devmind que vous lisez est servi depuis un dépôt Git.
Les trois zones de travail
Le modèle mental qui explique TOUTES les commandes Git locales :
Working directory Staging area Dépôt (.git)
(vos fichiers) → (ce qui partira → (l'historique
au prochain commit) permanent)
- Le working directory : vos fichiers tels qu'ils sont sur le disque, en train d'être modifiés.
- La zone de staging : la sélection exacte des modifications que vous décidez d'enregistrer au prochain commit.
- Le dépôt (le dossier caché
.git/) : la chaîne des commits déjà gravés.
Suivons le flux complet sur un exemple concret :
vous modifiez index.html → changement visible dans le working directory
git add index.html → le changement monte dans la staging area
git commit -m "..." → le contenu de la staging area devient un commit
dans le dépôt ; la staging se vide
Ce découpage est LA clé de Git, et sa spécificité la plus déroutante au début : on ne commite pas « son travail » globalement, on choisit précisément ce qui entre dans chaque commit. Vous avez corrigé trois choses différentes ? Trois commits distincts, chacun lisible. Cette liberté produit des historiques compréhensibles — vous le verrez au mini-défi final du chapitre.
Un commit, c'est quoi exactement
Un commit est une photo complète du projet à un instant T, accompagnée de métadonnées :
| Métadonnée | Rôle |
|---|---|
| hash | identifiant unique de cette photo |
| parent | référence vers le commit précédent |
| auteur + date | qui, quand |
| message | POURQUOI ce changement existe |
A ← B ← C ← D (D est le dernier commit ; main pointe vers D)
Deux propriétés fondamentales découlent de cette structure chaînée :
Rien n'est jamais perdu. Chaque commit connaît son parent : revenir en arrière, c'est simplement viser un maillon antérieur de la chaîne. Vos « vieilles versions » ne sont pas des zip poussiéreux, elles sont toutes là, adressables par leur hash.
L'historique est infalsifiable. Le hash est calculé sur le contenu : arborescence complète + métadonnées + parent. Modifier un seul octet d'un ancien commit changerait son hash, donc casserait le lien de son enfant — toute altération est immédiatement visible. C'est cette propriété qui permet de faire confiance à un historique partagé entre dizaines de personnes.
Précision utile contre une idée reçue : Git ne stocke pas des diffs mais des instantanés — chaque commit référence l'état complet des fichiers (avec déduplication interne pour ce qui n'a pas changé). Conséquence pratique : consulter n'importe quelle version passée est instantané, quel que soit l'âge du commit.
Git est distribué
Votre dépôt complet — tout l'historique — vit sur votre machine. Contrairement aux anciens systèmes centralisés, vous pouvez versionner, brancher, comparer sans aucune connexion. Un remote (GitHub, GitLab) n'est qu'une copie supplémentaire de cet historique, synchronisée volontairement, dont le seul but est de partager le travail. Nous y reviendrons après avoir maîtrisé le local — car le local EST le cœur de Git.
Exercice
- Avec vos propres mots, expliquez la différence entre working directory et zone de staging.
- Dessinez la chaîne de commits après trois commits successifs, avec la position de
main. - Que contient selon vous le hash d'un commit ? Pourquoi deux commits différents ne peuvent-ils pas partager le même hash ?
- Votre collègue dit : « j'ai fait une erreur hier, je voudrais retrouver mon fichier d'avant-hier ». Qu'est-ce que Git lui répond ?
Résumé
- Sans versioning : versions empilées, retours impossibles, collaboration impossible.
- Git = historique complet, local, distribué, infalsifiable.
- Trois zones : fichiers (working directory) → sélection (staging) → historique (dépôt).
- Commit = photo complète signée, datée, chaînée à son parent.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Question 1. Le working directory reflète votre travail courant, y compris le brouillon et les essais ; la staging area est la sélection explicite des changements qui composeront le prochain commit. Conséquence concrète : on peut modifier dix fichiers et n'en committer que deux — ou committer un fichier partiellement. La staging est le filtre entre « ce que je bricole » et « ce qui entre dans l'histoire ».
Question 2.
C1 ← C2 ← C3
↑
main (et HEAD pointe main : « vous êtes ici »)
Chaque commit pointe son parent ; main est une simple étiquette collée sur le dernier.
Question 3. Le hash est calculé sur le contenu complet du commit : l'arborescence des fichiers, les métadonnées (auteur, date, message) et le hash du parent. Deux commits différents diffèrent forcément sur au moins un de ces éléments, donc leurs contenus calculés diffèrent — même modification refaite à un autre moment donne un autre hash (la date change). C'est cette sensibilité au moindre octet qui rend l'historique infalsifiable.
Question 4. « Aucun problème : ton fichier existe encore dans l'historique. » Si l'état d'avant-hier a été commité, il suffit de retrouver le commit correspondant (git log) et de consulter ou restaurer le fichier depuis cette photo. C'est exactement le problème n°2 de l'introduction (« impossible de revenir en arrière ») que Git rend trivial — à condition d'avoir commité régulièrement : un outil d'historique ne peut restituer que ce qu'on lui a confié.