O que 'git blame' faz?

314

Vi muitas perguntas sobre métodos de uso git blame, mas realmente não as entendo.

Eu vejo um Blamebotão em cima dos arquivos na interface do GitHub. Ao clicar nele, ele mostra algumas diferenças com os nomes de usuário na barra esquerda. O que isso indica?

Por que é git blamerealmente usado, além do GitHub?

Himanshu Mishra
fonte
67
Se os sons "culpa" também, bem, Blamey para você, você pode instalar este script e utilização git praiseem vez :) github.com/ansman/git-praise
Jon Kiparsky
7
Não deve ser culpa nem elogio; é inerentemente suposto e deveria ter sido objetivo.
Pdvries
41
git objectively-determine-contributersimplesmente não tem o mesmo toque.
Ritwik Bose
27
@RitwikBose ou simplesmentegit who
aktivb

Respostas:

238

De git-culpar :

Anota cada linha no arquivo fornecido com informações da revisão que modificou a linha pela última vez. Opcionalmente, comece a anotar a partir da revisão fornecida.

Quando especificado uma ou mais vezes, -L restringe a anotação às linhas solicitadas.

Exemplo:

[email protected]:~# 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
...

Observe que git blamenão mostra o histórico de modificações por linha no sentido cronológico. Ele mostra apenas quem foi a última pessoa a ter alterado uma linha em um documento até a última confirmação HEAD.

Isto é, para ver o histórico / log completo de uma linha de documento, você precisará executar um git blame path/to/filepara cada confirmação no seu git log.

Marca
fonte
1
então é só para ver a última pessoa?
Rıfat Erdem Sahin
2
Sim, permite ver a última pessoa que mudou de linha.
Mark
@ Mark Então, quando anotamos em um IDE, ele faz internamente um comando de culpa do git?
Nagarajan Shanmuganathan
2
@NagarajanShanmuganathan sim, se você usa git, é isso que está acontecendo nos bastidores.
Mark
153

O comando se explica muito bem. É descobrir qual colega de trabalho escreveu a linha específica ou arruinou o projeto, para que você possa culpá- los :)

Raio X
fonte
105
Na verdade, o comando parece que você estará culpando alguém ao executá-lo. Pelo menos foi assim que me pareceu antes de eu aprender o que fazia neste post.
Francisco C.
12
@FranciscoC. você está olhando para isso: github.com/jayphelps/git-blame-someone-else
DustWolf
2
@FranciscoC. espere, isso não faz exatamente isso, ou seja, permite culpar alguém?
587 IanDess
16
@IanDess Talvez seja apenas semântica, mas git blameparece que teria algum efeito persistente, semelhante a git commitonde, na verdade, apenas informa sobre quais alterações foram feitas por quem. Isso e a conotação negativa que a palavra "culpa" carrega, fazem com que o comando pareça algo que você deve evitar e leva a perguntas como essa que buscam esclarecimentos.
Francisco C.
20
Claramente, deve ser chamado git praise.
Pfnuesel
75

No GitHub :

O comando culpar é um recurso do Git, projetado para ajudar a determinar quem fez alterações em um arquivo.

Apesar do nome negativo, a culpa é realmente inócua; sua função principal é apontar quem mudou quais linhas em um arquivo e por quê. Pode ser uma ferramenta útil para identificar alterações no seu código.

Basicamente, git-blameé usado para mostrar qual revisão e autor modificaram pela última vez cada linha de um arquivo. É como verificar o histórico do desenvolvimento de um arquivo.

Himanshu Mishra
fonte
2
Isso me parece redundante, você pode ver uma diferença entre confirmações e identificação do usuário no log de confirmação. Se estou entendendo tudo aqui, há menos persistência do que o histórico de confirmação. Talvez esteja faltando alguma coisa, mas parece que os padrões de codificação são aplicados por meio da humilhação pública.
usuário1431356
8
Eu acho que o nome do comando foi o resultado do senso de humor específico de Linus :) Não era para ser usado para humilhar ninguém :) era apenas uma escolha engraçada (ou não) para o nome de um comando útil :)
Mladen B.
2
@ user1431356 - o ponto é que você deseja a primeira linha de log que afeta uma linha específica . Caso contrário, você precisará pesquisar nos logs por uma sequência específica. (Que é de fato uma abordagem viável - olhar nas páginas man para "-S git log".)
azernik
1
O título de "culpa" é algo que existe há anos antes do git. Veja a implementação do svn . Não era um nome dado por Linus Torvalds.
21418 JackAce
"Acho que o nome do comando foi o resultado do senso de humor específico de Linus :) Não era para ser usado para humilhar ninguém :)" lol ... Mais como se fosse a personalidade de Linus e era para humilhar alguém.
Sinaesthetic
34

O git blamecomando é usado para saber quem / qual confirmação é responsável pelas últimas alterações feitas em um arquivo. O autor / commit de cada linha também pode ser visto.

git blame filename (confirma responsável por alterações para todas as linhas no código)

git blame filename -L 0,10 (confirma responsável por alterações da linha "0" para a linha "10")

Há muitas outras opções de culpa, mas geralmente elas podem ajudar.

Bharath TS
fonte
2

O git blamecomando anota linhas com informações da revisão que modificou a linha pela última vez, e ... com o Git 2.22 (Q2 2019), o fará mais rapidamente , devido a uma correção de desempenho em torno de " git blame", especialmente em um histórico linear (que é o norma que devemos otimizar).

Veja commit f892014 (02 Abr 2019) por David Kastrup ( fedelibre) . (Incorporado por Junio ​​C Hamano - gitster- in commit 4d8c4da , 25 de abr de 2019)

blame.c: não solte os blobs de origem com tanta ansiedade

Quando um blob pai já tem blocos na fila para culpar, soltar o blob no final de uma etapa de culpa fará com que seja recarregado imediatamente, dobrando a quantidade de E / S e descompactando ao processar um histórico linear.

Manter esses blobs principais na memória parece uma otimização razoável que deve incorrer em uma pressão adicional de memória principalmente ao processar as mesclagens de ramificações antigas.

VonC
fonte
1

O git blamecomando é usado para examinar o conteúdo de um arquivo linha por linha e ver quando cada linha foi modificada pela última vez e quem foi o autor das modificações.

Se houve um erro no código, use-o para identificar quem o acusou, então você pode culpá-lo. Culpa Git é culpar (d).

Se você precisar conhecer o histórico de um código de linha, use git log -S"code here" mais simples que a culpa do git.

git log vs git culpa

jackzhoumine
fonte