История изменений

История изменений#

В этом уроке мы:

  • узнаем, что дает нам история изменений проекта;

  • познакомимся с командой git log и ее опцией --reverse;

  • перечислим все поля коммита.

В хранилищах малых проектов в среднем около нескольких сотен и тысяч коммитов, средних проектов – десятки тысяч, а крупных – сотни тысяч и миллионы. Эти числа получаются из 4 коммита в день на разработчика и 250 рабочих дней в году.

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

  • кто чем занимается в команде;

  • кто как работает;

  • что изменилось в программе за последнее время;

  • кто изменил этот файл;

  • кто добавил эту функцию;

  • кто и когда внес ошибку в программу;

  • насколько интенсивно идет работа над проектом;

  • зачем был добавлен этот код?

  • и некоторые другие специфические вопросы.

Также доступ к коммитам позволяет автоматизировать часть рабочих процессов в проекте:

  • принимать решение о повышении версии проекта;

  • формировать список изменений в релизе, так называемый changelog-файл.

Ответы на эти вопросы можно получить только если вы владеете инструментом по анализу коммитов – командой git log.

git log делает два крупных действия: настраивает вывод и фильтрует вывод. Команда git log без аргументов покажет всю историю коммитов проекта в порядке обратном их созданию. Последний коммит в проекте будет самым первым в списке, а первый коммит – самым последним. Если вывод команды не помещается на экран, то он перенаправится в пейджер less. Выход из пейджера происходит по команде q.

commit 317d080fd9d7d66955e4bc2055a08b4edb044cf1 (HEAD -> main, origin/main, origin/HEAD)
Author: wolodyx <wolodyx@yandex.ru>
Date:   Thu Mar 9 08:42:24 2023 +0300

    Исправлена утечка серверного сокета

commit 8e36f074fb3374c6d0007c934765d3f6a17d955e
Author: wolodyx <wolodyx@yandex.ru>
Date:   Wed Mar 8 14:23:38 2023 +0300

    Закрытие клиентских сокетов на стороне сервера

commit ea3a417d17049d6b450a0076d82898f964213b6c
Author: wolodyx <wolodyx@yandex.ru>
Date:   Sat Mar 4 10:56:31 2023 +0300

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

Перевернуть историю изменений, когда первый коммит отобразится в начале, позволяет опция --reverse команды git log.

Коммит – это объект, который несет следующую информацию: Коммит содержит следующие поля, на которые можно наложить условия для фильтрации:

  • информация об авторе (имя и электронная почта);

  • дата и время подготовки изменений;

  • информация о коммитере (имя и электронная почта);

  • дата и время фиксации изменений в хранилище.

  • изменения в файлах;

  • сообщение, описывающее изменения;

../_images/commit-desc.png

С каждым коммитом связано 40-разрядное уникальное шестнадцатеричное число, полученное хеш-функцией SHA-1 по содержимому коммита. В конечном счете мы получаем уникальное число для всех коммитов в пределах хранилища. Это число позволяет сослаться на коммит. Не обязательно вводить все его цифры, достаточно первых 3-7 цифр. Если возникнет неоднозначность из-за короткого индетификатора, то Git укажет на это.

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

Автор коммита – это участник разработки, оформивший изменения, а коммитер – внесший их в хранилище. Обычно роли автора и коммитера играет один человек, который оформляет и фиксирует изменения. Но процесс разработки открытого ПО вносит свои особенности: не все авторы имеют доступ к официальному хранилищу. Тогда они предлагают свои изменения через патчи. Коммитер оценивает изменения, и если они устраивают его, вносит их в хранилище от своего имени. При этом имя автора сохраняется. Простой пример, где автор и коммитер разные участники – это первый коммит при создании хранилища из веб-интерфейса GitHub. Система первым коммитом добавляет файлы лицензии и README.md от своего имени, но с данных, запрошенных от автора.

commit 49b5bac3ae3de3f26606c6ba7b8f7eb85bb558d8
Author:     Владимир <wolodyx@yandex.ru>
AuthorDate: Sat Mar 4 08:18:44 2023 +0300
Commit:     GitHub <noreply@github.com>
CommitDate: Sat Mar 4 08:18:44 2023 +0300

    Initial commit