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). |
-- <cale> |
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 grepsă găsească text în fișiere noi, încă neadăugate: implicit caută doar în fișierele urmărite. Adaugă--untrackedsau rulează întâigit 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.