Que fait «git blame»?

314

J'ai vu beaucoup de questions sur les méthodes d'utilisation git blame, mais je ne les comprends pas vraiment.

Je vois un Blamebouton au-dessus des fichiers sur l'interface GitHub. En cliquant dessus, il montre une différence avec les noms d'utilisateur dans la barre de gauche. Qu'est-ce que cela indique?

Pourquoi est-il git blameréellement utilisé, à part GitHub?

Himanshu Mishra
la source
67
Si "blâme" sonne aussi, eh bien, blâme pour vous, vous pouvez installer ce script et utiliser à la git praiseplace :) github.com/ansman/git-praise
Jon Kiparsky
7
Il ne faut ni blâmer ni louer; c'est intrinsèquement hypothétique et aurait dû être objectif.
pdvries
41
git objectively-determine-contributern'a tout simplement pas la même bague.
Ritwik Bose du
27
@RitwikBose ou simplementgit who
aktivb

Réponses:

238

De git-blame :

Annote chaque ligne du fichier donné avec les informations de la révision qui a modifié la ligne en dernier. Eventuellement, commencez à annoter à partir de la révision donnée.

Lorsqu'il est spécifié une ou plusieurs fois, -L limite l'annotation aux lignes demandées.

Exemple:

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

Veuillez noter que git blamene montre pas l'historique des modifications par ligne dans le sens chronologique. Il montre uniquement qui était la dernière personne à avoir modifié une ligne dans un document jusqu'à la dernière validation HEAD.

C'est-à-dire que pour voir l'historique / journal complet d'une ligne de document, vous devez exécuter un git blame path/to/filepour chaque commit dans votre fichier git log.

marque
la source
1
donc c'est juste pour voir la dernière personne?
Rıfat Erdem Sahin
2
Oui, cela vous permet de voir la dernière personne qui a changé de ligne.
Mark
@Mark Donc, quand nous annotons sur un IDE, il fait en interne une commande git blame?
Nagarajan Shanmuganathan
2
@NagarajanShanmuganathan oui, si vous utilisez git, c'est ce qui se passe dans les coulisses.
Mark
153

La commande s'explique assez bien. C'est pour savoir quel collègue a écrit la ligne spécifique ou ruiné le projet, vous pouvez donc leur en vouloir :)

Radiographie
la source
105
La commande sonne comme si vous blâmeriez quelqu'un en l'exécutant. C'est du moins ce que cela m'a semblé avant d'apprendre ce qu'il a fait dans ce post.
Francisco C.
12
@FranciscoC. vous recherchez ceci: github.com/jayphelps/git-blame-someone-else
DustWolf
2
@FranciscoC. attendez quoi, ne fait-il pas exactement cela, c'est-à-dire vous permet de blâmer quelqu'un d'autre?
IanDess
16
@IanDess C'est peut-être juste de la sémantique, mais cela git blamesemble avoir un effet persistant, similaire à git commit, où en fait il vous informe simplement des changements qui ont été apportés par qui. Cela et la connotation négative que le mot "blâme" porte, font que la commande sonne comme quelque chose que vous devriez éviter et conduit à des questions comme celle-ci qui demandent des éclaircissements.
Francisco C.
20
De toute évidence, il faut l'appeler git praise.
pfnuesel
75

Depuis GitHub :

La commande blame est une fonctionnalité Git, conçue pour vous aider à déterminer qui a apporté des modifications à un fichier.

Malgré son nom à consonance négative, le blâme git est en fait assez inoffensif; sa fonction principale est d'indiquer qui a changé quelles lignes dans un fichier et pourquoi. Cela peut être un outil utile pour identifier les changements dans votre code.

Fondamentalement, git-blameest utilisé pour montrer quelle révision et auteur ont modifié en dernier chaque ligne d'un fichier. C'est comme vérifier l'historique du développement d'un fichier.

Himanshu Mishra
la source
2
Cela me semble redondant, vous pouvez voir une différence entre les validations et l'ID de l'utilisateur dans le journal des validations. Si je comprends tout ici, il a moins de persistance que l'historique des validations. Peut-être que je manque quelque chose, mais cela ressemble à des normes de codage appliquées par l'humiliation publique.
user1431356
8
Je suppose que le nom de la commande était le résultat du sens de l'humour spécifique de Linus :) Il n'était pas destiné à être utilisé pour humilier quelqu'un :) c'était juste un choix drôle (ou pas) pour le nom d'une commande utile :)
Mladen B.16
2
@ user1431356 - le fait est que vous voulez la première ligne de journal qui affecte une ligne particulière . Sinon, vous devrez rechercher dans les journaux une chaîne particulière. (Ce qui est en effet une approche viable - regardez dans les pages de manuel pour "git log -S".)
azernik
1
Le titre "blâme" est quelque chose qui existait depuis des années avant git. Regardez simplement l'implémentation de svn . Ce n'était pas un nom donné par Linus Torvalds.
JackAce
"Je suppose que le nom de la commande était le résultat du sens de l'humour spécifique de Linus :) Il n'était pas destiné à être utilisé pour humilier qui que ce soit :)" lol ... Plus comme si c'était la personnalité de Linus et c'était censé humilier quelqu'un.
Sinaesthetic
34

La git blamecommande permet de savoir qui / quel commit est responsable des dernières modifications apportées à un fichier. L'auteur / commit de chaque ligne est également visible.

git blame filename (engage la responsabilité des changements pour toutes les lignes du code)

git blame filename -L 0,10 (engage la responsabilité des changements de la ligne "0" à la ligne "10")

Il existe de nombreuses autres options pour blâmer, mais généralement, cela pourrait aider.

Bharath TS
la source
2

La git blamecommande annote les lignes avec les informations de la révision qui a modifié la ligne en dernier, et ... avec Git 2.22 (Q2 2019), le fera plus rapidement , en raison d'un correctif de performances autour de " git blame", en particulier dans un historique linéaire (qui est le norme que nous devons optimiser).

Voir commit f892014 (02 avril 2019) par David Kastrup ( fedelibre) . (Fusionné par Junio ​​C Hamano - gitster- en commit 4d8c4da , 25 avril 2019)

blame.c: ne laissez pas tomber les blobs d'origine avec autant d'enthousiasme

Lorsqu'un objet blob parent a déjà des morceaux en attente de blâme, le supprimer à la fin d'une étape de blâme entraînera son rechargement immédiat, doublant la quantité d'E / S et déballant lors du traitement d'un historique linéaire.

Garder de tels blobs parents en mémoire semble être une optimisation raisonnable qui devrait entraîner une pression supplémentaire sur la mémoire principalement lors du traitement des fusions d'anciennes branches.

VonC
la source
1

La git blamecommande est utilisée pour examiner le contenu d'un fichier ligne par ligne et voir quand chaque ligne a été modifiée pour la dernière fois et qui était l'auteur des modifications.

S'il y avait un bug dans le code, utilisez-le pour identifier qui l'a placé, alors vous pouvez lui en vouloir. Git blâme est blâme (d).

Si vous avez besoin de connaître l'historique d'un code de ligne, utilisez git log -S"code here", plus simple que git blame.

git log vs git blame

JackChouMine
la source