La référence Git officielle, gratuite, traduite en français. Des commits aux internals du .git.
Pourquoi ce livre
Pro Git a été écrit par Scott Chacon, co-fondateur de GitHub, et Ben Straub, contributeur Git de longue date. C'est le livre officiel recommandé sur git-scm.com. Contrairement à la majorité des livres techniques qui vieillissent ou deviennent payants, celui-là reste gratuit, est mis à jour régulièrement (la version lue date d'avril 2024) et est disponible en plus de 40 langues, dont le français complet.
Ce qui le distingue d'une page de man ou d'un tutoriel : il explique pourquoi Git fonctionne ainsi. Le modèle de branches, les trois arbres de reset, le chapitre sur les internals ne sont pas là pour faire savant. Ils construisent un modèle mental qui rend les parties confuses évidentes. Une fois que vous comprenez qu'une branche est juste un fichier de 41 octets, plus rien dans le comportement des branches ne vous surprend.
Les idées qui restent
1Snapshots, pas des diffs : le changement de paradigme
Git ne stocke pas ce qui a changé. Il prend une photo de tout, à chaque commit. « Avec Git, chaque fois que vous committez, Git prend une photo de l'état de tous vos fichiers à ce moment et stocke une référence à ce snapshot » (p. 14). Les autres systèmes (CVS, Subversion) stockent les fichiers plus une série de deltas. Pour reconstruire la version 37, ils rejouent toutes les modifications depuis la version 1. Git stocke directement la version 37. C'est pour ça que Git n'a pas besoin du serveur pour consulter l'historique, qu'il est rapide, et que chaque clone est une sauvegarde complète.
2Tout a une empreinte SHA-1 : rien ne se perd en silence
« Tout ce qui est stocké dans Git est vérifié par une somme de contrôle avant d'être stocké, puis référencé par cette empreinte » (p. 15). Cette empreinte est un hash SHA-1 : 40 caractères hexadécimaux comme 24b9da6552252987aa493b52f8696cd6d3b00373. Modifier le contenu d'un fichier sans que Git le sache est impossible. Git ne fait presque qu'ajouter des données : une fois un commit enregistré, il est quasi indestructible. La seule vraie exception : git reset --hard.
3Les trois états et la zone de staging
Un fichier dans Git est dans l'un des trois états : modifié (changé mais pas encore indexé), indexé (marqué pour le prochain commit), ou enregistré dans Git (sauvegardé de façon permanente). La zone de staging est la pièce maîtresse : c'est un fichier dans .git/ qui contient exactement ce qui ira dans le prochain snapshot. C'est ce qui permet de ne commiter qu'une partie de ses changements, ou de construire un commit propre depuis un travail brouillon. Beaucoup d'utilisateurs le bypasse avec git commit -a, qui indexe et commite d'un coup tous les fichiers modifiés, sans sélection possible.
git add README.md # indexe un seul fichier git add -p # indexe des morceaux de fichiers git commit -m "message" # commite exactement ce qui est indexé
4Une branche = un fichier de 41 octets
Sous Subversion, créer une branche copiait physiquement les fichiers, parfois plusieurs minutes sur un grand projet. Sous Git, c'est un fichier de 41 octets. Le livre l'explique ainsi : « Une branche dans Git est simplement un pointeur léger et déplaçable sur l'un de ces commits » (p. 64). Git écrit ce fichier dans .git/refs/heads/ et c'est tout. À chaque commit, le pointeur avance automatiquement.
# Une branche, c'est littéralement ce fichier : $ cat .git/refs/heads/main ca82a6dff817ec66f44342007202690a93763949 git branch feature # crée un fichier de 41 octets git checkout feature # déplace HEAD sur ce fichier
5HEAD : le pointeur qui pointe sur un pointeur
HEAD est un fichier qui contient le nom de votre branche courante (ref: refs/heads/main), qui elle-même pointe vers le dernier commit. Faire un git checkout main met HEAD à jour vers main. Commiter déplace le pointeur de main vers le nouveau commit. HEAD suit automatiquement. Si vous faites un git checkout sur un SHA-1 directement au lieu d'un nom de branche, HEAD pointe alors sur un commit sans branche : c'est le mode "detached HEAD" : tout commit fait dans cet état se retrouve sans rattachement, et disparaîtra au prochain changement de branche si vous ne créez pas de branche à partir de là.
6La règle d'or du rebase
Un merge produit un commit de fusion qui marque la jonction de deux branches, visible dans l'historique pour toujours. Le rebase évite ce commit en rejouant vos changements directement sur la branche cible, donnant un historique en ligne droite. La règle d'or du livre, formulée sans détour : « Ne rebasez pas des commits qui existent en dehors de votre dépôt et sur lesquels d'autres développeurs ont peut-être fondé leur travail. Si vous respectez cette règle, tout ira bien. Sinon, les gens vous haïront, et vos amis et votre famille vous mépriseront. » La raison : rebaser réécrit les hashes SHA-1. Si quelqu'un a basé son travail sur les anciens hashes, forcer un push rebasé crée des historiques contradictoires difficiles à réconcilier.
7Reset démystifié : le modèle des trois arbres
La commande git reset est confuse parce qu'elle fait des choses très différentes selon le flag. Pro Git résout ça avec un modèle : Git gère en permanence trois "arbres" (trois collections de fichiers). Une fois qu'on les comprend, reset devient prévisible.
Les trois arbres : HEAD = le snapshot du dernier commit (ce qui est "enregistré") ; l'Index = le prochain commit en cours de construction (ce qu'on appelle la zone de staging) ; le Working Directory = vos fichiers tels qu'ils sont sur disque, le bac à sable.
Reset opère toujours dans le même ordre : il déplace d'abord HEAD, puis met à jour l'Index, puis met à jour le Working Directory. Il s'arrête là où vous lui dites.
Ce modèle explique des comportements qui semblent arbitraires : git reset HEAD fichier.txt (sans commit cible) dé-stage un fichier parce que reset met l'Index à l'état de HEAD pour ce fichier spécifiquement. git reset --hard est l'unique mode dangereux car c'est le seul qui touche votre Working Directory. « Cette option est la seule façon de rendre la commande reset dangereuse » (p. 262).
8Git est un système de fichiers adressable par contenu
Le chapitre 10 commence par : « Git est fondamentalement un système de fichiers adressable par contenu avec une interface utilisateur de contrôle de version construite par-dessus » (p. 414). Tout ce qui est stocké dans Git (contenu de fichiers, arborescence de répertoires, commits) est un objet adressé par son hash SHA-1. Le dossier .git/ contient quatre éléments qui comptent vraiment : objects/ (la base de données), refs/ (les pointeurs nommés vers les commits), HEAD (la branche courante), et index (la zone de staging). C'est tout Git.
Trois choses que je ne savais pas avant de le lire
- Git a été écrit en environ deux semaines. Après que BitKeeper a révoqué son accès gratuit en 2005, Linus Torvalds a construit Git from scratch. Le premier commit de Git, daté du 7 avril 2005, est dans l'historique de Git lui-même. Le noyau Linux y a migré dans la foulée.
- La branche
mastern'est pas spéciale. « La branche 'master' dans Git n'est pas une branche particulière. Elle est identique à n'importe quelle autre branche. Si elle existe dans presque tous les dépôts, c'est uniquement parce que la commande git init la crée par défaut » (p. 64). Vous pouvez la supprimer, la renommer, ne jamais l'utiliser. - La distinction "plomberie" vs "porcelaine" : quand une commande courante (checkout, push, merge) échoue avec un message cryptique, c'est souvent la porcelaine qui enrobe mal une erreur de plomberie. Connaître
git cat-fileougit ls-filespermet de descendre d'un niveau et de comprendre ce qui bloque réellement.
Mon avis, honnêtement
Les trois premiers chapitres sont parmi les meilleures introductions à Git disponibles gratuitement. Le modèle de snapshots, les trois états, et les branches comme pointeurs valent la lecture même si vous utilisez Git depuis des années. Beaucoup d'utilisateurs ont une intuition empirique de l'outil : ils savent quoi taper, pas pourquoi ça marche. Ces chapitres fournissent ce "pourquoi" en moins de 100 pages.
Les chapitres 4 à 6 sont plus inégaux. La configuration d'un serveur Git est utile si vous hébergez vous-même ; inutile si vous êtes sur GitHub. Le chapitre GitHub était précis à l'écriture, mais GitHub a suffisamment changé pour que certaines captures d'écran et workflows soient datés. Pour la plupart des usages, je passerais directement au chapitre 7 après le chapitre 3.
En 2026, de nombreux développeurs interagissent avec Git via l'interface de VS Code ou GitHub Desktop. C'est très bien, mais ce livre vous apprendra des choses que ces interfaces cachent silencieusement. Comprendre les trois arbres de reset, par exemple, fait de vous un meilleur utilisateur de n'importe quelle interface Git.
Odilon
Toujours valable en 2026 ?
La version lue date d'avril 2024. Git lui-même n'a pas changé fondamentalement depuis la deuxième édition : les objets SHA-1, les refs, la zone de staging, le modèle de branches, tout est identique. La principale mise à jour : le livre utilise maintenant git restore et git switch (introduits en Git 2.23) aux côtés des anciennes formes git checkout et git reset. Le chapitre GitHub vieillit plus vite que le reste. Le chapitre sur les internals reste très stable : les objets SHA-1, les refs et le format du dossier .git/ n'ont pas changé depuis la création de Git.
Pour qui ?
Lisez-le si
- Vous utilisez Git tous les jours mais devinez parfois ce qu'une commande va faire
- Vous avez cassé quelque chose avec reset ou rebase et voulez comprendre pourquoi
- Vous voulez savoir ce qu'il y a vraiment dans
.git/ - Vous avez du temps libre : il est gratuit, il n'y a aucune raison de ne pas le lire
Passez si
- Vous cherchez un tutoriel rapide : la doc git-scm.com ou les guides Atlassian sont plus directs pour ça
- Vous cherchez des stratégies de workflow d'équipe (Gitflow, trunk-based) : le livre les couvre légèrement
- Vous êtes déjà expert Git : les chapitres 1 à 3 ne vous apprendront probablement rien
Pour aller plus loin
Les concepts de ce livre se pratiquent directement dans le cours Git et Terminal de ce site. Pour les workflows d'équipe et les stratégies de branches, la documentation officielle GitHub est plus à jour que le chapitre 6. Pour les internals en profondeur, le livre lui-même renvoie au code source de Git, qui est étonnamment lisible.
Commentaires (0)