Close

git blame

Il comando git blame è un'utilità per la risoluzione dei problemi con ampie opzioni di utilizzo. La funzione generale di git blame è la visualizzazione dei metadati dell'autore allegati a specifiche righe confermate in un file. Viene utilizzato per esaminare punti specifici della cronologia di un file e ottenere un contesto su chi è stato l'ultimo autore che ha modificato la riga. Viene utilizzato per esplorare la cronologia di un codice specifico e rispondere a domande su cosa, come e perché il codice è stato aggiunto a un repository.

Git blame è spesso usato con un display con interfaccia grafica. I siti di hosting Git online come Bitbucket offrono punti di vista blame che sono i wrapper dell'interfaccia utente di git blame. Questi punti di vista sono citati nelle discussioni collaborative su pull request e commit. Inoltre, la maggior parte degli IDE con integrazione Git hanno anche viste dinamiche dei blame.


Come funziona


Per dimostrare git blame abbiamo bisogno di un repository con un po' di cronologia. Useremo il progetto open source git-blame-example. Questo progetto open source è un semplice repository che contiene un file README.md con alcuni commit di autori diversi. Il primo passo del nostro esempio di utilizzo di git blame consiste nell'usare git clone per clonare il repository degli esempi.

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
materiale correlato

Scheda di riferimento rapido di Git

Logo di Bitbucket
Scopri la soluzione

Impara a utilizzare Git con Bitbucket Cloud

git blame funziona solo su singoli file. Il percorso del file è richiesto per ogni output utile. L'esecuzione predefinito di git blame genererà semplicemente il menu di aiuto dei comandi. Per questo esempio, opereremo sul file README.MD. È una pratica comune del software open source includere un file README nella radice di un repository git come fonte di documentazione per il progetto.

git blame README.MD

L'esecuzione del comando precedente ci fornirà il nostro primo campione di risultati su blame. Il seguente output è un sottoinsieme dell'output completo di blame del README. Inoltre, questo output è statico e riflette lo stato del repository al momento della stesura di questo documento.

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

Questo è un esempio delle prime 13 righe del file README.md. Per comprendere meglio questo risultato, suddividiamo una riga. La tabella seguente mostra il contenuto della riga 3 e le colonne della tabella indicano il contenuto della colonna.

ID

Autore

Timestamp

Numero di riga

Contenuto della riga

89feb84d

Autore

Albert So

Timestamp

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

Numero di riga

3

Contenuto della riga

Questo repository è un esempio di progetto con più collaboratori che eseguono commit.

Se esaminiamo l'elenco degli output blame, possiamo fare alcune osservazioni. Ci sono tre autori elencati. Oltre al responsabile del progetto, sono elencati anche Kev Zettler, Albert So e Juni Mukherjee. Gli autori sono generalmente la parte più preziosa dell'output di git blame. Anche la colonna timestamp è molto utile. La modifica è indicata dalla colonna del contenuto delle righe.

Opzioni comuni


git blame -L 1,5 README.md

L'opzione -L limiterà l'output all'intervallo di righe richiesto. Qui abbiamo limitato l'output alle righe da 1 a 5.

git blame -e README.md

L'opzione -e mostra l'indirizzo e-mail dell'autore anziché il nome utente.

git blame -w README.md

L'opzione -w ignora le modifiche ai whitespace. Se un autore precedente ha modificato la spaziatura di un file passando da schede a spazi o aggiungendo nuove righe, questo, sfortunatamente, oscurerà l'output di git blame mostrando queste modifiche.

git blame -M README.md

L'opzione -M rileva le righe spostate o copiate all'interno dello stesso file. Questo riporterà l'autore originale delle righe anziché l'ultimo autore che ha spostato o copiato le righe.

git blame -C README.md

L'opzione -C rileva le righe che sono state spostate o copiate da altri file. Questo riporterà l'autore originale delle righe anziché l'ultimo autore che ha spostato o copiato le righe.

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.

Per elencare tutti i commit originali in cui è stata aggiunta o modificata una specifica parte di codice, esegui git log con l'opzione -S. Aggiungi all'opzione -S il codice che stai cercando. Prendiamo una delle righe dell'output README precedente da usare come esempio. Prendiamo i "renderer di testo CSS3D e WebGL" dalla riga 12 dell'output README.

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

Riepilogo


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.


Condividi l'articolo
Argomento successivo

Letture consigliate

Aggiungi ai preferiti queste risorse per ricevere informazioni sui tipi di team DevOps e aggiornamenti continui su DevOps in Atlassian.

Le persone collaborano utilizzando una parete piena di strumenti

Blog di Bitbucket

Illustrazione su Devops

Percorso di apprendimento DevOps

Funzione Demo Den per demo con esperti Atlassian

Come Bitbucket Cloud funziona con Atlassian Open DevOps

Iscriviti alla nostra newsletter DevOps

Thank you for signing up