Bibliothèque · Résumé et avis

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

8.6 /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, et vous pouvez le recalculer vous-même :

echo "bonjour" | git hash-object --stdin   # → le SHA-1 du contenu, calculé sous vos yeux
git cat-file -t HEAD                       # → "commit" : le type de l'objet
git cat-file -p HEAD                       # → le commit en clair (arbre, parent, auteur, message)

Le même contenu donne toujours le même hash : modifier un fichier sans que Git le sache est donc impossible. Git ne fait presque qu'ajouter des données : une fois un commit enregistré, il est quasi indestructible. La seule vraie exception, qui efface pour de bon : 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

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.

Un dîner de famille où tout le monde tourne le dos à un développeur penaud, son ordinateur affichant un graphe de branches Git ; même le chien détourne le regard
Il a force-pushé un rebase sur la branche partagée. Même le chien est déçu.

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, arborescences, 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 : chaque fichier, arborescence et commit jamais enregistré, indexé par hash
  • refs/ : les pointeurs nommés vers des commits (branches, tags, remotes)
  • HEAD : la branche sur laquelle vous vous trouvez
  • index : la zone de staging : le prochain snapshot en cours de construction

Et ce ne sont pas des abstractions : les commandes de plomberie vous les font toucher du doigt.

git cat-file -p HEAD          # le commit : un tree, un parent, l'auteur, le message
git cat-file -p HEAD^{tree}   # le tree : la liste des fichiers + le hash de chacun
git ls-files --stage         # l'index : ce qui ira dans le prochain commit

C'est tout Git. Tout le reste (branches, merge, rebase) est construit par-dessus ces quatre éléments.

Trois choses que je ne savais pas avant de le lire

Mon avis, honnêtement

J'ai utilisé Git pendant des années comme tout le monde : en tapant les mêmes cinq commandes et en croisant les doigts. Les trois premiers chapitres m'ont enlevé le croisage de doigts : les snapshots, les trois états, les branches qui ne sont que des pointeurs. Le fameux « pourquoi » derrière les commandes, en moins de 100 pages. Même après des années de Git, on y apprend des choses.

Le milieu du livre est plus inégal. Monter son propre serveur Git ? Utile si vous vous appelez GitLab. Le chapitre GitHub a pris un coup de vieux, captures d'écran en tête. Mon parcours conseillé : chapitres 1 à 3, puis sautez directement au 7.

Et si vous faites votre Git dans VS Code ou GitHub Desktop, aucune honte, moi aussi. Mais le jour où l'interface fait un truc bizarre, c'est ce livre qui vous sauve. Comprendre les trois arbres de reset, c'est l'assurance anti-panique, quelle que soit l'interface.

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.