2012-09-25 17 views
33

Wcześniej dzisiaj odkryłem, że brakuje jakiegoś kodu w moim repozytorium git. Znałem część brakującego tekstu i plik, w którym on był, więc użyłem git log -S'missingtext' /path/to/file. Jednak jedyną rzeczą, która powróciła, było zatwierdzenie, w którym dodałem wiersz zawierający brakujący tekst. Tekst nie był obecny w HEAD, a zatwierdzenie, które go dodało, było obecne w moim oddziale, więc wiedziałem, że jedno z zobowiązań w historii mojej oddziału musiało go usunąć, ale się nie pojawił.Znajdź, kiedy linia została usunięta

Po kilku ręcznych poszukiwaniach okazało się, że linia została przypadkowo usunięta podczas rozwiązywania konfliktu dla scalenia. Więc zastanawiam się:

  1. Czy to jest powodem, dlaczego kilof nie mógł znaleźć commit, który usunął linię?
  2. Jak mogę znaleźć miejsce, w którym "brakujący tekst" został usunięty bez ręcznego sprawdzania historii?

Każdy wgląd na # 1 byłoby świetnie (Sądziłem, że git log -S da mi odpowiedź), ale moje pytanie brzmi nr 2, ponieważ chciałbym, aby móc uniknąć tego w przyszłości.

+6

'git log -p' i'/missingtext' natomiast w 'less' to szybkie 'n' brudny sposób to zrobić. – nneonneo

+1

Możliwy duplikat [Jak "winić" usuniętą linię] (http://stackoverflow.com/questions/4404444/how-do-i-blame-a-deleted-line) – hypehuman

Odpowiedz

44

git log domyślnie nie pokazuje diff do scalania. W -c lub --cc flagi powinno załatwić sprawę:

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

Więcej Dyskusja/wyjaśnienie here.

+0

Jeśli chcesz znaleźć, kiedy usunięto wiersz z usuniętego pliku, możesz użyć 'git log -c -S'missingtext '-/path/to/file'. – Jonathan

+0

jeśli nie wiesz, który plik zawiera brakujący tekst, możesz pominąć '/ path/to/file' i po prostu uruchomić' git log -c -S'missingtext'' –

0

Szybki i brudny sposób # 2 - użyj pętli for.

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

Obejmuje to wszystkie zmiany scalania, ponieważ jawnie określa podstawowe zatwierdzenie dla diff. Wpadłem na to, ponieważ git log -c -S... dawało mi mnóstwo fałszywych pozytywów. Ponadto, gdy podałem ścieżkę do pliku w początkowej komendzie git log, pominąłem zatwierdzenie, którego szukałem.

Ponieważ może to trwać przez jakiś czas, możesz podać -n na komendzie git log lub umieścić && break na końcu pętli, jeśli potrzebujesz tylko 1 wyniku.

Powiązane problemy