En utilisant git pour trouver la première introduction de jeton sur une ligne spécifique d'un fichier
-
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.
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 (commegit gui blame
ou la vue de faute dansgit 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.