Cosa fa 'git blame'?


314

Ho visto molte domande sui metodi di utilizzo git blame, ma non li capisco davvero.

Vedo un Blamepulsante in cima ai file nell'interfaccia di GitHub. Facendo clic su di esso, mostra alcune differenze con i nomi utente sulla barra di sinistra. Cosa indica questo?

Perché viene git blameeffettivamente utilizzato, a parte GitHub?


67
Se anche "biasimo" suona bene, biasimevole per te, puoi installare questo script e usare git praiseinvece :) github.com/ansman/git-praise
Jon Kiparsky

7
Non dovrebbe essere né colpa né lode; è intrinsecamente ipotetico e avrebbe dovuto essere obiettivo.
pdvries

41
git objectively-determine-contributersemplicemente non ha lo stesso anello.
Ritwik Bose,

27
@RitwikBose o semplicementegit who
aktivb

Risposte:


238

Da git-blame :

Annota ogni riga nel file specificato con le informazioni della revisione che ha modificato l'ultima riga. Facoltativamente, inizia ad annotare dalla revisione data.

Se specificato una o più volte, -L limita l'annotazione alle righe richieste.

Esempio:

johndoe@server.com:~# git blame .htaccess
...
^e1fb2d7 (John Doe 2015-07-03 06:30:25 -0300  4) allow from all
^72fgsdl (Arthur King 2015-07-03 06:34:12 -0300  5)
^e1fb2d7 (John Doe 2015-07-03 06:30:25 -0300  6) <IfModule mod_rewrite.c>
^72fgsdl (Arthur King 2015-07-03 06:34:12 -0300  7)     RewriteEngine On
...

Si noti che git blamenon mostra la cronologia delle modifiche per riga in senso cronologico. Mostra solo chi è stato l'ultimo a modificare una riga in un documento fino all'ultimo commit HEAD.

Vale a dire che per visualizzare la cronologia / il registro completi di una riga del documento, è necessario eseguire un git blame path/to/fileper ogni commit nel proprio git log.


1
quindi è solo per vedere l'ultima persona?
Rıfat Erdem Sahin,

2
Sì, ti permette di vedere l'ultima persona che ha cambiato la linea.
Segna l'

@Mark Quindi quando annotiamo su un IDE, fa internamente un comando git blame?
Nagarajan Shanmuganathan,

2
@NagarajanShanmuganathan sì, se usi git è quello che sta succedendo dietro le quinte.
Mark

153

Il comando si spiega abbastanza bene. Serve a capire quale collaboratore ha scritto la riga specifica o ha rovinato il progetto, quindi puoi incolparli :)


105
Il comando suona davvero come se tu stessi incolpando qualcuno eseguendolo. Almeno è così che mi è sembrato prima di sapere cosa ha fatto in questo post.
Francisco C.

12
@FranciscoC. stai cercando questo: github.com/jayphelps/git-blame-someone-else
DustWolf

2
@FranciscoC. aspetta cosa, non fa un po 'esattamente quello che ti fa incolpare qualcun altro?
IanDess,

16
@IanDess Forse è solo una semantica, ma git blamesuona come se avesse qualche effetto persistente, simile a git commit, dove in realtà ti informa solo su quali cambiamenti sono stati fatti da chi. Questo e la connotazione negativa che la parola "colpa" porta, fanno sembrare il comando come qualcosa da cui dovresti stare lontano e porta a domande come questa in cerca di chiarimenti.
Francisco C.,

20
Chiaramente, dovrebbe essere chiamato git praise.
pfnuesel,

75

Da GitHub :

Il comando blame è una funzione Git, progettata per aiutarti a determinare chi ha apportato modifiche a un file.

Nonostante il suo nome dal suono negativo, la colpa git è in realtà abbastanza innocua; la sua funzione principale è di indicare chi ha cambiato le righe in un file e perché. Può essere uno strumento utile per identificare le modifiche nel codice.

Fondamentalmente, git-blameviene utilizzato per mostrare quale revisione e autore hanno modificato l'ultima riga di ogni riga di un file. È come controllare la cronologia dello sviluppo di un file.


2
Questo mi sembra ridondante, puoi vedere una differenza tra commit e ID dell'utente dal registro di commit. Se capisco tutto qui, ha meno persistenza della cronologia di commit. Forse mi manca qualcosa, ma sembra che gli standard di codifica applicati attraverso l'umiliazione pubblica.
user1431356,

8
Immagino che il nome del comando fosse il risultato del senso dell'umorismo specifico di Linus :) Non era pensato per essere usato per umiliare nessuno :) era solo una scelta divertente (o no) per il nome di un comando utile :)
Mladen B.

2
@ user1431356 - il punto è che si desidera la prima riga di registro che influisce su una riga particolare . Altrimenti dovresti cercare nei log una stringa particolare. (Che è davvero un approccio praticabile - cerca nelle pagine man "git log -S".)
azernik

1
Il titolo di "colpa" è qualcosa che esiste da anni prima di Git. Guarda l'implementazione di svn . Non era un nome dato da Linus Torvalds.
JackAce,

"Immagino che il nome del comando fosse il risultato dello specifico senso dell'umorismo di Linus :) Non era pensato per essere usato per umiliare nessuno :)" lol ... Più come se fosse la personalità di Linus e doveva essere umiliare qualcuno.
Sinaesthetic

34

Il git blamecomando viene utilizzato per sapere chi / quale commit è responsabile delle ultime modifiche apportate a un file. L'autore / commit di ogni riga può anche essere visto.

git blame filename (si assume la responsabilità delle modifiche per tutte le righe del codice)

git blame filename -L 0,10 (si assume la responsabilità delle modifiche dalla riga "0" alla riga "10")

Ci sono molte altre opzioni per la colpa, ma generalmente queste potrebbero essere d'aiuto.


2

Il git blamecomando annota le righe con le informazioni della revisione che ha modificato l'ultima riga e ... con Git 2.22 (Q2 2019), lo farà più velocemente , a causa di una correzione delle prestazioni intorno a " git blame", specialmente in una cronologia lineare (che è il norma per cui dovremmo ottimizzare).

Vedi commit f892014 (02 apr 2019) di David Kastrup ( fedelibre) . (Unita da Junio ​​C Hamano - gitster- in commit 4d8c4da , 25 apr 2019)

blame.c: non rilasciare i BLOB di origine con entusiasmo

Quando un BLOB genitore ha già blocchi in coda per colpa, il rilascio del BLOB alla fine di un passaggio di colpa lo farà ricaricare immediatamente, raddoppiando la quantità di I / O e spacchettandolo durante l'elaborazione di una cronologia lineare.

Mantenere tali BLOB padre in memoria sembra una ragionevole ottimizzazione che dovrebbe comportare una pressione aggiuntiva della memoria principalmente durante l'elaborazione delle fusioni dai vecchi rami.


1

Il git blamecomando viene utilizzato per esaminare il contenuto di un file riga per riga e vedere quando è stata modificata l'ultima riga e chi era l'autore delle modifiche.

Se c'era un bug nel codice, usalo per identificare chi lo ha inserito, quindi puoi biasimarlo. Dare la colpa è ottenere la colpa (d).

Se hai bisogno di conoscere la cronologia di un codice di riga, usa git log -S"code here", più semplice di git blame.

git log vs git biasimo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.