2009-10-06 7 views
43

Cela me rend dingue.Git: Trouver le code supprimé

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

je fini par trouver où il a été créé avec ceci:

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

Et c'est assez bon, mais j'étais aussi curieux de savoir où il a été supprimé, et à ce jour, pas de dés. Tout d'abord, j'ai essayé git diff HEAD..HEAD^|grep 'some code', en augmentant la portée à chaque fois, jusqu'à ce que je trouve les lignes où il a été supprimé. Nice, alors supposons que je l'ai trouvé sur la plage HEAD^^..HEAD^^^, puis je fais git show HEAD^^^ et git show HEAD^^ avec grep, mais le code est introuvable!

Ensuite, je lis un peu sur git bisect, et bien sûr, il me donne une seule révision où le coupable est censé être ... Encore une fois, git show rev|grep 'some code' arrive vide ...

Que? Qu'est-ce que je fais mal?

Merci!

+2

Voulez-vous dire que lorsque vous faites essentiellement suivant vous obtenez le pas de résultats ?:

 SHAHIT=\'git log --pretty=oneline -S'some code' | head -1 | awk '{ print $1 }'\' git show $SHAHIT | grep 'some code' 
Si oui, semble non sensical .... si elle est dans 'log', il doit être visible dans' show' ... pas vrai? Ou peut-être que je ne comprends pas la question. – metasim

+0

Cela faisait un moment que j'étais dans cette situation et il ne s'est pas encore présenté, donc je ne peux pas tester votre commande. Merci quand même, ça peut être utile pour quelqu'un. – Ivan

+1

Ancien poste/commentaire ici, mais exactement ce dont j'avais besoin néanmoins. @SimeonFitch votre syntaxe a parfaitement fonctionné pour moi, pour trouver et énumérer la ligne de code réelle (s) en question. Un ajout que j'ai trouvé utile était d'utiliser l'option '--context = n' grep pour montrer suffisamment de lignes avant/après pour savoir ce que le nom de fichier est aussi (il y a d'autres options grep qui pourraient aider avec ça aussi). Donc, dans mon cas, la deuxième commande était: git show $ SHAHIT | grep --context = 30 'du code' –

Répondre

32

Pff, travaille pour moi:

 
$ git init 
Initialized empty Git repository in /Users/pknotz/foo/.git/ 

$ echo "Hello" > a 

$ git add a 

$ git commit -am "initial commit" 
[master (root-commit) 7e52a51] initial commit 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 a 

$ echo " World" >> a 

$ git commit -am "Be more specific" 
[master 080e9fe] Be more specific 
1 files changed, 1 insertions(+), 0 deletions(-) 

$ echo "Hello" > a 

$ git commit -am "Be less specific" 
[master 00f3fd0] Be less specific 
1 files changed, 0 insertions(+), 1 deletions(-) 

$ cat a 
Hello 

$ git log -SWorld 
commit 00f3fd0134d0d54aafbb9d959666efc5fd492b4f 
Author: Pat Notz <[email protected]> 
Date: Tue Oct 6 17:20:48 2009 -0600 

    Be less specific 

commit 080e9fe84ff89aab9d9d51fb5d8d59e8f663ee7f 
Author: Pat Notz <[email protected]> 
Date: Tue Oct 6 17:20:33 2009 -0600 

    Be more specific 

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

+0

Voilà ce que je veux dire ... Donc, si ça ne marche pas pour moi, est-ce que l'index est corrompu ou l'historique a été réécrit? – Ivan

+4

Dans cet exemple, Pat utilise 'git log -SWorld' qui ne montre pas les diffs.Je devine (ne l'ai pas essayé) que si la dernière commande était 'git show 00f3fd0134d0d54aafbb9d959666efc5fd492b4f | Grep World' alors vous obtiendrez le comportement que vous recherchez. – metasim

0

Si votre référentiel est sur github.com, il dispose d'une fonction intégrée à rechercher. Il répond en ms et il recherche dans le code supprimé trop

+6

Je ne pouvais pas trouver un moyen sur github.com de rechercher dans le code supprimé, seul le code actuel ... pouvez-vous m'aider en élaborant ou en démontrant comment? – pulkitsinghal

17

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

De l'man:

-G<regex>

Rechercher des différences dont le texte correctif contient des lignes ajouté/enlevé qui correspondent à <regex>.

Questions connexes