git grep to wbudowana w Git wyszukiwarka tekstu, która przeszukuje pliki śledzone w repozytorium. W przeciwieństwie do zwykłego grep -r nie traci czasu na katalog .git, pliki ignorowane przez .gitignore ani na śmieci typu node_modules — czyta dokładnie to, co Git zna. Dzięki temu jest szybsza, a dodatkowo potrafi szukać nie tylko w bieżącym stanie roboczym, ale też w dowolnym commicie, tagu czy gałęzi. Jeśli kiedyś robiłeś grep po całym projekcie i czekałeś wieki — to jest narzędzie, które chcesz znać.
Składnia i najważniejsze opcje
Podstawowa forma: git grep [opcje] , gdzie to opcjonalna nazwa gałęzi lub commita.
-n— pokazuje numery linii dla każdego trafienia.-i— ignoruje wielkość liter (case-insensitive).-l— wypisuje tylko nazwy plików z trafieniem, bez treści linii.-c— zlicza liczbę pasujących linii w każdym pliku.-w— dopasowuje tylko całe słowa, nie fragmenty.-E— włącza rozszerzone wyrażenia regularne (jakgrep -E);-Ftraktuje wzorzec dosłownie.--cached— szuka w indeksie (poczekalni), nie w plikach na dysku.-A,-B,-C— pokazują linie po, przed i wokół trafienia (kontekst).
Przykłady użycia
git grep -n "TODO"— znajduje wszystkieTODOw śledzonych plikach wraz z numerami linii.git grep -i "apikey"— szuka frazy niezależnie od wielkości liter, więc złapie teżApiKeyiAPIKEY.git grep -l "useState" -- '*.jsx'— wypisuje same nazwy plików.jsx, w których pojawia sięuseState.git grep "deprecated" v1.2.0— przeszukuje stan repozytorium z taguv1.2.0, bez przełączania gałęzi.git grep -n -e "host" --and -e "port"— znajduje linie zawierające jednocześniehostiport.
Częste błędy i pułapki
Najczęstsza niespodzianka: git grep domyślnie pomija pliki nieśledzone i ignorowane. Jeśli czegoś szukasz, a tego nie widzisz, to być może plik nie jest dodany do Gita — wtedy dorzuć --untracked. Druga pułapka: domyślnie działają podstawowe wyrażenia regularne, więc znaki +, ? czy | nie zadziałają jak myślisz, dopóki nie dodasz -E (albo nie użyjesz -F dla zwykłego tekstu). Pamiętaj też, że podanie przeszukuje commit, a nie Twój dysk — jeśli masz niezapisane zmiany, ich tam nie znajdziesz; do indeksu służy --cached. Wreszcie: poza repozytorium Git polecenie po prostu zawiedzie z błędem „not a git repository” — wtedy wracasz do zwykłego grep.
Powiązane komendy: grep, git log -S (szukanie po historii zmian), git show oraz ripgrep (rg) jako szybka alternatywa poza Gitem.