Тур по Git
Продвинутый Git / Урок 5.10

git grep — Поиск по коду

git grep ищет текстовые шаблоны по всем отслеживаемым файлам. В отличие от обычного grep, он ищет только в файлах, известных Git, автоматически учитывает .gitignore и оптимизирован для скорости в репозиториях.

Почему git grep, а не обычный grep?

Возможностьgrep -rgit 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/'

Попробуйте!

  1. Создайте несколько файлов с содержимым:
    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"
    
  2. Найдите все TODO: git grep "TODO"
  3. Получите только имена файлов: git grep -l "TODO"
  4. Покажите номера строк: git grep -n "TODO"
  5. Подсчитайте совпадения по файлам: git grep -c "TODO"
  6. Ищите только в файлах .js: git grep "TODO" -- "*.js"

Ключевые моменты

  • git grep ищет только в отслеживаемых файлах, что делает его быстрее и точнее, чем grep -r
  • Используйте -n для номеров строк, -l для только имён файлов, -c для подсчёта
  • Вы можете искать по веткам и коммитам без переключения на них
  • Ограничивайте поиск определёнными путями или типами файлов с помощью -- <path>
🎯

Цель

Используйте git grep для поиска файлов, содержащих слово 'TODO'

Terminal
$

No commits yet. Run `git init` and create your first commit.