Просмотр истории коммитов
После того как вы создадите несколько коммитов, или же вы склонируете репозиторий с уже существующей историей коммитов, вы, вероятно, захотите оглянуться назад и узнать, что же происходило с этим репозиторием. Наиболее простой и в то же время мощный инструмент для этого — команда git log.
Для примеров данного раздела я создал небольшой репозитарий Git. Куда добавил два файлика, один из которых я редактировал и коммитил четыре раза. Потом добавил еще один файл и снова закоммитил изменения.
В результате выполнения git log в данном проекте, видим это:
Видим что было сделано 5 коммитов. По умолчанию, без аргументов, git log выводит список коммитов созданных в данном репозитории в обратном хронологическом порядке. То есть самые последние коммиты показываются первыми. Как вы можете видеть, эта команда отображает каждый коммит вместе с его контрольной суммой SHA-1, именем и электронной почтой автора, датой создания и комментарием.
Существует превеликое множество параметров команды git log и их комбинаций, для того чтобы показать вам именно то, что вы ищете. Здесь мы покажем вам несколько наиболее часто применяемых.
Один из наиболее полезных параметров — это -p, который показывает дельту (разницу/diff), привнесенную каждым коммитом. Вы также можете использовать -2, что ограничит вывод до 2-х последних записей:
Этот параметр показывает ту же самую информацию плюс внесённые изменения, отображаемые непосредственно после каждого коммита. Это очень удобно для инспекций кода или для того, чтобы быстро посмотреть, что происходило в результате последовательности коммитов, добавленных коллегой.
В некоторых ситуациях гораздо удобней просматривать внесённые изменения на уровне слов, а не на уровне строк. Чтобы получить дельту по словам вместо обычной дельты по строкам, нужно дописать после команды git log -p опцию --word-diff. Дельты на уровне слов практически бесполезны при работе над программным кодом, но они буду очень кстати при работе над длинным текстом, таким как книга или диссертация. Я изменил Рассмотрим пример:
Как видите, в этом выводе нет ни добавленных ни удалённых строк, как для обычного diff'а. Вместо этого изменения показаны внутри строки. Добавленное слово заключено в {+ +}, а удалённое в [- -].
С командой git log вы также можете использовать группы суммирующих параметров. Например, если вы хотите получить некоторую краткую статистику по каждому коммиту, вы можете использовать параметр --stat:
Как видно из лога, параметр --stat выводит под каждым коммитом список изменённых файлов, количество изменённых файлов, а также количество добавленных и удалённых строк в этих файлах. Он также выводит сводную информацию в конце.
ругой действительно полезный параметр — это --pretty. Он позволяет изменить формат вывода лога. Для вас доступны несколько предустановленных вариантов. Параметр oneline выводит каждый коммит в одну строку, что удобно если вы просматриваете большое количество коммитов. В дополнение к этому, параметры short, full, и fuller, практически не меняя формат вывода, позволяют выводить меньше или больше деталей соответственно:
Наиболее интересный параметр — это format, который позволяет вам полностью создать собственный формат вывода лога. Это особенно полезно, когда вы создаёте отчёты для автоматического разбора (парсинга) — поскольку вы явно задаёте формат и уверены в том, что он не будет изменяться при обновлениях Git'а:
Параметр | Описание выводимых данных |
---|---|
%H | Хеш коммита |
%h | Сокращённый хеш коммита |
%T | Хеш дерева |
%t | Сокращённый хеш дерева |
%P | Хеши родительских коммитов |
%p | Сокращённые хеши родительских коммитов |
%an | Имя автора |
%ae | Электронная почта автора |
%ad | Дата автора (формат соответствует параметру --date= ) |
%ar | Дата автора, относительная (пр. "2 мес. назад") |
%cn | Имя коммитера |
%ce | Электронная почта коммитера |
%cd | Дата коммитера |
%cr | Дата коммитера, относительная |
%s | Комментарий |
Вас может заинтересовать, в чём же разница между автором и коммитером. Автор — это человек, изначально сделавший работу, тогда как коммитер — это человек, который последним применил эту работу. Так что если вы послали патч (заплатку) в проект и один из основных разработчиков применил этот патч, вы оба не будете забыты — вы как автор, а разработчик как коммитер.
Параметры oneline и format также полезны с другим параметром команды log — --graph. Этот параметр добавляет миленький ASCII-граф, показывающий историю ветвлений и слияний.
Мы рассмотрели только самые простые параметры форматирования вывода для git log — их гораздо больше. Таблица ниже содержит как уже рассмотренные нами параметры, так и другие полезные параметры вместе с описанием того, как они влияют на вывод команды log.
Параметр | Описание |
---|---|
-p | Для каждого коммита показывать дельту внесённых им изменений. |
--word-diff | Показывать изменения на уровне слов. |
--stat | Для каждого коммита дополнительно выводить статистику по изменённым файлам. |
--shortstat | Показывать только строку changed/insertions/deletions от вывода с опцией --stat . |
--name-only | Показывать список изменённых файлов после информации о коммите. |
--name-status | Выводить список изменённых файлов вместе с информацией о добавлении/изменении/удалении. |
--abbrev-commit | Выводить только первые несколько символов контрольной суммы SHA-1 вместо всех 40. |
--relative-date | Выводить дату в относительном формате (например, "2 weeks ago") вместо полной даты. |
--graph | Показывать ASCII-граф истории ветвлений и слияний рядом с выводом лога. |
--pretty | Отображать коммиты в альтернативном формате. Возможные параметры: oneline , short , full , fuller и format (где вы можете указать свой собственный формат). |
Ограничение вывода команды log
Кроме опций для форматирования вывода, git log имеет ряд полезных ограничительных параметров, то есть параметров, которые дают возможность отобразить часть коммитов. Вы уже видели один из таких параметров — параметр -2, который отображает только два последних коммита. На самом деле, вы можете задать -<n>, где n это количество отображаемых коммитов. На практике вам вряд ли придётся часто этим пользоваться потому, что по умолчанию Git через канал (pipe) отправляет весь вывод на pager, так что вы всегда будете видеть только одну страницу.
А вот параметры, ограничивающие по времени, такие как --since и --until, весьма полезны. Например, следующая команда выдаёт список коммитов, сделанных за последние две недели:
$ git log --since=2.weeks
Такая команда может работать с множеством форматов — вы можете указать точную дату (“2008-01-15”) или относительную дату, такую как “2 years 1 day 3 minutes ago”.
Вы также можете отфильтровать список коммитов по какому-либо критерию поиска. Опция --author позволяет фильтровать по автору, опция --grep позволяет искать по ключевым словам в сообщении. (Заметим, что, если вы укажете и опцию author, и опцию grep, то будут найдены все коммиты, которые удовлетворяют первому ИЛИ второму критерию. Чтобы найти коммиты, которые удовлетворяют первому И второму критерию, следует добавить опцию --all-match.)
Другой полезный фильтр это опция –S, которая как параметр принимает строку и показывает только те коммиты где эта строка была изменена, добавлена или удалена.
Последняя действительно полезная опция-фильтр для git log — это путь. Указав имя каталога или файла, вы ограничите вывод log теми коммитами, которые вносят изменения в указанные файлы. Эта опция всегда указывается последней и обычно предваряется двумя минусами для каталога (--), чтобы отделить пути от остальных опций. Для файла в корневом каталоге Git можно просто указать его имя.
Список часто употребляемых опций.
Опция | Описание |
---|---|
-(n) | Показать последние n коммитов |
--since, --after | Ограничить коммиты теми, которые сделаны после указанной даты. |
--until, --before | Ограничить коммиты теми, которые сделаны до указанной даты. |
--author | Показать только те коммиты, автор которых соответствует указанной строке. |
--committer | Показать только те коммиты, коммитер которых соответствует указанной строке. |
--grep | Показать только те коммиты, в комментарии содержат искомую строку. |
-S | Показать только те коммиты, в которых менялась искомая строка. |
Использование графического интерфейса для визуализации истории
Если у вас есть желание использовать какой-нибудь графический инструмент для визуализации истории коммитов, можно попробовать распространяемую вместе с Git'ом программу gitk, написанную на Tcl/Tk. В сущности gitk — это наглядный вариант git log, к тому же он принимает почти те же фильтрующие опции, что и git log.
Так же существует множество других графических оболочек для работы с Git, но о них позже.
Комментариев нет:
Отправить комментарий