git grep

Przeszukuje śledzone pliki w repozytorium pod kątem wzorca tekstu.

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 (jak grep -E); -F traktuje 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 wszystkie TODO w śledzonych plikach wraz z numerami linii.
  • git grep -i "apikey" — szuka frazy niezależnie od wielkości liter, więc złapie też ApiKey i APIKEY.
  • 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 tagu v1.2.0, bez przełączania gałęzi.
  • git grep -n -e "host" --and -e "port" — znajduje linie zawierające jednocześnie host i port.

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.