Git offre une dizaine de syntaxes pour désigner un commit précis :
SHA court, HEAD~3, main^2, HEAD@{5}, A..B. Comprendre ces
syntaxes est indispensable pour utiliser efficacement log, diff,
reset, rebase et cherry-pick. Ce guide couvre toutes les formes
de sélection de révisions.
Prérequis : Consulter l’historique et Les branches en bref.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Utiliser
^et~pour naviguer dans l’historique commit par commit - Cibler des plages de commits avec les opérateurs
A..BetA...B - Retrouver un commit perdu avec
HEAD@{N}et le reflog - Résoudre n’importe quelle référence en SHA avec
git rev-parse
SHA et SHA court
Section intitulée « SHA et SHA court »Chaque commit est identifié par un hash SHA-1 de 40 caractères :
a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0En pratique, les 7 premiers caractères suffisent (SHA court) :
git show a1b2c3dgit log --oneline # Affiche les SHA courts automatiquementGit résout le SHA court vers le hash complet tant qu’il n’y a pas d’ambiguïté. Pour un projet très gros, utilisez 8 à 12 caractères.
Pour obtenir le SHA complet à partir d’un court :
git rev-parse a1b2c3d# a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0Références de branches et tags
Section intitulée « Références de branches et tags »Les noms de branches et tags sont des alias vers un SHA :
git rev-parse main # SHA du dernier commit de maingit rev-parse v1.2.0 # SHA du commit pointé par le taggit rev-parse HEAD # SHA du commit courantHEAD pointe toujours vers le commit courant (via la branche active).
Ancêtres : ^ et ~
Section intitulée « Ancêtres : ^ et ~ »Deux opérateurs pour naviguer vers les parents d’un commit :
L’opérateur ~ (tilde) — remonter en ligne droite
Section intitulée « L’opérateur ~ (tilde) — remonter en ligne droite »~n remonte de n commits sur le premier parent :
HEAD~0 = HEADHEAD~1 = parent de HEADHEAD~2 = grand-parent de HEADHEAD~3 = arrière-grand-parentgit show HEAD~3 # 3 commits avant HEADgit diff HEAD~5 HEAD # Différences sur les 5 derniers commitsL’opérateur ^ (caret) — choisir un parent
Section intitulée « L’opérateur ^ (caret) — choisir un parent »^n sélectionne le n-ième parent d’un commit de merge :
HEAD^ = HEAD^1 = premier parent (branche dans laquelle on a mergé)HEAD^2 = deuxième parent (branche qui a été mergée)Pour un commit normal (non-merge), ^ et ~ sont équivalents :
HEAD^ = HEAD~1.
Combiner ^ et ~
Section intitulée « Combiner ^ et ~ »HEAD~2^2 = grand-parent de HEAD, deuxième parentHEAD^^ = HEAD~2 (parent du parent, premier parent à chaque fois)HEAD^2~3 = 3 commits avant le deuxième parent de HEADLe reflog : HEAD@{n}
Section intitulée « Le reflog : HEAD@{n} »Le reflog enregistre chaque position de HEAD (et des branches) dans le temps. Contrairement à l’historique (qui suit les commits), le reflog suit les mouvements :
git reflog# a1b2c3d HEAD@{0}: commit: Ajout feature X# e4f5a6b HEAD@{1}: checkout: moving from main to feature# d7c8b9a HEAD@{2}: commit: Fix bug YUtilisation :
git show HEAD@{3} # Position de HEAD il y a 3 mouvementsgit show main@{yesterday} # Où pointait main hiergit show HEAD@{2.hours.ago} # HEAD il y a 2 heuresgit diff HEAD@{0} HEAD@{5} # Ce qui a changé en 5 mouvementsLe reflog est votre filet de sécurité : même après un reset --hard,
le commit précédent reste dans le reflog pendant 90 jours.
Plages de commits
Section intitulée « Plages de commits »Double-point A..B — commits dans B mais pas dans A
Section intitulée « Double-point A..B — commits dans B mais pas dans A »git log main..feature # Commits dans feature, absents de maingit log origin/main..HEAD # Commits locaux non encore poussésCette syntaxe est la plus courante. Elle répond à la question : « quels commits dois-je pousser ? » ou « quels commits apporte cette branche ? ».
Triple-point A...B — commits dans l’un OU l’autre, mais pas les deux
Section intitulée « Triple-point A...B — commits dans l’un OU l’autre, mais pas les deux »git log main...feature # Exclusifs à main OU featuregit log --left-right main...feature # Indique < (main) ou > (feature)Résultat avec --left-right :
< d7c8b9a Fix bug Y (seulement dans main)> a1b2c3d Ajout feature X (seulement dans feature)> e4f5a6b Refactor module Z (seulement dans feature)Exclusion avec --not ou ^
Section intitulée « Exclusion avec --not ou ^ »git log feature --not main # Équivalent à main..featuregit log feature ^main # Même chose (^ en début = exclusion)git log feature ^main ^develop # Dans feature, ni dans main ni developgit rev-parse : l’outil de résolution
Section intitulée « git rev-parse : l’outil de résolution »git rev-parse traduit n’importe quelle syntaxe en SHA :
git rev-parse HEAD~3 # SHA du commit 3 avant HEADgit rev-parse main^2 # SHA du 2e parent du dernier commit de maingit rev-parse --short HEAD # SHA court (7 caractères)git rev-parse --verify HEAD@{5} # Vérifie que la ref existeCas pratiques en scripting :
# Vérifier qu'on est sur mainif [[ "$(git rev-parse --abbrev-ref HEAD)" != "main" ]]; then echo "Pas sur main !" exit 1fi
# Comparer deux branchesMERGE_BASE=$(git merge-base main feature)echo "Point de divergence : $MERGE_BASE"Récapitulatif des syntaxes
Section intitulée « Récapitulatif des syntaxes »| Syntaxe | Signification | Exemple |
|---|---|---|
abc1234 | SHA court | git show abc1234 |
HEAD | Commit courant | git show HEAD |
main | Dernier commit de la branche | git log main |
v1.0 | Commit du tag | git show v1.0 |
HEAD~n | N-ième ancêtre (premier parent) | git show HEAD~3 |
HEAD^n | N-ième parent (merge) | git show HEAD^2 |
HEAD@{n} | N-ième entrée reflog | git show HEAD@{5} |
@{yesterday} | Reflog par date | git show main@{yesterday} |
A..B | Dans B, pas dans A | git log main..feature |
A...B | Exclusifs à A ou B | git log main...feature |
^A / --not A | Exclure A | git log feature ^main |
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
ambiguous argument 'HEAD^' (Windows) | ^ interprété par cmd.exe | Utilisez HEAD^^ ou "HEAD^" entre guillemets |
fatal: bad default revision 'HEAD' | Repo vide, pas de commit | Faites un premier commit |
reflog affiche (unreachable) | Commit orphelin | Normal, récupérable pendant 90 jours |
| SHA court ambigu | Collision de hash partiel | Utilisez plus de caractères (--abbrev=12) |
À retenir
Section intitulée « À retenir »~nremonte de N commits en ligne droite (premier parent)^nchoisit le N-ième parent d’un mergeA..B= commits dans B absents de A (le plus utilisé)A...B= commits exclusifs à l’une ou l’autre branche- Le reflog (
HEAD@{n}) est votre filet de sécurité local git rev-parsetraduit toute syntaxe en SHA