Olen kunagi varem kustutanud faili või mõne faili koodi. Kas ma saan greipida sisu (mitte commit-teateid)?
Väga kehv lahendus on grep logi:
git log -p | grep <pattern>
See ei anna aga kohe tagastada commit hash'i. Ma mängisin git grep
iga tulutult ringi.
Et otsida kommiteerimise sisu (st tegelikud read lähtekoodist, erinevalt kommiteerimisteadetest jms), tuleb teha järgmist:
git grep <regexp> $(git rev-list --all)
git rev-list --all | xargs git grep <väljend>
töötab, kui te satute veale "Argumentide nimekiri liiga pikk".
Kui soovite piirata otsingut mingi alampuuga (näiteks "lib/util"), peate selle samuti üle andma rev-list
alamkäsule ja grep
ile:
git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util
See grepib läbi kogu teie kommiteeritud teksti regexp
jaoks.
Põhjus, miks te peate mõlemas käsus edastama tee, on see, et rev-list
tagastab revisioonide nimekirja, kus kõik muudatused lib/util
is toimusid, kuid te peate ka grep
ile edastama, et see otsiks ainult lib/util
is.
Kujutage ette järgmist stsenaariumi: grep
võib leida sama <regexp>
ka teistes failides, mis sisalduvad samas revisionis, mille tagastab rev-list
(isegi kui selles failis ei toimunud selles revisionis mingeid muudatusi).
Siin on mõned muud kasulikud viisid oma lähtekoodi otsimiseks:
Otsi tööpuu tekstist, mis vastab regulaaravaldisele regexp:
git grep <regexp>
Otsi tööpuu tekstiread, mis vastavad regulaaravaldisele regexp1 või regexp2:
git grep -e <regexp1> [--or] -e <regexp2>
Otsi tööpuu tekstiread, mis vastavad regulaaravaldisele regexp1 ja regexp2, teatades ainult failipadasid:
git grep -e <regexp1> --and -e <regexp2>
Otsi tööpuu failidest read, mille tekstirid vastavad regulaaravaldisele regexp1 ja read, mille tekstirid vastavad regulaaravaldisele regexp2:
git grep -l --all-match -e <regexp1> -e <regexp2>
Otsi tööpuu muudetud tekstiridade kohta, mis vastavad mustrile:
git diff --unified=0 | grep <pattern>
Otsi kõikidest parandustest tekst, mis vastab regulaaravaldisele regexp:
git grep <regexp> $(git rev-list --all)
Otsi kõik rev1 ja rev2 vahelised versioonid regulaaravaldisele regexp vastava teksti jaoks:
git grep <regexp> $(git rev-list <rev1>..<rev2>)
Sa peaksid kasutama pickaxe (-S
) valikut git log
.
Foo
otsimiseks:
git log -SFoo -- path_containing_change
git log -SFoo --since=2009.1.1 --until=2010.1.1 -- path_containing_change
Vt Git history - leida kadunud rida märksõna järgi.
Nagu Jakub Narębski kommenteeris:
See otsib erinevusi, mis lisavad või eemaldavad <string>
.
Tavaliselt tähendab see "parandusi, kus lisati või eemaldati rida koos 'Foo'".
valik --pickaxe-regex
võimaldab kasutada laiendatud POSIX regexi, selle asemel, et otsida stringi.
Nagu Rob kommenteeris, on see otsing suur- ja väiketähtedega - ta avas jätkuküsimuse selle kohta, kuidas otsida suur- ja väiketähtedeta.
Kas sa üritad siis vanemaid koodiversioone greipida, et näha, kus midagi viimati olemas oli?
Kui ma seda teeksin, kasutaksin ma tõenäoliselt git bisect. Kasutades bisecti, saate määrata teadaoleva hea versiooni, teadaoleva halva versiooni ja lihtsa skripti, mis teeb kontrolli, kas versioon on hea või halb (antud juhul grep, et näha, kas otsitav kood on olemas). Selle käivitamine leiab, millal kood eemaldati.