git grep — Поиск по коду
git grep ищет текстовые шаблоны по всем отслеживаемым файлам. В отличие от обычного grep, он ищет только в файлах, известных Git, автоматически учитывает .gitignore и оптимизирован для скорости в репозиториях.
Почему git grep, а не обычный grep?
| Возможность | grep -r | git grep |
|---|---|---|
| Ищет в неотслеживаемых файлах | Да | Нет — только отслеживаемые файлы |
| Учитывает .gitignore | Нет | Да |
| Ищет в директории .git | Может случайно | Никогда |
| Скорость в больших репозиториях | Медленнее | Оптимизирован для Git |
| Поиск в других ветках | Нет | Да |
Базовое использование
git grep "TODO"
Эта команда ищет строку "TODO" во всех отслеживаемых файлах рабочей директории и выводит совпавшие строки с именами файлов.
Полезные флаги
| Флаг | Назначение | Пример |
|---|---|---|
-n | Показать номера строк | git grep -n "TODO" |
-c | Подсчитать совпадения по файлам | git grep -c "TODO" |
-l | Показать только имена файлов | git grep -l "TODO" |
-i | Поиск без учёта регистра | git grep -i "todo" |
-w | Совпадение только целых слов | git grep -w "log" |
-e | Использовать регулярное выражение | git grep -e "TODO|FIXME" |
Комбинирование флагов
Найти все комментарии TODO с номерами строк, без учёта регистра:
git grep -n -i "todo"
Хотите просто узнать, какие файлы содержат шаблон?
git grep -l "config"
Подсчитать, сколько совпадений в каждом файле:
git grep -c "import"
Поиск в конкретных коммитах или ветках
Одна из суперспособностей git grep — поиск в любом коммите или ветке без переключения на них:
# Поиск в конкретной ветке
git grep "database" feature/auth
# Поиск в конкретном коммите
git grep "database" abc1234
# Поиск в предыдущем коммите
git grep "database" HEAD~1
Это невероятно полезно для вопросов вроде «Была ли эта строка в последнем релизе?»
Поиск по определённым путям
Ограничьте поиск определёнными директориями или типами файлов:
# Искать только в директории src
git grep "TODO" -- src/
# Искать только в файлах JavaScript
git grep "TODO" -- "*.js"
# Исключить тестовые файлы
git grep "TODO" -- ':!tests/'
Попробуйте!
- Создайте несколько файлов с содержимым:
echo "TODO: fix login bug" > notes.txt echo "function login() { return true; }" > app.js echo "TODO: add tests" >> app.js git add notes.txt app.js git commit -m "Add project files" - Найдите все TODO:
git grep "TODO" - Получите только имена файлов:
git grep -l "TODO" - Покажите номера строк:
git grep -n "TODO" - Подсчитайте совпадения по файлам:
git grep -c "TODO" - Ищите только в файлах
.js:git grep "TODO" -- "*.js"
Ключевые моменты
git grepищет только в отслеживаемых файлах, что делает его быстрее и точнее, чемgrep -r- Используйте
-nдля номеров строк,-lдля только имён файлов,-cдля подсчёта - Вы можете искать по веткам и коммитам без переключения на них
- Ограничивайте поиск определёнными путями или типами файлов с помощью
-- <path>