Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

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

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

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

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

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

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

Ответы на эти вопросы можно получить только если вы владеете инструментом по анализу коммитов -- командой 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.

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

С каждым коммитом связано 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

Контрольные вопросы

  1. Ответы на какие вопросы хранит история изменений проекта?

  2. Какая команда позволяет просмотреть список коммитов хранилища?

  3. Перечислите поля коммита?

  4. Чем отличается автор от коммитера? В каких случая они совпадают, а в каких нет?

  5. Что из себя представляет индетификатор коммита?