2012-10-10 13 views
5

Quiero recuperar algún código que eliminé en algún commit hace algún tiempo. No recuerdo el código en absoluto, pero recordé que hizo algo muy útil, pero lo eliminé porque pensé que no lo necesitaría. Sin embargo, ahora necesito recuperar ese código, pero solo recuerdo en qué función estaba.git: encuentra contenido eliminado; Solo conozco el contexto circundante

Otra información: el archivo que contiene esa función también contiene 500 líneas de código total. Hay un rango de 30 compromisos sé que el código apareció en un punto.

Esta pregunta es un problema de alto nivel. ¿Cómo puedo usar la información que conozco para obtener la información que quiero?

+3

¿Se resolvió su problema?Si es así, sería bueno que aceptases una de las respuestas si fuera útil o proporcionas la tuya para que otras personas puedan beneficiarse del conocimiento, ¡gracias! –

Respuesta

0

Si usted puede recordar el nombre de la función, o cualquier otra palabra o variable significativa, entonces puede intentar git grep

git grep <regexp> $(git rev-list <rev1>..<rev2>) 

Dónde rev1 y rev2 son los límites de su rango de comprometerse. Agrupará todo el contenido de confirmación (incluida la eliminación), por lo que seguramente encontrará su código.

Para más detalles ver How to grep (search) committed code in the git history?

+0

Según tengo entendido, ¿dará salida a todas las líneas de código que contengan el nombre de la función? Si eso es así, no quiero esas líneas, las quiero cerca. Sin embargo, el código eliminado no está cerca del comienzo del nombre de la función para que el nombre de la función aparezca en los diffs. Además, la función en sí está en cada compromiso. Por desgracia, esto no me ayuda. - a menos que esté malinterpretando algo –

+0

por lo que tiene el nombre de la función, todavía existe, y está buscando el código cerca de él, ¿verdad? entonces sabes qué archivo buscar en el archivo; suena como 'git culpa 'hará el trabajo – CharlesB

1

culpa uso git con

--reverse 

historia Walk adelante en lugar de hacia atrás. En lugar de mostrar la revisión en la que apareció una línea, muestra la última revisión en la que ha existido una línea. Esto requiere un rango de revisión como START..END donde existe el camino a la culpa en START.

o tratar de jugar con Git biseccionar hacer búsqueda binaria en sus 30 confirmaciones de encontrar aquel en el que el código de interés aparece

3
  1. Lo mejor que puede hacer es con palabras clave de búsqueda. Si conoce el nombre de una función

    git log -Sfunction 
    

    sería perfecto.

  2. Si usted tiene un patrón puede buscar en cada confirmación de cambios:

    git log --grep=pattern 
    

    lista se comete contiene ese patrón. Agregue -i para la coincidencia insensible a mayúsculas y minúsculas. Añadir --regex para la coincidencia de expresiones regulares

  3. De lo contrario

    git log -p FIRST...LAST | less 
    

    le dará texto completo. Se podría buscar, o simplemente desplazarse y visualmente escanear ...


Oh. PD. Ya que mencionas es una función de tiempo, usted podría hacer

git log --stat FIRST...LAST 

Y cuidado para los archivos con muchas deleciones() en las estadísticas de diferenciación.

+1

' git log -S' funcionó muy bien para mí en una situación similar. Necesitaba ver el código que solía estar en una clase de Ruby que se eliminó hace un tiempo, y esto me llevó directamente. ¡Increíble! :) –

Cuestiones relacionadas