En utilisant git pour trouver la première introduction de jeton sur une ligne spécifique d'un fichier

StackOverflow https://stackoverflow.com/questions/1863393

  •  16-09-2019
  •  | 
  •  

Question

Disons que j'ai un fichier A.cpp, et je remarque une erreur sur la ligne 15 du fichier. Disons que l'erreur est un « const » sur une fonction qui renvoie un pointeur vers une variable membre, ce qui signifie en utilisant const la fonction est techniquement correcte mais sémantiquement mal. Je voudrais discuter de la sémantique avec l'auteur qui a fait le changement.

En utilisant git, est-il un moyen de savoir quelle révision introduit le jeton « const »? Plus précisément, je voudrais savoir qui a introduit le jeton.

« blâme git » montre qui a fait la dernière modification de la ligne, mais je voudrais vraiment trouver la première commettras contenant le jeton.

Était-ce utile?

La solution

git bisect est ce que vous êtes à la recherche de. Avec cette commande, vous pouvez trouver rapidement ce que allouent a introduit le const.

Vous commencez le processus avec git bisect start, puis marquez une ancienne version sans const aussi bon avec bisect good git et et l'actuel comme bisect bad. Ensuite, le système vous enverra une version au milieu. Vous pouvez vérifier si le mal const est là, et marquer cette version bonne ou mauvaise selon elle. Ensuite, le processus est répété jusqu'à ce que vous trouviez la mauvaise commettras.

Autres conseils

Il y a quelques façons de le faire.

  • git blame, ou mieux outil de responsabilité graphique (comme git gui blame ou la vue de faute dans git instaweb / gitweb) pour parcourir l'histoire d'une ligne, remontant dans l'histoire jusqu'à ce que vous trouvez approprié engagement.

  • soi-disant "recherche pickaxe", à savoir git log -S avec jeton / regexp approprié, de trouver (Liste) tous les engage où nombre de jetons donnés changé (ce qui signifie habituellement où jeton donné a été ajouté ou supprimé), par exemple:.

    git log --reverse -p -S'const int foobar' -- A.cpp
    
  • git bisect où « mauvais » signifierait engager celui avec « const » où elle  ne doit pas être (test en utilisant par exemple grep).

Le changement peut-être pas toujours été sur la ligne 15 de A.cpp, donc utiliser le contexte environnant. Disons que ce fut une définition de const int foobar:

git grep 'const *int *foobar' \
  $(git log --reverse --pretty=format:%H -- A.cpp) -- \
  A.cpp | head -1

Cette recherche vers l'avant dans le temps par tous les commits sur la branche courante qui touchent A.cpp et trouve le premier qui contient le modèle incriminé. La sortie sera le SHA-1 et la ligne de correspondance lors de la révision de A.cpp de validation.

Une fois que vous connaissez la validation, utilisez git show pour apprendre l'auteur.

Si la ligne existait sans jeton const dans certains commettras que vous savez, vous pouvez y démarrer et utiliser le drapeau --reverse en blâme git pour trouver la dernière révision dans laquelle la ligne n'a pas le jeton const. Ensuite, il suffit de regarder à la prochaine révision du dossier après.

J'utiliser QGit pour cela, sélectionnez les lignes d'intérêt, et filtrer à ce sujet, puis vous ne voyez que la liste des changements pour cette ligne. Pour une seule ligne, il est pas dû sauter dans quelques révisions.

par:

  • QGit ouvert sur dépôt
  • open vue Arbre
  • trouver le fichier
  • ligne trouver
  • ligne de sélection d'intérêt
  • «révision de filtre de lignes sélectionnées de la presse sur le bouton, ressemble à un entonnoir.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top