git grep în Git

Caută un text sau o expresie regulată în fișierele urmărite de Git, în directorul de lucru sau în orice commit din istoric.

Sintaxă comandă
git grep [opțiuni] <tipar> [<commit>...] [-- <cale>...]

Ce face git grep

git grep seamănă cu grep -r, dar caută doar în fișierele pe care Git le urmărește. Ignoră automat directoare precum node_modules/ sau vendor/ trecute în .gitignore, așa că rezultatele sunt mai curate și căutarea e de obicei rapidă.

Poți căuta și într-o versiune veche fără să o scoți pe disc: dai numele unui commit, al unei ramuri sau al unei etichete după tipar (de exemplu git grep TODO v1.0). Pentru a găsi commit-ul care a adăugat sau a șters un text, folosește în schimb git log -S.

Opțiuni și argumente

Opțiune / Parametru Descriere
-n, --line-number Afișează numărul liniei pentru fiecare potrivire.
-i, --ignore-case Caută fără să țină cont de litere mari și mici.
-w, --word-regexp Potrivește doar cuvinte întregi.
-l, --files-with-matches Afișează doar numele fișierelor care conțin tiparul.
-c, --count Afișează câte potriviri are fiecare fișier.
-E, --extended-regexp Interpretează tiparul ca expresie regulată extinsă.
--untracked Caută și în fișierele neurmărite (dar nu în cele ignorate).
-- &lt;cale&gt; Limitează căutarea la anumite fișiere sau directoare (de exemplu -- '*.py').

Exemple

Exemplul 1: Găsirea tuturor notițelor TODO din proiect

Afișăm fișierul și numărul liniei pentru fiecare potrivire, ca să putem sări direct la ea în editor.

git init -q -b main magazin
cd magazin
git config user.name "Ana Popescu" && git config user.email "ana@exemplu.ro"
printf 'def total(cos):\n    # TODO: adauga TVA 21%%\n    return sum(cos)\n' > cos.py
printf 'ORAS = "Iasi"\n# TODO: muta in config\n' > setari.py
git add . && git commit -q -m "Prima versiune"
git grep -n TODO

Rezultat

cos.py:2:    # TODO: adauga TVA 21%
setari.py:2:# TODO: muta in config

Exemplul 2: Căutare într-o versiune veche, fără checkout

Prețul a fost schimbat între timp; căutăm valoarea veche direct în commit-ul anterior (HEAD~1).

git init -q -b main magazin
cd magazin
git config user.name "Ana Popescu" && git config user.email "ana@exemplu.ro"
echo 'PRET_LIVRARE = 15  # lei' > livrare.py
git add . && git commit -q -m "Livrare 15 lei"
echo 'PRET_LIVRARE = 20  # lei' > livrare.py
git commit -q -am "Livrare 20 lei"
echo "--- acum:"
git grep -n PRET_LIVRARE
echo "--- in commit-ul anterior:"
git grep -n PRET_LIVRARE HEAD~1

Rezultat

--- acum:
livrare.py:1:PRET_LIVRARE = 20  # lei
--- in commit-ul anterior:
HEAD~1:livrare.py:1:PRET_LIVRARE = 15  # lei

Exemplul 3: Doar numele fișierelor, limitat la fișiere Python

Cu -l și o cale după -- obținem lista fișierelor Python care folosesc funcția calculeaza_nota.

git init -q -b main scoala
cd scoala
git config user.name "Ana Popescu" && git config user.email "ana@exemplu.ro"
mkdir -p app docs
echo 'def calculeaza_nota(x): return round(x, 2)' > app/note.py
echo 'from note import calculeaza_nota' > app/raport.py
echo 'Vezi calculeaza_nota in app/note.py' > docs/README.md
git add . && git commit -q -m "Catalog"
git grep -l calculeaza_nota -- '*.py'

Rezultat

app/note.py
app/raport.py

Greșeli frecvente

  • Așteptarea ca git grep să găsească text în fișiere noi, încă neadăugate: implicit caută doar în fișierele urmărite. Adaugă --untracked sau rulează întâi git add.
  • Uitarea separatorului -- înaintea căilor: fără el, Git poate interpreta numele unui fișier ca nume de commit sau ramură și afișează o eroare de ambiguitate.

Comenzi înrudite

  • git log: Afișează istoricul cronologic al commit-urilor, cu autor, dată, hash și mesaj.
  • git ls-files: Listează fișierele din index (urmărite de Git), dar și fișierele modificate, neurmărite sau ignorate.
  • git blame: Afișează autorul, data și hash-ul commit-ului care a modificat ultima dată fiecare rând dintr-un fișier.