Close

Git blame

De opdracht git blame is een veelzijdige tool voor het oplossen van problemen met uitgebreide gebruiksmogelijkheden. De functie op hoog niveau van git blame is het weergeven van metagegevens van een auteur die zijn gekoppeld aan specifieke, gecommitte regels in een bestand. Deze functie wordt gebruikt om specifieke punten in de geschiedenis van een bestand te onderzoeken en de context te achterhalen van wie de laatste auteur was die de regel heeft gewijzigd. De functie wordt gebruikt om de geschiedenis van specifieke code te verkennen en om vragen te beantwoorden over wat, hoe en waarom de code werd toegevoegd aan een repository.

Git blame wordt vaak gebruikt in combinatie met een GUI-scherm. Online Git-hosting-sites zoals Bitbucket bieden blame-overzichten. Dit zijn UI-wrappers voor git blame. Naar deze overzichten wordt verwezen in gezamenlijke discussies over pull-aanvragen en commits. Bovendien hebben de meeste IDE's met Git-integratie ook een dynamische blame-weergave.


Hoe het werkt


Om git blame te demonstreren, hebben we een repository nodig met een bepaalde geschiedenis. We gebruiken daarom het open source-project git-blame-example. Dit open source-project is een eenvoudige repository die een README.md-bestand bevat met enkele commits van verschillende auteurs. De eerste stap in ons voorbeeld van het gebruik van git blame is het gebruik van git clone om de voorbeeldrepository te klonen.

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
Git-logo
gerelateerd materiaal

Git cheat sheet

Logo Bitbucket
Oplossing bekijken

Git leren met Bitbucket Cloud

git blame werkt alleen voor individuele bestanden. Voor elke nuttige uitvoer is een bestandspad vereist. De standaarduitvoering van git blame geeft gewoon het helpmenu voor opdrachten weer. In dit voorbeeld zullen we het bestand README.MD gebruiken. Het is gebruikelijk om in open source-software een README-bestand op te nemen in de root van een git-repository. Dit bestand vormt de documentatiebron voor het project.

git blame README.MD

Als we de bovenstaande opdracht uitvoeren, krijgen we ons eerste voorbeeld van blame-output. De volgende output is een subset van de volledige blame-output van README. Bovendien is deze output statisch, wat een afspiegeling is van de toestand van de repo op het moment van schrijven.

$ 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.

Dit is een voorbeeld van de eerste 13 regels van het README.md-bestand. Laten we een regel uitsplitsen om deze output beter te begrijpen. De volgende tabel toont de inhoud van regel 3; de kolommen van de tabel geven de inhoud van de kolom aan.

ID

Auteur

Tijdstempel

Regelnummer

Inhoud van de regel

89feb84d

Auteur

Albert So

Tijdstempel

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

Regelnummer

3

Inhoud van de regel

Deze repository is een voorbeeld van een project waarbij meerdere bijdragers commits maken.

Als we de blame-outputlijst bekijken, kunnen we enkele dingen constateren. Er worden drie auteurs vermeld. Naast de projectbeheerder Kev Zettler worden ook Albert So en Juni Mukherjee vermeld. Auteurs zijn over het algemeen het meest waardevolle onderdeel van de output van git blame. De kolom met het tijdstempel is ook erg nuttig. De kolom met de inhoud van de regel geeft aan wat er werd gewijzigd.

Gemeenschappelijke opties


git blame -L 1,5 README.md

De optie -L beperkt de output tot het gewenste regelbereik. Hier hebben we de uitvoer beperkt tot regel 1 tot en met 5.

git blame -e README.md

De optie -e geeft het e-mailadres van de auteur weer in plaats van de gebruikersnaam.

git blame -w README.md

De optie -w negeert wijzigingen in de witruimte. Als een vorige auteur de spatiëring van een bestand heeft gewijzigd door over te schakelen van tabs naar spaties of door nieuwe regels toe te voegen, dan verdoezelt dit helaas de output van git blame door deze wijzigingen weer te geven.

git blame -M README.md

De optie -M detecteert verplaatste of gekopieerde regels in hetzelfde bestand. Dit retourneert de oorspronkelijke auteur van de regels in plaats van de auteur die de regels voor het laatst heeft verplaatst of gekopieerd.

git blame -C README.md

De optie -C herkent regels die zijn verplaatst of uit andere bestanden werden gekopieerd. Dit retourneert de oorspronkelijke auteur van de regels in plaats van de auteur die de regels voor het laatst heeft verplaatst of gekopieerd.

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.

Om een lijst te maken van alle originele commits waarin een specifiek stukje code is toegevoegd of gewijzigd, voer je git log uit met de optie -S. Voeg de optie -S toe met de code die je zoekt. Laten we een van de regels uit de README-output hierboven als voorbeeld gebruiken. We gebruiken de tekst 'CSS3D en WebGL-renderers' uit regel 12 van de README-output.

$ 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.

Samenvatting


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.


Deel dit artikel

Aanbevolen artikelen

Bookmark deze resources voor meer informatie over soorten DevOps-teams of voor voortdurende updates over DevOps bij Atlassian.

Mensen die samenwerken met een muur vol tools

Bitbucket-blog

Toelichting DevOps

DevOps-leertraject

Demo Den Feature-demo's met Atlassian-experts

Hoe Bitbucket Cloud werkt met Atlassian Open DevOps

Meld je aan voor onze DevOps-nieuwsbrief

Thank you for signing up