Afficher un historique avec git log –graph
git log affiche les commits sous forme de liste plate, du plus récent au plus ancien. git log --graph ajoute un dessin : Git montre en texte, à gauche de chaque commit, la forme de l’historique, et l’on voit où les branches se séparent et où elles se rejoignent. La documentation de git log le décrit comme une représentation graphique textuelle de l’historique des commits, et précise que Git peut ajouter des lignes entre les commits pour que le dessin reste correct.
Pour suivre, créez un dépôt jetable dans bash ou zsh. Toutes les dates sont fixées : avec exactement ces commandes, vous devriez obtenir les mêmes identifiants que dans les sorties ci-dessous. Changez un seul caractère et les vôtres seront différents. Les sorties viennent de Git 2.23, en anglais, et sont identiques avec Git 2.30 et 2.54.
mkdir demo-log && cd demo-log
git init
git config user.name "Example Dev"
git config user.email [email protected]
commit_at() { git add . && GIT_AUTHOR_DATE="$1" GIT_COMMITTER_DATE="$1" git commit -q -m "$2"; }
echo "# Demo" > README.md && commit_at 2026-09-01T10:00:00+0000 "Add README"
git branch -M main
echo "start" > app.txt && commit_at 2026-09-02T10:00:00+0000 "Add app skeleton"
echo "port=8080" > config.txt && commit_at 2026-09-03T10:00:00+0000 "Add default config"
git checkout -b feature
echo "search" >> app.txt && commit_at 2026-09-05T10:00:00+0000 "Add search option"
echo "search ok" > tests.txt && commit_at 2026-09-09T10:00:00+0000 "Add search tests"
git checkout main
git checkout -b docs
echo "# Demo guide" > README.md && echo "TODO" > guide.txt && commit_at 2026-09-06T10:00:00+0000 "Draft user guide"
git checkout main
echo "# Demo app" > README.md && commit_at 2026-09-08T10:00:00+0000 "Rename project title"
echo "port=9000" > config.txt && commit_at 2026-09-10T10:00:00+0000 "Change default port"
GIT_AUTHOR_DATE=2026-09-12T10:00:00+0000 GIT_COMMITTER_DATE=2026-09-12T10:00:00+0000 git merge feature --no-edit -m "Merge branch 'feature'"
La fonction commit_at indexe tout et valide à la date indiquée. Le script crée main, une branche feature qui diverge de main, une branche docs dont le commit n’arrive jamais dans main, et un vrai merge de feature dans main. Commencez par les deux commits les plus récents au format complet :
git log --graph -n 2
* commit e6d515ee0fe2be9bcedf2c17df09d1f89e06c799
|\ Merge: d242263 c7bfac7
| | Author: Example Dev <[email protected]>
| | Date: Sat Sep 12 10:00:00 2026 +0000
| |
| | Merge branch 'feature'
| |
| * commit c7bfac7154d36e606685f5b1e10a43a2e5ba7b96
| | Author: Example Dev <[email protected]>
| | Date: Wed Sep 9 10:00:00 2026 +0000
| |
| | Add search tests
Chaque * est un commit. Le |\ sous le premier est le merge qui se sépare en deux colonnes, une par parent, et le second commit, c7bfac7, se trouve dans la colonne de droite. Le format complet devient vite long : on associe donc d’habitude --graph à --oneline --decorate. Voici d’abord la liste plate :
git log --oneline --decorate
e6d515e (HEAD -> main) Merge branch 'feature'
d242263 Change default port
c7bfac7 (feature) Add search tests
3dc02d2 Rename project title
b13288d Add search option
ccb94c7 Add default config
9cfbfd0 Add app skeleton
3d7dc15 Add README
Chaque commit tient sur une ligne : identifiant abrégé, noms de branches entre parenthèses, message. Le guide de git log --oneline détaille ce format et les options qui raccourcissent la sortie. Ajoutez maintenant --graph :
git log --graph --oneline --decorate
* e6d515e (HEAD -> main) Merge branch 'feature'
|\
| * c7bfac7 (feature) Add search tests
| * b13288d Add search option
* | d242263 Change default port
* | 3dc02d2 Rename project title
|/
* ccb94c7 Add default config
* 9cfbfd0 Add app skeleton
* 3d7dc15 Add README
Dans la liste plate, Add search tests, qui vient de feature, s’intercale entre deux commits de main : par défaut, Git trie par date, et rien n’indique à quelle ligne appartient chaque commit. --graph implique --topo-order : d’après la documentation, aucun parent n’est affiché avant tous ses enfants, et les commits de lignes parallèles ne sont pas mélangés. Les deux commits de feature restent donc groupés dans leur colonne.
Ne confondez pas ce dessin avec le fichier commit-graph. Ce fichier est écrit et vérifié par git commit-graph, et sa documentation met en avant des gains de performance, par exemple pour git log -- <chemin>. Il ne dessine rien.
Lire commits, parents et pointeurs de branches
Trois éléments se lisent dans cette sortie : les commits, leurs parents et les noms qui leur sont attachés.
Pour vérifier ce que signifient les lignes entre les commits, demandez à Git les parents de chacun :
git log --format="%h parents: %p"
e6d515e parents: d242263 c7bfac7
d242263 parents: 3dc02d2
c7bfac7 parents: b13288d
3dc02d2 parents: ccb94c7
b13288d parents: ccb94c7
ccb94c7 parents: 9cfbfd0
9cfbfd0 parents: 3d7dc15
3d7dc15 parents:
Le premier commit, 3d7dc15, n’a pas de parent. Les commits ordinaires en ont un. Le merge e6d515e en a deux : d242263 et c7bfac7. Dans le dessin, chaque parent est une ligne qui part du commit vers le bas, et un commit qui en a deux est un merge.
Les noms entre parenthèses sont des références. Dans le glossaire Git, le sommet d’une branche est désigné par une tête de branche, et HEAD est la branche courante. HEAD -> main signifie donc que vous êtes sur main, et (feature) marque le sommet de feature. Listez les branches pour voir où pointe chacune :
git branch -v
docs f8fe6dd Draft user guide
feature c7bfac7 Add search tests
* main e6d515e Merge branch 'feature'
Sur le disque, .git/HEAD contient ref: refs/heads/main. HEAD désigne une branche, et la branche désigne un commit.
Une branche manque dans le graphe : docs. Son commit f8fe6dd n’est pas un ancêtre de HEAD, et git log ne suit les liens de parenté qu’à partir de HEAD, sauf indication contraire. Le guide pour afficher l’historique de toutes les branches présente l’option qui l’ajoute.
Comprendre une divergence et un merge
main et feature partent toutes deux de ccb94c7, « Add default config », et ont chacune reçu deux commits que l’autre n’a pas : c’est une divergence. Pour voir les deux lignes juste avant leur jonction, nommez les deux parents du merge. Dans la syntaxe de révisions de Git, ^1 désigne le premier parent et ^2 le second, comme l’explique gitrevisions :
git log --graph --oneline HEAD^1 HEAD^2
* d242263 Change default port
* 3dc02d2 Rename project title
| * c7bfac7 Add search tests
| * b13288d Add search option
|/
* ccb94c7 Add default config
* 9cfbfd0 Add app skeleton
* 3d7dc15 Add README
La colonne de gauche est le côté de main, celle de droite celui de feature, et |/ montre où elles se rejoignent, en ccb94c7. La fusion de feature dans main a créé e6d515e. Son contenu brut liste les deux sommets :
git cat-file -p HEAD
tree 3080f3ab1b84261cb41c2703c170a850cfeaa0bd
parent d2422638c75fcc7bae1bcc7a041d5a99d66cead8
parent c7bfac7154d36e606685f5b1e10a43a2e5ba7b96
author Example Dev <[email protected]> 1789207200 +0000
committer Example Dev <[email protected]> 1789207200 +0000
Merge branch 'feature'
Il y a deux lignes parent. La première est le sommet de main, la branche sur laquelle vous étiez, et la seconde celui de feature. Le glossaire le dit en termes généraux : un commit de merge a pour parents les sommets des branches fusionnées. Comme e6d515e relie les deux lignes, les commits de feature sont désormais des ancêtres de main, et un simple git log sur main les affiche.
Garder cette forme à deux parents est une façon d’intégrer du travail. Choisir entre merge et rebase la compare à la relecture des commits pour obtenir une ligne droite, et le guide du rebase interactif montre comment ranger des commits locaux avant de les partager. Pour voir ce qu’un commit a modifié, git show affiche son message, son auteur et son diff.
Choisir entre vue terminal et graphe graphique
La vue terminal est toujours disponible, ne demande rien de plus que Git, et sa sortie peut être redirigée vers d’autres commandes. Ses limites apparaissent quand le dépôt grossit : il faut retenir les options qui sélectionnent les branches, un historique large devient un mur de |, et chaque détail de commit coûte une commande de plus.
GitMini dessine le même graphe dans une fenêtre. Ses colonnes sont « Branches / tags », « Graph », « Message », « Author », « Date » et « SHA » (l’en-tête les affiche en capitales). Les lignes du graphe sont colorées, et l’étiquette d’une branche locale reprend la couleur de sa ligne. Branches locales, branches distantes et tags partagent un seul graphe : il n’y a pas d’option --all à retenir.

