Skip to content

Поиск в Git

git blame

Показывает информацию о всех внесенных в конкретный файл изменениях, а именно: кто, когда и в каком коммите последним изменил строку. Информация предоставляется о последней версии строки, но не об истории ее изменения, так же нет информации об удаленных строках.

blame построчно просматривает файл и про каждую строку говорит: что, кто и в какой момент привел ее в это состояние.

git blame можно применять к любому коммиту, в итоге получить информацию о состоянии файла на момент этого коммита

git blame
git blame <file-name> # показывает инфомацию о файле
   commit-ID   (user-name     commit-time  string-#)      string
# ID-коммита  (пользователь  время        номер строки)  содержание строки

git blame HEAD <file-name> # состояние файла на моент последнего коммита
git blame HEAD~1 <file-name> # состояние файла на моент предпоследнего коммита
git blame <commit-ID> <file-name> # состояние файла на момент конкретного коммита
git blame <branch-name> <file-name> # состояние файла в конкретной ветке

git blame -s # убирает из вывода информацию и пользователе и времени создания коммита

git grep

В репозитории гита можно использовать класический поиск grep. Поиск происходит внутри файлов, в ответ выдается: имя файла и строка с найденым словом.

git grep
git grep <some-word> # поиск слова в отслеживаемых гитом файлах
git grep "some-string" # поиск строки, обязательно использовать кавычки

git grep -i "search" # поиск игнорирую регистр букв
git grep -n "search" # вывод с указанием номеров строк
git grep -l "search" # вывод только имен файлов в которых обнаружено совпадение

git log -S

Ищет коммиты в которых было измененно заданное слово или строка. Поиск идет либо по всем отслеживаемым файлам, либо в указанном файле.

git log -S
git log -S <word> # ищет изменение заданного слова по всем коммитам и файлам
git log -S <word> <file-name> # ищет изменение слова в конкретном файле

git log -p -S <word> # дополняет обнаруженные коммиты подробностями того, что имеено изменил найденный коммит

git log -p --word-diff --oneline -S <word> # можно добавлять дополнительные флаги для систематизации вывода

git log -G

Ищет строки в которые вносились какие либо изменения. Отображает все коммиты в которых изменялась строка, в которой присутствует искомое слово.

git log -G
git log -G "searching-text" # найдет все строки (в которых есть searching-text) в которые вносились какие-либо изменения на момент коммита.

git log -p --word-diff --oneline -G "searching-text" # можно добавлять дополнительные флаги для систематизации вывода

git log --grep

Ищет заданный текст в сообщениях коммита.

git log --oneline --grep
git log --oneline --grep "searching-text" # найдет все коммиты, в сообщениях которых есть искомый текст

git bisect

Бинарный поиск в гит. Если представить ситуацию, в которой пользователь неожиданно обнаружил ошибку, но на каком именно коммите она была допущена ответа нет. У гита есть алгоритм бинарного поиска, который работает следующим образом.

git bisect
git bisect start # запускаем процесс бинарного поиска

# Теперь необходимо задать границы поиска
git bisect bad HEAD # начальная граница. мы знаем, что в этом коммите уже есть ошибка. можно указать любой коммит
git bisect good <commit-ID> # конечная граница поиска, в этом коммите ошибки нет
# Git переключается в середину истории коммитов, и показывает нам состояние файлов.
# Нам следует проверить есть ли в этом коммите искомая ошибка, если ошибка видна:
git bisect bad # гит продолжит поиск влево (назад во времени) от текушего коммита
# если ошибки нет:
git bisect good # гит продолжит поиск вправо (вперед во времени) от текушего коммита
# Процесс поиска будет продолжаться пока мы не найдем коммит в котором была сделана ошибка:
commit-ID is the first bad commit
# Теперь можно запомнить идентификатор коммита и завершить процесс поиска:
git bisect reset # процесс поиска завершен, HEAD возвращается на начальную позицию

# Далее можно переместиться на найденный коммит git checkout, создать новую ветку - внести изменения - закомитить их - влить в основную ветку.

git reflog

Журнал перемещений указателя HEAD. В нем храниться вся информация о перемещении HEAD: переключение между ветками, создание нового коммита, переключение между коммитами, сброс коммита (reset). Журнал ссылок храниться локально.

git reflog
git reflog # показывает журнал перемещений HEAD