Bibliothèque · Notes de lecture

Pro Git

De Scott Chacon et Ben Straub. La référence officielle de Git, gratuite et traduite en français.

FR EN
Couverture de Pro Git, Chacon et Straub

Pro Git

Pro Git

9 /10

« Gratuit, officiel, traduit en français : il n'y a aucune excuse de ne pas l'avoir lu. »

  • AuteursScott Chacon, Ben Straub
  • Édition2e éd. 2014 · 501 pages
  • ÉditeurApress · Creative Commons BY-NC-SA
  • Lire en lignegit-scm.com/book/fr · gratuit
  • Goodreads4,26/5 · 16 842 notes
  • Fiche~9 min de lecture
Notation du livre sur 5 dimensionsIdées8/10Applicable9/10Lisibilité8/10Actualité9/10Exemples9/10

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.

git reset : cascade sur les trois arbres 1. HEAD dernier commit — toujours déplacé --soft s'arrête ici 2. Index (staging) remis à l'état de HEAD --mixed défaut — s'arrête ici 3. Working Directory vos fichiers écrasés ⚠ --hard données perdues si non commités pourquoi reset est prévisible : même cascade, trois points d'arrêt
--soft touche HEAD seulement · --mixed touche HEAD + Index · --hard touche tout

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

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)

Voir toute la bibliothèque

D'autres fiches arrivent : un livre à la fois, la substantifique moelle seulement.