2009-10-06 15 views
43

Esto me está volviendo loco.Git: Buscar código eliminado

¿Cómo puedo encontrar el código que se eliminó?

que acabamos encontrando donde se creó con esto:

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

Y eso es lo suficientemente bueno, pero también estaba curioso por saber dónde se borraron, y hasta ahora, no dados.

Primero, probé git diff HEAD..HEAD^|grep 'some code', expandiendo el rango cada vez, hasta que encontré las líneas donde se eliminó. Bien, supongo que lo encontré en el rango HEAD^^..HEAD^^^, luego hago git show HEAD^^^ y git show HEAD^^ con grep, ¡pero el código no se encuentra en ninguna parte!

luego leí un poco sobre git bisect, y por supuesto, me da una única revisión donde se supone que el culpable de ser ... Una vez más, git show rev|grep 'some code' viene con las manos vacías ...

Lo que el? ¿Qué estoy haciendo mal?

Gracias!

+2

¿Quiere decir que cuando lo hace, básicamente, la siguiente no se obtienen éxitos ?:

 SHAHIT=\'git log --pretty=oneline -S'some code' | head -1 | awk '{ print $1 }'\' git show $SHAHIT | grep 'some code' 
Si es así, parece sin sentido .... si es en 'log', que debe ser visible en' mostrar' ... ¿verdad? O tal vez estoy malinterpretando la pregunta. – metasim

+0

Ha pasado un tiempo desde que estuve en esta situación y no se ha presentado nuevamente, así que no puedo probar tu comando. Gracias de todos modos, puede ser útil para alguien. – Ivan

+1

Publicación anterior/comentario aquí, pero exactamente lo que necesitaba, no obstante. @SimeonFitch tu sintaxis funcionó perfectamente para mí, para encontrar y enumerar las líneas de código reales en cuestión. Una adición que encontré útil fue usar la opción '--context = n' grep para mostrar suficientes líneas antes/después para saber también cuál es el nombre del archivo (hay otras opciones de grep que también ayudarían con esto). Entonces, en mi caso, el segundo comando fue: git show $ SHAHIT | grep --context = 30 'some code' –

Respuesta

32

Hum, funciona para mí:

 
$ 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 

O bien, esto no es lo que quiere decir?

+0

Eso es lo que quiero decir ... Entonces, si no funciona, ¿podría ser que el índice esté dañado o que se haya reescrito el historial? – Ivan

+4

En este ejemplo, Pat está usando 'git log -SWorld' que no * * muestra los difs.Supongo (no lo he probado) que si el último comando fuera 'git show 00f3fd0134d0d54aafbb9d959666efc5fd492b4f | grep World' entonces obtendrías el comportamiento que estás buscando. – metasim

0

Si su repositorio está en github.com, tiene una función integrada para buscar. Responde en ms y se busca en el código borrado demasiado

+6

No pude encontrar una forma en github.com para buscar a través del código eliminado, solo el código actual ... ¿me pueden ayudar elaborando o demostrando cómo? – pulkitsinghal

17

git log -S<string> hace el trabajo, pero si usted necesita para hacer búsquedas más complejas se puede usar git log -G<regex>.

Desde el man:

-G<regex>

buscar diferencias cuyo parche contiene el texto añadido/borrado las líneas que coincidan con <regex>.

Cuestiones relacionadas