2012-09-25 28 views
33

Proprio oggi ho scoperto che un certo codice mancava dal mio repository git. Conoscevo parte del testo mancante e il file in cui si trovava, quindi ho usato git log -S'missingtext' /path/to/file. Tuttavia, l'unica cosa che è tornata è stata la commit in cui ho aggiunto la riga contenente il testo mancante. Il testo non era presente in testa, e il commit che ha aggiunto che era presente nel mio ramo, quindi sapevo che uno dei commit nella storia della mia filiale doveva essere rimosso, ma non è stato rivelando.Trova quando la linea è stata eliminata

Dopo qualche ricerca manuale, si è scoperto che la linea è stata staccato inavvertitamente mentre risolvere un conflitto per una stampa. Quindi mi chiedo:

  1. È questo il motivo per cui pickaxe non è riuscito a trovare il commit che ha eliminato la linea?
  2. Come ho potuto trovato dove "missingtext" è stata eliminata senza scavare attraverso la storia manualmente?

Qualsiasi comprensione su # 1 sarebbe fantastico (ho pensato che git log -S mi avrebbe dato la mia risposta), ma la mia vera domanda è # 2 in quanto mi piacerebbe essere in grado di evitare questo in futuro.

+6

'log -p' git e'/missingtext' mentre nel 'less' è un 'n' modo sporco rapido per farlo. – nneonneo

+1

Possibile duplicato di [Come faccio a "dare la colpa" a una linea cancellata] (http://stackoverflow.com/questions/4404444/how-do-i-blame-a-deleted-line) – hypehuman

risposta

44

git log non mostra un diff per merge impegna per impostazione predefinita. I -c o --cc bandiere dovrebbe fare il trucco:

git log -c -S'missingtext' /path/to/file

Più discussione/spiegazione here.

+0

Se si desidera trovare quando un linea è stata rimossa da un file eliminato, è possibile utilizzare 'git log -c -S'missingtext '-/percorso/su/file'. – Jonathan

+0

se non sai quale file contiene il testo mancante, puoi omettere "/ percorso/su/file" e lanciare semplicemente "git log -c -S'missingtext". –

0

Modo rapido e sporco n. 2: utilizzare un ciclo for.

for commit in $(git log --pretty='%H'); do 
    git diff -U0 --ignore-space-change "$commit^" "$commit" | grep '^-.*missingtext' > /dev/null && echo "$commit" 
done 

Questo includerà tutte le modifiche di unione perché specifica esplicitamente il commit di base per il diff. Mi è venuto in mente perché git log -c -S... mi stava dando un sacco di falsi positivi. Inoltre, quando ho specificato un percorso file nel comando git log iniziale, è saltato il commit che stavo cercando.

Dal momento che questo può funzionare per un po ', è possibile specificare -n sul comando git log o porre && break alla fine del ciclo, se hai solo bisogno di 1 risultato.

Problemi correlati