Перейти к содержанию

Поиск и диффы

Git предоставляет мощные инструменты для поиска изменений в коде и сравнения версий.

Git Diff: Сравнение изменений

Базовое использование

Показать изменения в рабочей директории (не добавленные в индекс):

git diff

Показать изменения, которые уже в индексе (готовы к коммиту):

git diff --staged
# или
git diff --cached

Показать все изменения (и в индексе, и нет):

git diff HEAD

Сравнение веток и коммитов

Разница между двумя ветками:

git diff main feature

Разница между текущей веткой и конкретным коммитом:

git diff a1b2c3d

Разница между двумя конкретными коммитами:

git diff <хеш1> <хеш2>

Разница с ограничением по файлу:

git diff main feature -- path/to/file.js

Форматы вывода

Только имена измененных файлов:

git diff --name-only

Имена файлов и статистика (сколько строк добавлено/удалено):

git diff --stat

Показать только статистику без самого diff:

git diff --shortstat

Изменения по словам (а не по строкам):

git diff --word-diff

Полезно для просмотра изменений в текстах или документации.

Цветной вывод всегда:

git diff --color

Дифф для конкретного коммита

git show <хеш-коммита>

Показывает сам коммит и все изменения в нем.

git show --stat <хеш-коммита>

Коммит со статистикой изменений.

Git Log с фильтрацией

Поиск коммитов по различным критериям.

По автору

git log --author="Daniil"
git log --author="email@example.com"

По дате

# Коммиты за последнюю неделю
git log --since="1 week ago"

# Коммиты до определенной даты
git log --until="2024-01-01"

# Коммиты в диапазоне дат
git log --since="2024-01-01" --until="2024-02-01"

По тексту сообщения

git log --grep="баг"
git log --grep="fix" -i  # регистронезависимый поиск

По изменениям в коде

Найти коммиты, где менялась конкретная строка:

git log -S "функцияLogin"

Покажет коммиты, где эта строка была добавлена или удалена.

Найти коммиты, где менялся файл:

git log -- path/to/file.js

Красивый формат вывода

git log --oneline --graph --all

Отображает историю в виде графа веток.

Свой формат:

git log --pretty=format:"%h | %ad | %s" --date=short

Где: - %h — короткий хеш. - %ad — дата коммита. - %s — тема коммита.

Поиск по содержимому файлов

Git Grep

Быстрый поиск по всем файлам в репозитории (работает быстрее обычного grep).

Поиск строки:

git grep "текст для поиска"

Регистронезависимый поиск:

git grep -i "текст"

Поиск с номерами строк:

git grep -n "текст"

Поиск только в определенных файлах:

git grep "текст" -- "*.js"

Поиск регулярного выражения:

git grep -E "pattern\d+"

Показать контекст (строки до и после):

git grep -C 3 "текст"  # 3 строки до и после
git grep -B 5 "текст"  # 5 строк до
git grep -A 5 "текст"  # 5 строк после

Поиск по истории изменений в строке

git log -p -S "старый_код"

Покажет все коммиты, где эта строка появлялась или исчезала, с полным diff.

Сравнение с удаленным репозиторием

Что изменилось на сервере по сравнению с локальной веткой:

git diff main origin/main

Какие коммиты есть на сервере, но нет у вас:

git log ..origin/main

Какие коммиты есть у вас, но еще не отправлены:

git log origin/main..

Полезные алиасы

Добавьте в конфиг для удобства:

git config --global alias.d 'diff'
git config --global alias.ds 'diff --stat'
git config --global alias.lg 'log --oneline --graph --all'
git config --global alias.ls 'log --stat'
git config --global alias.search 'grep -n'

Теперь можно писать:

git ds      # вместо git diff --stat
git lg      # вместо git log --oneline --graph --all
git search "текст"  # вместо git grep -n "текст"

Назад: Cherry-pick → | Далее: Подмодули →