2009-10-06 13 views
43

To doprowadza mnie do szału.Git: Znajdź skasowany kod

Jak znaleźć kod, który został usunięty?

skończyło się znalezieniem gdzie został stworzony z tego:

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

I to na tyle dobrze, ale byłem też ciekaw, gdzie został usunięty, a do tej pory, nie ma kości.

Najpierw wypróbowałem git diff HEAD..HEAD^|grep 'some code', rozszerzając zakres za każdym razem, aż znalazłem linie, w których zostały usunięte. Fajnie, więc przypuśćmy, że znalazłem go w zakresie HEAD^^..HEAD^^^, potem robię git show HEAD^^^ i git show HEAD^^ z grep, ale kodu nigdzie nie można znaleźć!

Potem przeczytałem się trochę na git bisect, i na pewno wystarczy, że daje mi jedną wersję, gdzie winowajcą ma być ... Znowu git show rev|grep 'some code' pojawia się pusty ...

Co się? Co ja robię źle?

Dzięki!

+2

Mówisz, że kiedy robisz w zasadzie następujące masz żadnych trafień ?:

 SHAHIT=\'git log --pretty=oneline -S'some code' | head -1 | awk '{ print $1 }'\' git show $SHAHIT | grep 'some code' 
Jeśli tak, to wydaje zakaz sensical .... czy to w 'log', powinien być widoczny w' show' ... prawda? A może nie rozumiem tego pytania. – metasim

+0

Minęło trochę czasu odkąd byłem w tej sytuacji i nie pokazał się ponownie, więc nie mogę przetestować twojego polecenia. Dzięki temu może się przydać komuś. – Ivan

+1

Stary post/komentarz tutaj, ale dokładnie to, czego potrzebowałem. @SimeonFitch Twoja składnia działa idealnie dla mnie, aby znaleźć i wyświetlić rzeczywistą linię kodu. Dodatkowym dodatkiem, który uznałem za przydatny, było użycie opcji "--context = n 'grep, aby wyświetlić wystarczającą liczbę wierszy przed/po, aby dowiedzieć się, jaka jest nazwa pliku (istnieją również inne opcje grep, które mogłyby w tym pomóc). Tak więc w moim przypadku drugim poleceniem było: git show $ SHAHIT | grep --context = 30 'some code' –

Odpowiedz

32

Hmph, działa na mnie:

 
$ 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 

Albo, czy nie jest to, co masz na myśli?

+0

To właśnie mam na myśli ... Więc jeśli to nie działa dla mnie, czy może być, że indeks jest uszkodzony lub historia została przepisana? – Ivan

+4

W tym przykładzie Pat używa 'git log -SWorld', który * nie * pokazuje różnice.Zgaduję (nie próbowałem), że jeśli ostatnim poleceniem były 'git show 00f3fd0134d0d54aafbb9d959666efc5fd492b4f | grep World', a otrzymasz zachowanie, którego szukasz. – metasim

0

Jeśli twoje repozytorium znajduje się na github.com, ma zintegrowaną funkcję wyszukiwania. To odpowiada w ms i wyszukuje w usuniętym kodzie też

+6

Nie mogłem znaleźć sposobu na github.com, aby przeszukać skasowany kod, tylko aktualny kod ... czy możesz mi pomóc, opracowując lub demonstrując, w jaki sposób? – pulkitsinghal

17

git log -S<string> wykonuje zadanie, ale jeśli potrzebujesz bardziej złożonych wyszukiwań, możesz użyć git log -G<regex>.

Z man:

-G<regex>

Look różnic którego łata tekst zawiera dodane/usunięte linie pasujących <regex>.

Powiązane problemy