Как просмотреть историю проекта с помощью журнала Git

Одна из самых фундаментальных услуг, предоставляемых Git, – это история проекта. Поскольку Git отслеживает все изменения файлов, сделанные в репозитории, он может предложить очень мощные функции ведения журнала. Вы можете запрашивать историю проекта разными способами, а также извлекать и отображать различные данные с помощью одной гибкой команды.

Команда git log огромна, она самая большая из всех обычных команд Git. Его руководство насчитывает более 2500 строк. К счастью, git log предоставляет большую часть своего наиболее полезного поведения всего из нескольких ключевых параметров.

Базовое ведение журнала с поведением по умолчанию

По умолчанию git log показывает список коммитов в обратном хронологическом порядке. Каждая фиксация включает свой хэш, автора, дату и сообщение фиксации:

Команда использует пейджер (например, меньше, больше), чтобы показать полный вывод, чтобы вы могли легко перемещаться по результатам. Вы можете настроить Git для использования любой программы по вашему выбору, например, самого пейджера .

Вот некоторый вывод журнала git из репозитория самого исходного кода git :

 commit 670b81a890388c60b7032a4f5b879f2ece8c4558 (HEAD -> master, origin/next,
origin/master, origin/HEAD)
Author: Junio C Hamano <[email protected]>
Date: Mon Jun 14 13:23:28 2021 +0900
The second batch
Signed-off-by: Junio C Hamano <[email protected]>

Результат начинается с хэша фиксации ( 670 …), за которым следует список ветвей, которые в настоящее время указывают на эту фиксацию ( HEAD -> master и т. Д.)

Следующая строка описывает автора этого коммита с указанием его имени и адреса электронной почты.

Полная дата и время фиксации следуют в следующей строке.

Наконец, появится полное содержание сообщения о фиксации. Вы можете контролировать большую часть всего остального, что предлагает git log, с помощью параметров командной строки. Есть два основных типа опций:

  • Форматирование, которое определяет, как Git отображает каждую фиксацию.
  • Фильтрация, которая определяет, какие коммиты включены в журнал git .

В дополнение к параметрам командной строки git log принимает аргументы, которые определяют файлы, коммиты, ветки или другие типы ссылок. Они применяют дополнительную фильтрацию.

Форматирование вывода журнала Git

Одна из самых простых настроек – опция –oneline, которая дает очень краткий результат:

 git log --oneline

Каждая строка в журнале теперь содержит только сокращенный хэш фиксации и тему сообщения фиксации . Это отличный способ получить обзор последних коммитов проекта:

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

Просмотр ветвящегося графа

Параметр –graph позволяет визуализировать отношения между ветвями. Это очень просто, но может помочь распутать сложную историю.

 git log --oneline --graph

Связанный: Как создать новую ветку в Git

Индивидуальный красивый вывод

Вы можете добиться более сложного форматирования, подробно указав его с помощью параметра –pretty . Синтаксис может быть от очень простого к более сложному, поэтому для получения полной информации обратитесь к руководству .

 git log --pretty=short

По сути то же самое, что и журнал git без даты или полного сообщения:

 git log --pretty=oneline

Эквивалентно git log –oneline .

 git log --pretty=fuller

Включает много деталей. Он даже разделяет автора и коммиттера, которые теоретически могут быть разными людьми:

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

  • % H хеш фиксации
  • % h сокращенный хеш фиксации
  • % дата автора объявления
  • % ar дата автора, относительная
  • % s тема сообщения фиксации
  • % b коммитить тело сообщения
  • % p сокращенные родительские хэши

Вы можете добавить к выводу фиксированные символы и раскрасить его. В этом примере также показан вариант формата даты:

 git log --pretty=format:'%C(auto) %h [%ad] %s' --date=short

Обратите внимание, что дата заключена в скобки. Какое бы форматирование вы ни выбрали, если вы хотите, чтобы вывод был полезен в конвейере или для других форм обработки текста, вам следует подумать о том, как разграничить каждую часть вывода.

