Aller au contenu principal

Explorer l'historique avec git log

Module 01 45 min

Objectifs de la section

  • Parcourir l'historique des commits avec différents formats
  • Filtrer l'historique par auteur, date, fichier ou message
  • Visualiser les branches graphiquement
  • Rechercher des changements spécifiques dans l'historique

git log de base

git log

Sortie :

commit d5a1b4c2e3f4a5b6c7d8e9f0a1b2c3 (HEAD -> main)
Author: Alice Dupont <alice@exemple.com>
Date: Wed Mar 18 14:30:00 2026 +0000

feat(auth): ajouter l'endpoint de connexion utilisateur

commit c2e8f3a1b2c3d4e5f6a7b8c9d0e1f2 (origin/main)
Author: Alice Dupont <alice@exemple.com>
Date: Tue Mar 17 10:15:00 2026 +0000

fix(utils): corriger la normalisation d'email

Formats essentiels de git log

# Compact : une ligne par commit
git log --oneline

# Avec le graphe des branches/tags
git log --oneline --graph

# Graphe complet avec toutes les branches
git log --oneline --graph --decorate --all

# Détaillé : statistiques (fichiers modifiés, insertions, suppressions)
git log --stat

# Détaillé : diff complet de chaque commit
git log -p # ou --patch

# Afficher uniquement les N derniers commits
git log -5
git log -10 --oneline

Exemple de sortie de --oneline --graph --all

* d5a1b4c (HEAD -> main) feat: ajout tableau de bord
* c2e8f3a fix: corriger la validation d'email
|| * b7c9d1e (feature/login) feat: UI du formulaire de connexion
|| * a3f4b2c feat: démarrer la fonctionnalité de connexion
||/
* e1f2a3b Commit initial

Filtrer l'historique

Par auteur

git log --author="Alice"
git log --author="alice@exemple.com"

Par date

# Depuis une date spécifique
git log --since="2026-01-01"
git log --after="2 weeks ago"
git log --after="yesterday"

# Avant une date spécifique
git log --until="2026-03-01"
git log --before="1 month ago"

# Entre deux dates
git log --after="2026-01-01" --before="2026-03-01"

Par message de commit

# Rechercher un mot-clé dans les messages
git log --grep="fix"
git log --grep="feat(auth)"

# Recherche insensible à la casse
git log --grep="login" -i

Par fichier

# Seulement les commits qui ont touché un fichier spécifique
git log -- README.md
git log -- src/auth/login.py

# Seulement les commits qui ont touché un dossier
git log -- src/

# Commits qui ont touché un fichier, même après renommage
git log --follow -- src/auth/login.py

Par contenu (Pickaxe)

# Commits qui ont AJOUTÉ ou SUPPRIMÉ une chaîne spécifique
git log -S "password" # Ajout/suppression du mot "password"
git log -S "def login" # Ajout/suppression de la fonction login

# Commits où le contenu a CHANGÉ (regex)
git log -G "password.*hash"

Formatage de la sortie

Format personnalisé

git log --format="%h %an %ar %s"
# %h = hash court
# %H = hash complet
# %an = nom de l'auteur
# %ae = email de l'auteur
# %ar = date relative ("il y a 3 jours")
# %ad = date absolue
# %s = sujet du commit (première ligne)
# %b = corps
# %d = refs (branches, tags)

# Exemple de sortie :
# d5a1b4c Alice Dupont il y a 2 jours feat: ajout tableau de bord

Formats utiles

# Compact avec date relative
git log --format="%C(yellow)%h%C(reset) %C(blue)%ar%C(reset) %s %C(green)(%an)%C(reset)"

# Exporter vers un fichier pour documentation
git log --format="%h|%an|%ar|%s" > historique-commits.csv

git show — Détails d'un commit

# Afficher les détails du dernier commit
git show

# Afficher un commit spécifique
git show d5a1b4c
git show HEAD # Dernier commit
git show HEAD~1 # Avant-dernier commit
git show HEAD~3 # 4ème commit avant HEAD

# Afficher un fichier spécifique dans un commit
git show d5a1b4c:src/main.py

# Afficher seulement les fichiers modifiés (sans diff)
git show --stat d5a1b4c
git show --name-only d5a1b4c

Références relatives

RéférenceSignification
HEADCommit actuel (dernier sur la branche actuelle)
HEAD~1 ou HEAD~Commit parent (1 avant HEAD)
HEAD~33 commits avant HEAD
HEAD^Premier parent de HEAD (identique à HEAD~1)
HEAD^2Deuxième parent de HEAD (pour les merges)
main~55 commits avant la pointe de main
abc1234Un commit spécifique par son hash
v1.0Un tag

git blame — Qui a changé quoi ?

# Afficher qui a modifié chaque ligne d'un fichier en dernier
git blame README.md

# Ignorer les changements d'espaces
git blame -w README.md

# Afficher seulement des lignes spécifiques
git blame -L 10,20 src/main.py

# Afficher à un commit spécifique
git blame d5a1b4c -- src/main.py

Sortie :

d5a1b4c (Alice  2026-03-18 14:30 +0000  1) # Mon Projet
c2e8f3a (Bob 2026-03-10 09:15 +0000 2)
c2e8f3a (Bob 2026-03-10 09:15 +0000 3) ## Installation
a3f4b2c (Alice 2026-03-01 08:00 +0000 4)
git blame ne sert pas à blâmer !

Malgré son nom, git blame est un outil de collaboration, pas pour accuser les collègues. Utilisez-le pour comprendre pourquoi du code a été écrit d'une certaine façon, qui interroger pour du contexte, et localiser le commit qui a introduit un changement.


Recherche dans l'historique

# Quand une fonction a-t-elle été ajoutée ?
git log -S "def authentifier" --oneline

# Quand une variable a-t-elle été renommée ?
git log -S "user_id" --oneline -- src/

# Voir le changement exact
git log -p -S "def authentifier" --oneline

Alias pratiques pour le log

Ajoutez-les à votre ~/.gitconfig :

git config --global alias.lg "log --oneline --graph --decorate --all"
git config --global alias.ll "log --oneline -15"
git config --global alias.lp "log -p -1"
git config --global alias.ls "log --stat -5"
git config --global alias.lf "log --format='%C(yellow)%h%C(reset) %C(blue)%ar%C(reset) %s %C(green)(%an)%C(reset)'"

Tableau récapitulatif

CommandeDescription
git logHistorique complet
git log --onelineHistorique compact
git log --graph --allGraphe visuel de toutes les branches
git log --statHistorique avec statistiques
git log -pHistorique avec diffs
git log --author="X"Filtrer par auteur
git log --since="date"Filtrer par date
git log --grep="texte"Filtrer par message
git log -S "code"Rechercher par contenu
git log -- fichierCommits affectant un fichier
git show <commit>Détails d'un commit
git blame <fichier>Qui a modifié chaque ligne

Prochaines étapes