2009-10-06 24 views
43

Questo mi sta facendo impazzire.Git: Trova il codice cancellato

Come trovare il codice eliminato?

Ho finito per trovare dove è stato creato con questo:

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

E questo è abbastanza buono, ma ero anche curioso di scoprire dove ha ottenuto cancellato, e finora, niente da fare.

In primo luogo, ho provato git diff HEAD..HEAD^|grep 'some code', espandendo l'intervallo ogni volta, fino a quando ho trovato le linee in cui è stato rimosso. Bello, suppongo di averlo trovato nell'intervallo HEAD^^..HEAD^^^, quindi faccio git show HEAD^^^ e git show HEAD^^ con grep, ma il codice non si trova da nessuna parte!

poi ho letto un po 'su git bisect, e abbastanza sicuro, mi dà una singola revisione in cui il colpevole dovrebbe essere ... Anche in questo caso, git show rev|grep 'some code' arriva a mani vuote ...

Cosa? Che cosa sto facendo di sbagliato?

Grazie!

+2

Sta dicendo che quando si fa fondamentalmente quanto segue si ottiene nessun colpo ?: ​​

 SHAHIT=\'git log --pretty=oneline -S'some code' | head -1 | awk '{ print $1 }'\' git show $SHAHIT | grep 'some code' 
Se è così, sembra non chiacchiere .... se è in 'log', dovrebbe essere visibile in' mostra' ... giusto? O forse sto fraintendendo la domanda. – metasim

+0

È passato un po 'di tempo da quando ero in questa situazione e non si è presentato di nuovo, quindi non posso testare il tuo comando. Grazie comunque, potrebbe rivelarsi utile per qualcuno. – Ivan

+1

Vecchio post/commento qui, ma esattamente quello di cui avevo bisogno comunque. @ SimeonFitch la tua sintassi ha funzionato perfettamente per me, per trovare ed elencare le linee di codice in questione. Un'aggiunta che ho trovato utile è stata l'uso dell'opzione '--context = n' grep per mostrare abbastanza righe prima/dopo per sapere qual è il nome del file (ci sono altre opzioni di grep che potrebbero essere d'aiuto anche con questo). Quindi nel mio caso il secondo comando era: git show $ SHAHIT | grep --context = 30 'some code' –

risposta

32

Mah, per me funziona:

 
$ 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 

Oppure, non è questo che vuoi dire?

+0

Questo è ciò che intendo ... Quindi se non funziona per me, potrebbe essere che l'indice sia corrotto o che la cronologia sia stata riscritta? – Ivan

+4

In questo esempio, Pat sta usando 'git log -SWorld' che * non * mostra le differenze.Sto indovinando (non l'ho provato) che se l'ultimo comando fosse 'git show 00f3fd0134d0d54aafbb9d959666efc5fd492b4f | grep World' allora otterrai il comportamento che stai cercando. – metasim

0

Se il repository si trova su github.com, ha una funzione integrata di ricerca. Risponde in ms ed esegue la ricerca nel codice cancellato troppo

+6

Non riesco a trovare un modo su github.com per cercare attraverso il codice cancellato, solo il codice corrente ... puoi aiutarmi elaborando o dimostrando come? – pulkitsinghal

17

git log -S<string> fa il lavoro, ma se avete bisogno di fare ricerche più complesse è possibile utilizzare git log -G<regex>.

Dal man:

-G<regex>

cercare le differenze la cui patch di testo contiene aggiunto/rimosso linee che corrispondono <regex>.

Problemi correlati