Cliquez sur un commit : le panneau de droite affiche son SHA avec un bouton de copie, son auteur, ses parents sous forme de liens et les fichiers modifiés avec leurs lignes ajoutées et supprimées. Pour un commit de merge, une liste déroulante placée à côté des parents, nommée « Compare to parent » pour les lecteurs d’écran, choisit le parent auquel la liste de fichiers est comparée. Le premier parent est sélectionné par défaut.

La barre de recherche s’ouvre avec Cmd+F sur macOS ou Ctrl+F ailleurs, ou depuis le bouton « Search » (la loupe) de la barre d’outils. Saisissez une partie d’un message, un auteur ou sha: suivi d’un identifiant. Le premier résultat est sélectionné pendant la saisie, Entrée passe au suivant et Maj+Entrée au précédent. Le graphe n’est pas filtré : vous gardez le contexte autour de chaque résultat.
Vous pouvez aussi faire glisser l’étiquette d’une branche sur une autre branche. Un menu propose un rebase de la branche déplacée sur l’autre si la branche déplacée est locale, et un merge dans l’autre branche si c’est la branche courante.
Utilisez le terminal pour un coup d’œil rapide ou un script, et le graphe quand vous parcourez beaucoup de branches ou ouvrez des commits les uns après les autres.
Sources
- Git : git-log, consulté le 4 octobre 2026.
- Git : git-commit-graph, consulté le 4 octobre 2026.
- Git : gitrevisions, consulté le 4 octobre 2026.
- Git : gitglossary, consulté le 4 octobre 2026.
- README du produit GitMini, consulté le 4 octobre 2026.