Close

git blame

La commande git blame est un utilitaire de dépannage polyvalent, qui dispose de nombreuses options d'utilisation. git blame a pour fonction générale d'afficher les métadonnées d'auteur associées à des lignes de commit spécifiques dans un fichier. Cela permet d'examiner des points spécifiques de l'historique d'un fichier et de mettre en contexte le dernier auteur qui a modifié la ligne. Cette approche est utilisée pour explorer l'historique d'un code spécifique et répondre aux questions « quel code a été ajouté à un dépôt », « comment » et « pourquoi ».

git blame est souvent utilisée avec un affichage GUI. Les sites d'hébergement Git en ligne, comme Bitbucket, proposent des vues blame qui sont des encapsuleurs d'interface utilisateur de git blame. Ces vues sont référencées dans les discussions collaboratives relatives aux pull requests et aux commits. De plus, la plupart des IDE présentant une intégration Git disposent également de vues blame dynamiques.


Fonctionnement


Afin de montrer comment fonctionne la commande git blame, nous avons besoin d'un dépôt présentant un certain historique. Nous utiliserons le projet open source git-blame-example. Il s'agit d'un dépôt simple, qui contient un fichier README.md comprenant quelques commits de différents auteurs. La première étape de notre exemple d'utilisation de git blame est la commande git clone, qui permettra de cloner l'exemple de dépôt.

git clone https://kevzettler@bitbucket.org/kevzettler/git-blame-example.git && cd git-blame-example

Now that we have a copy of the example code we can start exploring it with git blame. The state of the example repo can be examined using git log. The commit history should look like the following:

$ git log
    commit 548dabed82e4e5f3734c219d5a742b1c259926b2
    Author: Juni Mukherjee <jmukherjee@atlassian.com>
    Date:   Thu Mar 1 19:55:15 2018 +0000

        Another commit to help git blame track the who, the what, and the when

    commit eb06faedb1fdd159d62e4438fc8dbe9c9fe0728b
    Author: Juni Mukherjee <jmukherjee@atlassian.com>
    Date:   Thu Mar 1 19:53:23 2018 +0000

        Creating the third commit, along with Kev and Albert, so that Kev can get git blame docs.

    commit 990c2b6a84464fee153253dbf02e845a4db372bb
    Merge: 82496ea 89feb84
    Author: Albert So <aso@atlassian.com>
    Date:   Thu Mar 1 05:33:01 2018 +0000

        Merged in albert-so/git-blame-example/albert-so/readmemd-edited-online-with-bitbucket-1519865641474 (pull request #2)

        README.md edited online with Bitbucket

    commit 89feb84d885fe33d1182f2112885c2a64a4206ec
    Author: Albert So <aso@atlassian.com>
    Date:   Thu Mar 1 00:54:03 2018 +0000

        README.md edited online with Bitbucket
Logo Git
Ressource connexe

Fiche de révision sur Git

Logo Bitbucket
DÉCOUVRIR LA SOLUTION

Découvrir Git avec Bitbucket Cloud

La commande git blame fonctionne uniquement sur les fichiers individuels. Un chemin de fichier est requis pour toute sortie utile. L'exécution par défaut de la commande git blame affiche simplement le menu d'aide des commandes. Dans cet exemple, nous travaillerons sur le fichier README.MD. Les logiciels open source incluent fréquemment un fichier README à la racine d'un dépôt Git. Il fait office de source de documentation pour le projet.

git blame README.MD

L'exécution de la commande ci-dessus nous fournit notre premier échantillon de sortie blame. La sortie suivante constitue un sous-ensemble de la sortie blame complète du fichier README. En outre, cette sortie statique reflète l'état du dépôt au moment de la rédaction.

$ git blame README.md
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  1) # Git Blame example
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  2)
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  3) This repository is an example of a project with multiple contributors making commits.
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  4)
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  5) The repo use used elsewhere to demonstrate `git blame`
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  6)
    89feb84d (Albert So      2018-03-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 laboris 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
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  8)
    eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000  9) Annotates each line in the given file with information from the revision which last modified the line. Optionally, start annotating from the given revision.
    eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000 10)
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 11) Creating a line to support documentation needs for git blame.
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 12)
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 13) Also, it is important to have a few of these commits to clearly reflect the who, the what and the when. This will help Kev get good screenshots when he runs the git blame on this README.

