web-dev-qa-db-fra.com

Git blame - avant commet?

Est-il possible de voir qui a édité une ligne spécifique avant le commit signalé par git blame, comme un historique des commits pour une ligne donnée?

Par exemple, je lance ce qui suit (sur le superbe projet uncrustify):

$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"

Comment savoir qui a édité cette ligne avant commit fe25b6d? Et qui l'a édité avant that commit?

343
Sedate Alien
git blame -L10,+1 fe25b6d^ -- src/options.cpp

Vous pouvez spécifier une révision pour que le blâme de git regarde en arrière à partir de (au lieu de la valeur par défaut de HEAD); fe25b6d^ est le parent de fe25b6d.

347
Amber

Vous pouvez utiliser git log -L pour voir l'évolution d'une plage de lignes.

Par exemple :

git log -L 15,23:filename.txt

signifie "suivre l'évolution des lignes 15 à 23 dans le fichier nommé filename.txt".

166
Navneet

Vous voudrez peut-être vérifier:

git gui blame <filename>

Vous donne un bon affichage graphique des changements tels que "blâme git" mais avec des liens cliquables par ligne, pour passer aux commits précédents. Survolez les liens pour obtenir une fenêtre contextuelle contenant les détails de la validation. Ce n'est pas mes crédits ... je l'ai trouvé ici:

http://zsoltfabok.com/blog/2012/02/git-blame-line-history/

git gui est une interface graphique Tcl/Tc pour git. Sans aucun autre paramètre, il démarre une application graphique assez simple mais utile pour la validation de fichiers, de morceaux volants ou même de lignes simples et d'autres commandes similaires, telles que modifier, rétablir, Push ... Cela fait partie de la suite d'actions git. Sur Windows, il est inclus dans le programme d'installation. Sur debian - je ne connais pas les autres systèmes * nix - il doit être installé séparément:

apt-get install git-gui

De la docs:

https://git-scm.com/docs/git-gui

DESCRIPTION

Une interface utilisateur graphique basée sur Tcl/Tk pour Git. git gui vise à permettre aux utilisateurs d’apporter des modifications à leur référentiel en effectuant de nouveaux commits, en modifiant ceux qui existent déjà, en créant des branches, en effectuant des fusions locales et en extrayant/poussant vers des référentiels distants.

Contrairement à gitk, git gui se concentre sur la génération de validations et les annotations sur un seul fichier et ne montre pas l'historique du projet. Il fournit toutefois des actions de menu pour démarrer une session gitk à partir de git gui.

git gui est connu pour fonctionner sur tous les systèmes UNIX courants, Mac OS X et Windows (sous Cygwin et MSYS). Dans la mesure du possible, les directives relatives à l’interface utilisateur spécifique au système d’exploitation sont suivies, ce qui fait de git gui une interface relativement native pour les utilisateurs.

COMMANDES

blâmer

Démarrez un visualiseur de fautes sur le fichier spécifié dans la version donnée (ou dans un répertoire de travail s'il n'est pas spécifié).

navigateur

Démarrez un navigateur d'arborescence affichant tous les fichiers du commit spécifié. Les fichiers sélectionnés via le navigateur sont ouverts dans le visualiseur de fautes.

citool

Lancez git gui et faites en sorte de ne commettre qu’un commit avant de quitter et de revenir à Shell. L’interface est limitée aux actions de validation, ce qui réduit légèrement le temps de démarrage de l’application et simplifie la barre de menu.

version

Affiche la version en cours d'exécution de git gui.

25
Holger Böhnke

La réponse d'Amber est correcte mais je l'ai trouvée incertaine. La syntaxe est la suivante:

git blame {commit_id} -- {path/to/file}

Remarque: le -- est utilisé pour séparer l'arbre sha1 sha1 des chemins de fichiers relatifs. 1

Par exemple:

git blame master -- index.html

Un crédit complet à Ambre pour tout savoir! :)

25
ThorSummoner

S'appuyant sur la réponse précédente, ce bash one-liner devrait vous donner ce que vous cherchez. Il affiche l'historique des fautes git pour une ligne particulière d'un fichier particulier, au cours des 5 dernières révisions:

LINE=10 FILE=src/options.cpp REVS=5; for commit in $(git rev-list -n $REVS HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done

Dans le résultat de cette commande, vous pouvez voir le contenu de la ligne changer, ou le numéro de ligne affiché peut même changer, pour une validation particulière.

Cela indique souvent que la ligne a été ajoutée pour la première fois, après ce commit particulier. Cela pourrait également indiquer que la ligne a été déplacée d'une autre partie du fichier.

17
Will Sheppard

Il y a aussi recursive-blame . Il peut être installé avec

_npm install -g recursive-blame
_
12
Thomas W

Une solution unique à ce problème utilise git log:

git log -p -M --follow --stat - chemin/vers/votre/fichier

Comme expliqué par André ici

9
Mannu

Si vous utilisez JetBrains Idea IDE (et ses dérivés), vous pouvez sélectionner plusieurs lignes, cliquer avec le bouton droit de la souris sur le menu contextuel, puis sur Git -> Afficher l'historique pour la sélection. Vous verrez la liste des commits qui affectaient les lignes sélectionnées:

enter image description here

5
warvariuc

S'appuyant sur la réponse de Will Shepard, sa sortie inclura des lignes en double pour les commits sans changement, afin que vous puissiez les filtrer comme suit (avec ceci réponse )

LINE=1 FILE=a; for commit in $(git rev-list HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

Notez que j'ai supprimé l'argument REVS et que cela revient à la validation de la racine. Cela est dû à l'observation de Max Nanasy ci-dessus.

1
DavidN

Construire sur la réponse de David et je veux suivre le fichier renommé:

LINE=8 FILE=Info.plist; for commit in $(git log --format='%h%%' --name-only --follow -- $FILE | xargs echo | Perl -pe 's/\%\s/,/g'); do hash=$(echo $commit | cut -f1 -d ','); fileMayRenamed=$(echo $commit | cut -f2 -d ','); git blame -n -L$LINE,+1 $hash -- $fileMayRenamed; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

ref: affiche joliment l'historique de changement de nom de fichier dans le journal git

1
Bill Chan

Construire sur stangls 's answer , j'ai mis ce script dans mon PATH (même sous Windows) en tant que git-bh:

Cela me permet de rechercher tous les commits dans lesquels un mot était impliqué:

git bh path/to/myfile myWord

Scénario:

#!/bin/bash
f=$1
shift
csha=""
{ git log --pretty=format:%H -- "$f"; echo; } | {
  while read hash; do
    res=$(git blame -L"/$1/",+1 $hash -- "$f" 2>/dev/null | sed 's/^/  /')
    sha=${res%% (*}
    if [[ "${res}" != "" && "${csha}" != "${sha}" ]]; then
      echo "--- ${hash}"
      echo "${res}"
      csha="${sha}"
    fi
  done
}
0
VonC

J'utilise ce petit script bash pour regarder une histoire de blâme.

Premier paramètre: fichier à regarder

Paramètres suivants: passé à blâme git

#!/bin/bash
f=$1
shift
{ git log --pretty=format:%H -- "$f"; echo; } | {
  while read hash; do
    echo "--- $hash"
    git blame $@ $hash -- "$f" | sed 's/^/  /'
  done
}

Vous pouvez fournir des paramètres de blâme tels que - L 70, + 1 mais il est préférable d'utiliser la recherche régulière du blâme de git, car les numéros de ligne "changent" généralement avec le temps.

0
stangls