W3docs

git blame

Découvrez la commande git blame, son fonctionnement avec des exemples concrets et les options les plus courantes.

Description

La commande git blame annote chaque ligne d'un fichier avec des informations sur le dernier commit qui l'a modifiée — le hash du commit, l'auteur et l'horodatage. Autrement dit, pour chaque ligne, elle répond à la question : « qui a écrit ceci, et quand ? ».

Il s'agit d'une commande d'inspection en lecture seule. Elle ne modifie pas l'historique ni les fichiers ; elle affiche uniquement les métadonnées déjà présentes dans le dépôt. Les développeurs ont recours à git blame pour :

  • Retrouver l'auteur d'une ligne confuse ou bugguée afin de pouvoir l'interroger sur l'intention qui la sous-tend.
  • Localiser le commit qui a introduit un changement, puis lire son message complet avec git show.
  • Comprendre l'évolution d'un fichier lorsque l'historique des commits seul est trop grossier pour pointer vers une ligne précise.

git blame

Info

git blame affiche uniquement le commit le plus récent qui a touché chaque ligne. Si une ligne a été modifiée plusieurs fois, les auteurs précédents sont masqués. Pour remonter l'historique d'une ligne, relancez blame sur une révision antérieure (voir Suivre une ligne à travers l'historique ci-dessous).

Fonctionnement

Pour illustrer clairement le fonctionnement de git blame, prenons un exemple avec un fichier README.md comportant quelques commits de différents auteurs.

Dans l'exemple suivant, nous utilisons git blame. L'état du dépôt exemple peut être exploré avec git log. L'historique des commits ressemble à ceci :

git log et git blame

git log
commit 745a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a
Author: Bob Smith <[email protected]m>
Date: Fri Apr 1 19:55:15 2019 +0000
Another commit to help git blame track the who, the what, and the when
commit eb06faedb1fdd159d62e4438fc8dbe9c9fe0728b
Author: Bob Smith <[email protected]m>
Date: Fri Apr 1 19:53:23 2019 +0000
Creating the third commit, along with Nick and Robert, so that Nick can get git blame docs.
commit 990c2b6a84464fee153253dbf02e845a4db372bb
Merge: 82496ea 89feb84
Author: Tom Brown <[email protected]m>
Date: Fri Apr 1 05:33:01 2019 +0000
Merged in tom-brown/git-blame-example/albert-so/readmemd-edited-online-with-bitbucket-1519865641474 (pull request #2)
README.md edited online with Bitbucket
commit 73a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8
Author: Tom Brown <[email protected]m>
Date: Fri Apr 1 00:54:03 +0000
README.md edited online with Bitbucket

La commande git blame fonctionne sur des fichiers individuels. Par défaut, l'exécution de git blame affiche les informations d'annotation pour le fichier spécifié.

La sortie suivante est un extrait de la sortie complète de blame pour le fichier README :

git blame

git blame README.md
83253a1b (marioswift 2019-02-28 13:37:02 -0800 1) # Git Blame example
83253a1b (marioswift 2019-02-28 13:37:02 -0800 2)
73a0b1c2 (Tom Brown 2019-04-01 00:54:03 +0000 3) Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old.
83253a1b (marioswift 2019-02-28 13:37:02 -0800 4)
83253a1b (marioswift 2019-02-28 13:37:02 -0800 5) There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable.
83253a1b (marioswift 2019-02-28 13:37:02 -0800 6)
73a0b1c2 (Tom Brown 2019-04-01 00:54:03 +0000 7) Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod TEMPOR incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laborum nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

Lire la sortie

Chaque ligne de blame est composée de quatre parties :

83253a1b (marioswift 2019-02-28 13:37:02 -0800 1) # Git Blame example
└──┬───┘  └───┬────┘ └────────┬─────────────┘  └──────────┬──────────┘
             └─ the line's content
   │          │               │               └─ line number in the file
   │          │               └─ commit timestamp
   │          └─ author of that commit
   └─ abbreviated commit hash

Les lignes qui partagent le même hash de commit ont été modifiées ensemble pour la dernière fois. Pour inspecter ce qu'a réellement fait ce commit, copiez le hash et exécutez git show 83253a1b.

Options courantes

git blame accepte plusieurs options qui restreignent la sortie ou modifient la façon dont la paternité est attribuée. Les plus utiles sont résumées ci-dessous.

CommandeCe qu'elle fait
git blame -L 1,3 README.mdLimite la sortie à la plage de lignes demandée — ici, les lignes 1 à 3. Vous pouvez aussi utiliser -L 5,+10 pour démarrer à la ligne 5 et afficher 10 lignes.
git blame -e README.mdAffiche l'adresse e-mail de chaque auteur plutôt que son nom d'utilisateur.
git blame -w README.mdIgnore les modifications ne portant que sur des espaces. Si un auteur précédent a uniquement réindenté une ligne (ex. : tabulations vers espaces), git blame lui en attribuerait normalement la paternité ; -w passe outre et pointe vers la vraie modification de contenu.
git blame -M README.mdDétecte les lignes déplacées ou copiées dans le même fichier, et signale l'auteur original plutôt que celui qui les a déplacées.
git blame -C README.mdDétecte les lignes déplacées ou copiées depuis d'autres fichiers, et signale l'auteur original. Passez -C deux ou trois fois pour une recherche plus agressive.
git blame -L :functionName README.mdLimite blame à une seule fonction par son nom (utilise la regex funcname de Git), au lieu d'une plage de lignes numérique.

Suivre une ligne à travers l'historique

Étant donné que blame s'arrête au commit le plus récent par ligne, il est parfois nécessaire d'aller un cran plus loin. Une fois que vous disposez du hash de commit issu de la sortie blame, vous pouvez relancer blame sur le commit précédant celui-ci pour voir à quoi ressemblait la ligne — et qui l'a écrite — plus tôt dans l'historique.

# Blame the file as it was just before commit 73a0b1c2 touched it
git blame 73a0b1c2^ -- README.md

Le ^ (caret) signifie « le parent de ce commit ». En répétant cette opération, vous pouvez remonter une ligne à travers son historique complet, une révision à la fois.

Vous pouvez également restreindre blame à une plage de révisions afin de n'afficher que la paternité pour une portion donnée de l'historique :

# Blame README.md considering only commits between v1.0 and v2.0
git blame v1.0..v2.0 -- README.md

Git Blame vs Git Log

La commande git blame affiche le dernier auteur ayant modifié une ligne, mais il arrive que vous ayez besoin de savoir quand une ligne a été initialement ajoutée. C'est difficile à faire avec git blame seul — même en combinant les options -w, -C et -M. Pour retrouver quand un morceau de texte est apparu pour la première fois (ou a été supprimé), git log est l'outil approprié.

Utilisez git log avec l'option -S (la « pioche ») pour afficher les commits dans lesquels une chaîne de caractères spécifique a été ajoutée ou supprimée.

Exemple : trouver quand une chaîne a changé

git log -S exemple

git log -S "CSS3D and WebGL renderers." --pretty=format:'%h %an %ad %s'
e339d3c85a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d John Carter Fri Jun 13 16:51:06 2015 +0200 reverted README.md to original content
509c2cc35a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d Max Fri Jul 8 13:56:14 2015 +0200 Updated README
cb20237cc1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6 Leo Sat Aug 31 00:22:36 2012 +0100 Removed DOMRenderer. Now with the CSS3DRenderer it has become irrelevant.

La sortie montre que le fichier README.md a été ajouté et modifié 3 fois par trois auteurs. L'option --pretty=format:'...' personnalise la sortie de git log pour afficher des champs spécifiques tels que le hash du commit, l'auteur, la date et le sujet.

Commandes associées

git blame est plus utile lorsqu'elle est utilisée conjointement avec d'autres commandes d'inspection :

  • git log — parcourir l'historique complet des commits et le rechercher avec -S/-G.
  • git show — afficher le message complet et le diff d'un commit trouvé via blame.
  • git diff — comparer l'état actuel d'une ligne avec une révision antérieure.

Pratique

Pratique
Quelles sont les fonctions et les options de la commande 'git blame' dans Git ?
Quelles sont les fonctions et les options de la commande 'git blame' dans Git ?
Was this page helpful?