Je veux être en mesure de trouver une certaine chaîne qui a été introduite dans un commit dans une twig, comment puis-je le faire? J’ai trouvé quelque chose (que j’ai modifié pour Win32), mais git whatchanged
ne semble pas regarder dans les différentes twigs (ignorer le bloc py3k, c’est juste un correctif de stream msys / win line)
git whatchanged -- | \ grep "^commit " | \ python -c "exec(\"import sys,msvcrt,os\nmsvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)\nfor l in sys.stdin: print(l.split()[1])\")" | \ xargs -i% git show origin % --
Peu importe si votre solution est lente.
Tu peux faire:
git log -S --source --all
Pour trouver tous les commits qui ont ajouté ou supprimé la chaîne fixe, Le paramètre --all
signifie démarrer à partir de chaque twig et --source
signifie indiquer laquelle de ces twigs a conduit à rechercher cette validation. Il est souvent utile d’append -p
pour afficher les correctifs que chacun de ces commits introduirait également.
Les versions de git depuis 1.7.4 ont également une option -G
similaire , qui prend une expression régulière . Cela a en fait une sémantique différente (et plutôt plus évidente), expliquée dans cet article de Junio Hamano .
Comme le souligne thameera dans les commentaires, vous devez placer des guillemets autour du terme de recherche s’il contient des espaces ou d’autres caractères spéciaux, par exemple:
git log -S 'hello world' --source --all git log -S "dude, where's my car?" --source --all
Voici un exemple d’utilisation de -G
pour trouver les occurrences de la function foo() {
:
git log -G "^(\s)*function foo[(][)](\s)*{$" --source --all
–reverse est également utile car vous voulez que le premier commit qui a effectué le changement:
git log --all -p --reverse --source -S 'needle'
De cette façon, les anciens commits apparaîtront en premier.
La réponse de Mark Longair est excellente, mais j’ai trouvé cette version plus simple pour moi.
git log -S whatever
Défaire avec les mêmes réponses:
$ git config --global alias.find '!git log --color -p -S '
Maintenant tu peux faire
$ git find
ou
$ git find --all $ git find master develop
git log -S"ssortingng_to_search" # options like --source --reverse --all etc
Faites attention à ne pas utiliser d’espaces entre S et “ssortingng_to_search”. Dans certaines configurations (git 1.7.1), vous obtiendrez une erreur comme:
fatal: ambiguous argument 'ssortingng_to_search': unknown revision or path not in the working tree. Use '--' to separate paths from revisions
Bien que cela ne réponde pas directement à votre question, je pense que cela pourrait être une bonne solution pour vous dans le futur. J’ai vu une partie de mon code, ce qui était mauvais. Je ne savais pas qui l’avait écrit ou quand. Je pouvais voir tous les changements du fichier, mais il était clair que le code avait été déplacé d’un autre fichier vers celui-ci. Je voulais trouver qui l’a effectivement ajouté en premier lieu.
Pour ce faire, j’ai utilisé Git bisect , ce qui m’a rapidement permis de trouver le pécheur.
J’ai lancé git bisect start
et puis git bisect bad
, car la révision extraite avait le problème. Comme je ne savais pas quand le problème était survenu, j’ai ciblé le premier commit pour le “bon”, git bisect good
.
Ensuite, j’ai juste continué à chercher le repo pour le mauvais code. Quand je l’ai trouvé, j’ai couru git bisect bad
, et quand il n’y en avait pas: git bisect good
.
En environ 11 étapes, j’avais couvert 1000 commits et trouvé le commit exact, où le problème avait été introduit. Assez bien