Отображение различий в журнале

Важная деталь при просмотре истории репозитория – это сами различия. В конце концов, они представляют, что действительно изменилось в коде! Во-первых, вы можете получить сводку изменений вместе с каждой фиксацией, используя –shortstat :

 git log --shortstat

Это добавляет строку вроде:

 1 file changed, 48 insertions(+), 2 deletions(-)

Внизу каждого коммита. Вы часто увидите такую ​​сводку – например, на страницах GitHub – и это полезный способ быстро оценить объем конкретной фиксации. Для получения более подробной информации вы можете включить полный вывод патча (diffs) с помощью флага -p :

 git log -p

Фильтрация вывода журнала Git

Какое бы форматирование вы ни применили, вы все равно будете видеть полный журнал всех коммитов в текущей ветке. Несмотря на то, что Git разбивает их на страницы, вывода все равно может быть много. Следующие параметры позволяют настроить, какие коммиты будут включены в журнал.

Ограничение по сумме

Если вы просто хотите обрезать результаты, чтобы отобразить несколько последних коммитов, используйте синтаксис – [число] :

 git log -2

Ограничение по дате

Чтобы ограничить набор коммитов заданным диапазоном дат, используйте параметры –since ( –after ) и –until ( –before ). Каждый из них имеет дату в формате ISO 8601. Вы можете использовать либо –since, либо –until отдельно, либо оба вместе, чтобы указать диапазон. Опции –after и –before являются синонимами.

 git log --since="2021-01-01" --until="2021-05-01"

Ограничение по файлу

Журнал Git может сосредоточиться на конкретном файле, а не на каждом файле в вашем репозитории. Это отличный способ помочь вам узнать, как конкретный файл изменился с течением времени. Просто добавьте имя файла в конец вашей команды git:

 git log filename

Вы увидите только те коммиты, которые затронули имя файла .

Различия между филиалами

При просмотре журнала ветки у вас могут быть особые требования. Например, вместо того, чтобы видеть всю историю, вы можете просто посмотреть, что изменилось в этой конкретной ветке. Журнал Git может помочь с помощью синтаксиса ref1..ref2 . Вы можете использовать три немного разных подхода:

  1. Просмотрите коммиты, которые находятся в main, но не в ветке:
     git log --oneline origin/branch..origin/main
  2. Просмотрите коммиты, которые находятся в ветке, но не в основном:
     git log --oneline origin/ main ..origin/ branch
  3. Просмотр коммитов, которые существуют только в ветке или основной:
     git log --oneline origin/branch ... origin/main

Различия между двумя тегами

Подобно тому, как вы можете просматривать историю между ветвями, используя синтаксис ref1..ref2 , вы также можете просматривать историю между тегами таким же образом. В конце концов, и теги, и ветки являются справочными.

 git log --abbrev-commit --pretty=format:'%h %ar %s' v2.32.0-rc3..v2.32.0

Если вы готовите примечания к выпуску для более крупного проекта, git shortlog должен стать вашим первым портом захода. Он создает список авторов с темами коммитов рядом с ними. Вы можете передать ему ссылочный диапазон, чтобы ограничить историю аналогично git log:

 git shortlog v2.32.0-rc3..v2.32.0

Команда git show еще более универсальна, чем git log . Он может работать с тегами и другими типами объектов git помимо истории фиксации. Он имеет много общих параметров с журналом git , но он вам действительно понадобится только в том случае, если вам нужно углубиться в детали более низкого уровня.

Обзор прошлого с помощью журнала Git

Git log – сложная команда, но ее основные параметры могут быть полезны. Просмотр истории репозитория – отличный способ понять, как часто происходят изменения и сколько людей их вносят. Когда вы хорошо разбираетесь в истории проекта, у вас будет отличная возможность внести свой вклад в него самостоятельно.