Il s'agit d'un exemple des 13 premières lignes du fichier README.md. Pour mieux comprendre cette sortie, décomposons une ligne. Le tableau suivant affiche le contenu de la ligne 3, et les colonnes du tableau indiquent le contenu de ce dernier.

ID

Auteur

Horodatage

Numéro de ligne

Contenu de la ligne

89feb84d

Auteur

Albert So

Horodatage

2018-03-01 00:54:03 +0000

Numéro de ligne

3

Contenu de la ligne

Ce dépôt est un exemple de projet avec plusieurs contributeurs qui font des commits.

Si nous examinons la liste de sorties blame, nous pouvons faire certaines observations. Trois auteurs sont cités. En plus du mainteneur de projet Kev Zettler, Albert So et Juni Mukherjee sont également mentionnés. Les auteurs constituent généralement la part la plus précieuse de la sortie git blame. La colonne« Horodatage » est également particulièrement utile. La nature du changement est indiquée dans la colonne « Contenu de la ligne ».

Options communes


git blame -L 1,5 README.md

L'option -L limite la sortie à la plage des lignes demandée. Nous avons ici limité la sortie aux lignes 1 à 5.

git blame -e README.md

L'option -e indique l'adresse e-mail des auteurs au lieu du nom d'utilisateur.

git blame -w README.md

L'option -w ignore les changements apportés aux espaces. Si un ancien auteur a modifié l'espacement d'un fichier en passant des tabulations aux espaces ou en ajoutant de nouvelles lignes, la sortie de la commande git blame est cachée par l'affichage de ces changements.

git blame -M README.md

L'option -M détecte les lignes déplacées ou copiées dans un même fichier. Cette action signale l'auteur initial des lignes, plutôt que le dernier auteur qui a déplacé ou copié les lignes.

git blame -C README.md

L'option -C détecte les lignes déplacées ou copiées depuis d'autres fichiers. Cette action signale l'auteur initial des lignes, plutôt que le dernier auteur qui a déplacé ou copié les lignes.

Git blame vs git log


While git blame displays the last author that modified a line, often times you will want to know when a line was originally added. This can be cumbersome to achieve using git blame. It requires a combination of the -w, -C, and -M options. It can be far more convenient to use the git log command.

Pour répertorier tous les commits initiaux dans lesquels une portion de code spécifique a été ajoutée ou modifiée, exécutez la commande git log avec l'option -S. Ajoutez l'option -S avec le code que vous recherchez. Prenons l'une des lignes de la sortie README ci-dessus comme exemple : le passage « CSS3D and WebGL renderers » à la ligne 12.

$ git log -S"CSS3D and WebGL renderers." --pretty=format:'%h %an %ad %s'
    e339d3c85 Mario Schuettel Tue Oct 13 16:51:06 2015 +0200 reverted README.md to original content
    509c2cc35 Daniel Tue Sep 8 13:56:14 2015 +0200 Updated README
    cb20237cc Mr.doob Mon Dec 31 00:22:36 2012 +0100 Removed DOMRenderer. Now with the CSS3DRenderer it has become irrelevant.

This output shows us that content from the README was added or modified 3 times by 3 different authors. It was originally added in commit cb20237cc by Mr.doob. In this example, git log has also been prepended with the --pretty-format option. This option converts the default output format of git log into one that matches the format of git log. For more information on usage and configuration options visit the git log page.

Résumé


The git blame command is used to examine the contents of a file line by line and see when each line was last modified and who the author of the modifications was. The output format of git blame can be altered with various command line options. Online Git hosting solutions like Bitbucket offer blame views, which offer a superior user experience to command line git blame usage. git blame and git log can be used in combination to help discover the history of a file's contents. The git log command has some similar blame functionality, to learn more visit the git log overview page.


Partager cet article

Lectures recommandées

Ajoutez ces ressources à vos favoris pour en savoir plus sur les types d'équipes DevOps, ou pour les mises à jour continues de DevOps chez Atlassian.

Des personnes qui collaborent à l'aide d'un mur rempli d'outils

Le blog Bitbucket

Illustration DevOps

Parcours de formation DevOps

Démos Des démos avec des partenaires d'Atlassian

Fonctionnement de Bitbucket Cloud avec Atlassian Open DevOps

Inscrivez-vous à notre newsletter DevOps

Thank you for signing up