Программирование и IT
git log
Команда показывает историю: какие коммиты привели репозиторий к нынешнему состоянию. Без флагов вывод многословен и почти бесполезен, зато с несколькими ключами превращается в инструмент поиска — по автору, по дате, по файлу и даже по исчезнувшей строке кода.
В этой статье
Вывод по умолчанию#
Четыре строки на коммит, новые сверху. Вывод открывается в постраничном
просмотрщике: листать — стрелками и пробелом, выйти — клавишей q. Эта
деталь стопорит чаще всего: кажется, что терминал завис, а он просто ждёт q.
Понять, чьи это коммиты и когда они сделаны, так можно. Понять форму истории —
нет, для этого нужны другие форматы.
Короткие форматы#
Последняя строка — то, что обычно имеют в виду под «красивым» выводом:
|\
|
|
|
|
Левый столбец — линии веток, звёздочка — коммит. Здесь видно, что ветка
report-pdf отошла от общего предка, в main тем временем правили
округление, а верхний коммит их соединил.
Формат настраивается точнее через --pretty:
Здесь %h — короткий хеш, %ad — дата автора, %an — имя, %s — заголовок
сообщения. Набирать это каждый раз незачем — заведи псевдоним:
После этого хватает git lg.
Поиск по истории#
Фильтры складываются друг с другом, и именно в этом сила команды.
Про -S стоит сказать отдельно: это не поиск по тексту сообщений, а поиск по
содержимому изменений. Команда находит коммиты, где количество вхождений
строки изменилось, — то есть буквально тот момент, когда переменная появилась
или была удалена.
Запись через две точки (main..feature-pdf) читается как «то, до чего
дотягивается вторая ссылка, но не первая». Удобно перед отправкой ветки:
видно ровно те коммиты, которые ты собираешься предложить.
Пример: найти, когда сломалось#
Строка в отчёте стала считаться неверно, а когда — неизвестно. Сначала
сужаем круг по файлу и объёму правок:
|
Дальше смотрим сам коммит целиком:
Команда git show выводит сообщение и изменения одного коммита — это тот же
формат, что у git log -p, но для единственной записи. Если после разбора
коммит нужно отменить, способы собраны в статье
как отменить коммит.
Чего git log не покажет#
История — это коммиты. Всё, что не закоммичено, в неё не попадает: незалитые
правки смотрят через git status и git diff, отложенное на полку — через
git stash list, о чём подробнее в разборе git stash.
Второе исключение — коммиты, до которых не дотягивается ни одна ветка.
После сброса ветки или переноса они выпадают из вывода git log, но остаются
в репозитории; ищут их в журнале ссылок git reflog.
Третье — удалённые ветки и чужие коммиты, которых у тебя ещё нет. git log не
ходит в сеть; сначала git fetch origin, потом git log origin/main.
Частые ошибки#
Ищут текст кода через --grep. Этот фильтр смотрит только в сообщения
коммитов. По содержимому правок ищет -S (по количеству вхождений) или -G
(по регулярному выражению в тексте изменений).
История файла обрывается на переименовании. Без --follow git показывает
только то, что происходило с нынешним путём. Флаг заставляет продолжить поиск
в прежних именах.
Ждут, что git log покажет ветку целиком. По умолчанию команда выводит
историю текущей ветки. Чтобы увидеть все, нужен --all; чтобы конкретную —
её имя аргументом: git log feature-pdf.
Путают порядок в диапазоне. git log feature..main и git log main..feature дают разные ответы. Слева — то, что вычитается, справа — то,
что показывается. Проверяется быстро: если вывод пуст, поменяй местами.
План по этапам
- Посмотреть форму историиgit log --graph --oneline --decorate --all; запомнить, что выход из просмотрщика — q.
- Завести псевдонимgit config --global alias.lg с любимым набором флагов.
- Сузить выборкуФильтры --author, --since, --grep и путь после двух тире — складываются друг с другом.
- Найти изменение по кодуgit log -S"строка" -- путь: коммиты, где строка появилась или исчезла.
- Разобрать найденноеgit show <хеш> целиком; при необходимости — сравнение диапазоном main..ветка.
Начать изучать эту тему у себя
План ляжет в твой репозиторий: отмечай этапы, веди конспект — история изменений покажет, как ты продвинулся.
Проверь себя
1.Какой флаг git log ищет коммиты, в которых менялось количество вхождений строки кода?
2.Что покажет git log main..feature?
3.История файла обрывается на месте его переименования. Какой флаг это исправит?
Источники
-
Справка git logПолный список фильтров и форматов выводабесплатно
-
Pro Git, русское изданиеГлава «Основы Git» — раздел о просмотре истории коммитовбесплатно
-
Справка git showПодробный разбор одного коммитабесплатно
Было полезно?