114 votes

Trouver où le code a été supprimé dans un référentiel Git

Comment trouver le code qui a été supprimé?

J'ai fini par trouver où il a été créé avec ceci:

$ git log --pretty=oneline -S'some code'

Et c'est assez bien, mais j'étais aussi curieux de savoir où il a été supprimé, et jusqu'à présent, aucun résultat.

D'abord, j'ai essayé git diff HEAD..HEAD^ | grep 'some code', en élargissant la plage à chaque fois, jusqu'à ce que je trouve les lignes où il a été supprimé. Bien, donc supposons que je l'ai trouvé dans la plage HEAD^^..HEAD^^^, ensuite je fais git show HEAD^^^ et git show HEAD^^ avec grep, mais le code est introuvable!

Ensuite j'ai lu un peu sur git bisect, et bien sûr, il me donne une révision unique où le coupable est censé être... Encore une fois, git show rev | grep 'some code' ne donne rien...

Qu'est-ce que je fais de mal?

95voto

simone Points 5580

git log -S fait le travail, mais si vous avez besoin de faire des recherches plus complexes, vous pouvez utiliser git log -G.

Du man:

-G

Rechercher des différences dont le texte du patch contient des lignes ajoutées/supprimées qui correspondent à .

73voto

Pat Notz Points 46841

Hmph, cela fonctionne pour moi :

$ git init
Initialisation d'un dépôt Git vide à /Users/pknotz/foo/.git/

$ echo "Bonjour" > a

$ git add a

$ git commit -am "commit initial"
[master (root-commit) 7e52a51] commit initial
 1 fichier modifié, 1 insertion(+), 0 suppression(-)
 création mode 100644 a

$ echo " Monde" >> a

$ git commit -am "Être plus précis"
[master 080e9fe] Être plus précis
 1 fichier modifié, 1 insertion(+), 0 suppression(-)

$ echo "Bonjour" > a

$ git commit -am "Être moins précis"
[master 00f3fd0] Être moins précis
 1 fichier modifié, 0 insertions(+), 1 suppression(-)

$ cat a
Bonjour

$ git log -SWorld
commit 00f3fd0134d0d54aafbb9d959666efc5fd492b4f
Auteur: Pat Notz <patnotz@gmail.com>
Date:   Mar Oct 6 17:20:48 2009 -0600

    Être moins précis

commit 080e9fe84ff89aab9d9d51fb5d8d59e8f663ee7f
Auteur: Pat Notz <patnotz@gmail.com>
Date:   Mar Oct 6 17:20:33 2009 -0600

    Être plus précis

Ou, est-ce que ce n'est pas ce que vous voulez dire ?

7voto

Dionysius Points 103

J'ai trouvé un moyen de trouver le commit spécifique, mais il n'est affiché que lors de la différence entre ces commits. Je ne peux pas expliquer pourquoi Git fonctionne de cette façon, mais je vais expliquer mes conclusions:


Problème expliqué

Avec '-S' ou '-G', nous ne pouvons trouver que où il a été ajouté, pas supprimé. Pour illustrer:

$ git log --format="%H" -S"127.0.124.1"
857aa361293abbb351d6d6becaa55ec011aebc93
$ git show 857aa361293abbb351d6d6becaa55ec011aebc93 | grep "127.0.124.1" # Supprimer grep pour voir la diff complète
+       return "127.0.124.1", nil

Étape par étape

J'ai eu l'idée de miku86 sur dev.to. Tout d'abord, nous essayons de trouver le dernier commit où notre chaîne existait :

$ git --no-pager grep "127.0.124.1" $(git rev-list --all) # | head -n1 | cut -d: -f1 # Décommentez pour afficher uniquement le hash du premier
ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b:some/file.go:        return "127.0.124.1"
0d19a98d6434da0b4b5cc2bac190b9b1de36d992:some/file.go:        return "127.0.124.1"
84274c5712bacbbee1dca5567cef77a2b6f356d2:some/file.go:        return "127.0.124.1"
42e692643ff8a5dce7a89e985062b3d38c60fcc0:some/file.go:        return "127.0.124.1"

Cela donne ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b est notre commit recherché. Ensuite, nous essayons de trouver le commit suivant après celui-ci jusqu'à HEAD :

$ git rev-list ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b.. # | tail -n1 # Décommentez pour afficher le dernier
[...]
c82d040f7be2f8955075655843400a36ceb75303
aa0568b543db57564770d73e736aaf50fd749fb4
dde61dae0cf648e7f4dd8a5c194bcf9be1745793

Ce qui est dde61dae0cf648e7f4dd8a5c194bcf9be1745793, puisque c'est le dernier dans cette liste que nous cherchons.

Cela signifie que dde61dae0cf648e7f4dd8a5c194bcf9be1745793 devrait contenir cette suppression ?

$ git show dde61dae0cf648e7f4dd8a5c194bcf9be1745793 | grep "127.0.124.1" # Supprimer grep pour voir la diff complète
#

Non ?!? Eh bien, quelle est la diff alors de cela à notre premier commit trouvé ?

$ git diff ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b..dde61dae0cf648e7f4dd8a5c194bcf9be1745793 | grep "127.0.124.1" # Supprimer grep pour voir la diff complète
-       return "127.0.124.1"

Ici nous l'avons trouvé. C'est étrange. Mais puisque nous utilisons une différence entre des commits, ai-je fait une erreur et y a-t-il d'autres commits entre les deux ?

$ git log --pretty=oneline ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b..dde61dae0cf648e7f4dd8a5c194bcf9be1745793
dde61dae0cf648e7f4dd8a5c194bcf9be1745793 réseau interface

Non, il semble que nous n'ayons pas commis d'erreur. C'est étrange. Mais oui, c'est jusqu'où je suis arrivé pour trouver l'endroit spécifique du changement où la chaîne a disparu.


De plus

J'ai pu confirmer en utilisant git bisect que dde61dae0cf648e7f4dd8a5c194bcf9be1745793 est le commit que je cherchais.

# En effectuant un bissage...
$ git bisect mauvais
dde61dae0cf648e7f4dd8a5c194bcf9be1745793 est le premier mauvais commit
commit dde61dae0cf648e7f4dd8a5c194bcf9be1745793
Auteur : ...
Date :   ven. 18 oct. 2019 11:04:26 +0200

    interface réseau

:100644 100644 242e81c363c2c7069efb018821821553b98f2c97 416c27f5351a9d92a6914b34846c6de51d83dd0d M      go.mod
:040000 040000 715c3ab5b3f4579d8054618f1e11fc05fb425324 e6731408a1ac1ff0428128ccbb1fbfaad4c789ab M      network
[...]

0voto

Elvis Ciotti Points 1384

Si votre dépôt se trouve sur github.com, il dispose d'une fonction intégrée de recherche. Il répond en ms et recherche également dans le code supprimé

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X