После того, как вы создали несколько коммитов или же клонировали репозиторий с уже существующей историей коммитов, вероятно вам понадобится возможность посмотреть что было сделано — историю коммитов. Одним из основных и наиболее мощных инструментов для этого является команда git log .
Следующие несколько примеров используют очень простой проект «simplegit». Чтобы клонировать проект, используйте команду:
Если вы запустите команду git log в каталоге клонированного проекта, вы увидите следующий вывод:
По умолчанию (без аргументов) git log перечисляет коммиты, сделанные в репозитории в обратном к хронологическому порядке — последние коммиты находятся вверху. Из примера можно увидеть, что данная команда перечисляет коммиты с их SHA-1 контрольными суммами, именем и электронной почтой автора, датой создания и сообщением коммита.
Команда git log имеет очень большое количество опций для поиска коммитов по разным критериям. Рассмотрим наиболее популярные из них.
Одним из самых полезных аргументов является -p или —patch , который показывает разницу (выводит патч), внесенную в каждый коммит. Так же вы можете ограничить количество записей в выводе команды; используйте параметр -2 для вывода только двух записей:
Эта опция отображает аналогичную информацию но содержит разницу для каждой записи. Очень удобно использовать данную опцию для код ревью или для быстрого просмотра серии внесенных изменений. Так же есть возможность использовать серию опций для обобщения. Например, если вы хотите увидеть сокращенную статистику для каждого коммита, вы можете использовать опцию —stat :
Как вы видите, опция —stat печатает под каждым из коммитов список и количество измененных файлов, а также сколько строк в каждом из файлов было добавлено и удалено. В конце можно увидеть суммарную таблицу изменений.
Следующей действительно полезной опцией является —pretty . Эта опция меняет формат вывода. Существует несколько встроенных вариантов отображения. Опция oneline выводит каждый коммит в одну строку, что может быть очень удобным если вы просматриваете большое количество коммитов. К тому же, опции short , full и fuller делают вывод приблизительно в том же формате, но с меньшим или большим количеством информации соответственно:
Наиболее интересной опцией является format , которая позволяет указать формат для вывода информации. Особенно это может быть полезным когда вы хотите сгенерировать вывод для автоматического анализа — так как вы указываете формат явно, он не будет изменен даже после обновления Git:
Полезные опции для git log —pretty=format отображает наиболее полезные опции для изменения формата.
Таблица 1. Полезные опции для git log —pretty=format
Опция
Описания вывода
Сокращенный хеш коммита
Сокращенный хеш дерева
Сокращенный хеш родителей
Электронная почта автора
Дата автора (формат даты можно задать опцией —date=option)
Относительная дата автора
Электронная почта коммитера
Относительная дата коммитера
Вам наверное интересно, какая же разница между автором и коммитером. Автор — это человек, изначально сделавший работу, а коммитер — это человек, который последним применил эту работу. Другими словами, если вы создадите патч для какого-то проекта, а один из основных членов команды этого проекта применит этот патч, вы оба получите статус участника — вы как автор и основной член команды как коммитер. Более детально мы рассмотрим разницу в главе Распределенный Git.
Опции oneline и format являются особенно полезными с опцией —graph команды log . С этой опцией вы сможете увидеть небольшой граф в формате ASCII, который показывает текущую ветку и историю слияний:
Данный вывод будет нам очень интересен в следующей главе, где мы рассмотрим ветвление и слияние.
Мы рассмотрели только несколько простых опций для форматирования вывода с помощью команды git log — на самом деле их гораздо больше. Наиболее распространенные опции для команды git log содержит описание как уже рассмотренных, так и нескольких новых опций, которые могут быть полезными в зависимости от нужного формата вывода.
Таблица 2. Наиболее распространенные опции для команды git log
Опция
Описание
Показывает патч для каждого коммита.
Показывает статистику измененных файлов для каждого коммита.
Отображает только строку с количеством изменений/вставок/удалений для команды —stat.
Показывает список измененных файлов после информации о коммите.
Показывает список файлов, которые добавлены/изменены/удалены.
Показывает только несколько символов SHA-1 чек-суммы вместо всех 40.
Отображает дату в относительном формате (например, «2 weeks ago») вместо стандартного формата даты.
Отображает ASCII граф с ветвлениями и историей слияний.
Показывает коммиты в альтернативном формате. Возможные варианты опций: oneline, short, full, fuller и format (с помощью последней можно указать свой формат).
Сокращение для одновременного использования опций —pretty=oneline —abbrev-commit .
Ограничение вывода
В дополнение к опциям форматирования вывода, команда git log принимает несколько опций для ограничения вывода — опций, с помощью которых можно увидеть определенное подмножество коммитов. Вы уже видели одну из таких опций — это опция -2 , которая показывает только последние два коммита. В действительности вы можете использовать — , где n — это любое натуральное число и представляет собой n последних коммитов. На практике вы не будете часто использовать эту опцию, потому что Git по умолчанию использует постраничный вывод и вы будете видеть только одну страницу за раз.
Однако, опции для ограничения вывода по времени, такие как —since и —until , являются очень удобными. Например, следующая команда покажет список коммитов, сделанных за последние две недели:
Это команда работает с большим количеством форматов — вы можете указать определенную дату вида 2008-01-15 или же относительную дату, например 2 years 1 day 3 minutes ago .
Также вы можете фильтровать список коммитов по заданным параметрам. Опция —author дает возможность фильтровать по автору коммита, а опция —grep искать по ключевым словам в сообщении коммита.
Допускается указывать несколько параметров —author и —grep для поиска, которые позволят найти коммиты, соответствующие любому указанному —author и любому указанному —grep шаблону; однако, применение опции —all-match заставит искать коммиты соответствующие всем указанным —grep шаблонам.
Следующим действительно полезным фильтром является опция -S , которая принимает аргумент в виде строки и показывает только те коммиты, в которых изменение в коде повлекло за собой добавление или удаление этой строки. Например, если вы хотите найти последний коммит, который добавил или удалил вызов определенной функции, вы можете запустить команду:
Последней полезной опцией, которую принимает команда git log как фильтр, является путь. Если вы укажете каталог или имя файла, вы ограничите вывод только теми коммитами, в которых были изменения этих файлов. Эта опция всегда указывается последней после двойного тире ( — ), чтобы отделить пути от опций:
В таблице Опции для ограничения вывода команды git log вы можете увидеть эти и другие распространенные опции.
Таблица 3. Опции для ограничения вывода команды git log
Опция
Описание
Показывает только последние n коммитов.
Показывает только те коммиты, которые были сделаны после указанной даты.
Показывает только те коммиты, которые были сделаны до указанной даты.
Показывает только те коммиты, в которых запись author совпадает с указанной строкой.
Показывает только те коммиты, в которых запись committer совпадает с указанной строкой.
Показывает только коммиты, сообщение которых содержит указанную строку.
Показывает только коммиты, в которых изменение в коде повлекло за собой добавление или удаление указанной строки.
Например, если вы хотите увидеть, в каких коммитах произошли изменения в тестовых файлах в исходном коде Git в октябре 2008 года, автором которых был Junio Hamano и которые не были коммитами слияния, вы можете запустить следующую команду:
Из почти 40 000 коммитов в истории исходного кода Git, эта команда показывает только 6, которые соответствуют этим критериям.
В зависимости от используемого порядка работы, история коммитов в вашем репозитории может содержать большое количество коммитов слияния, которые сами по себе не очень информативны. Чтобы исключить их из вывода команды git log используйте опцию —no-merges .
Источник
Git для начинающих. Урок 5. История коммитов в подробностях
Видеоурок
Конспект урока
Краткое содержание урока, основные инструкции для командной строки, полезные ссылки и советы.
Для информации
Урок частично повторяет содержание предыдущего. Но в отличие от прошлого историю коммитов мы рассмотрим намного подробнее.
История коммитов
Сохранение истории изменений или история коммитов — одна из самых важных частей git. В истории сохраняются все коммиты, по которым можно посмотреть автора коммита, commit message, дату коммита и его хэш. А также можно увидеть измененные файлы и изменения в каждом файле. То есть git хранит буквально все, от самого начала проекта.
Команда git log
За просмотр истории коммитов отвечает команда git log. В сочетании с различными параметрами эта команда выводит историю по-разному. Есть много различных вариантов и комбинаций параметров, посмотрим некоторые из них
git log, просмотр истории по умолчанию
Показывает все коммиты от новых к старым. Для каждого коммита выводится
git log -p, расширенный вывод истории
Выводит то же, что и git log, но еще и с изменениями в файлах
git log —oneline, короткая запись
Вывод коммитов в одну строку. Показывает только хэш коммита и commit message
git log —stat —graph, история в виде дерева
Выводит коммиты в виде дерева, в командной строке псевдографикой. Плюс выводит список измененных файлов. К дереву коммитов мы вернемся, когда будем работать с ветками.
Сортировка и фильтрация истории
Есть множество команд, которые позволяют сортировать и фильтровать историю коммитов в командной строке. В том числе в сочетании с линуксовыми командами. Рассмотрим некоторые из них
Поиск по коммитам
Команда grep — мощный инструмент, который помогает работать в том числе и с git. Например, искать по коммитам
Коммиты, затронувшие один файл
Поиск по автору
В опции —author можно указать имя или email, необязательно целиком, можно только часть.
Поиск по диапазону дат
Опции —after и —before задают начальную и конечную даты коммитов
Комбинация команд и опций
Команды и опции git можно комбинировать и дополнять их линуксовыми командами
Какие еще есть варианты
Мы рассмотрели базовые примеры, но в документации по git log есть много различных опций. Все их рассматривать нет смысла, при необходимости изучайте документацию.
Просмотр отдельного коммита, git show
Чтобы просмотреть отдельный коммит, нужно узнать его хэш. Хэш коммита выводится в любой команде git log, с параметрами или без. Например,
Смотрим второй коммит
Выводится подробная информация о коммите:
хэш
автор
дата
commit message
список измененных файлов
изменения в каждом файле
Короткий хэш коммита
Хэш коммита 40-символьный, но можно использовать короткую запись — первые 7 символов хэша. Команда git log —oneline выводит именно короткий хэш. Для других операций с коммитами достаточно использовать первые 4 символа. Например, 3 команды ниже покажут содержимое одного и того же коммита
История коммитов в PhpStorm
В окне Local Changes, на вкладке Log показывается вся история коммитов, в левой половине вкладки. В списке коммитов показываются их commit message, автор и дата. Клик на нужный коммит откроет в правой части вкладки список измененных файлов. Клик на нужном файле и Ctrl/Cmd+D покажет все изменения в этом файле точно так же, как и git diff.
В тексте объяснить работу с историей в PhpStorm сложно, смотрите видеоурок.
Переключение на старый коммит, зачем это нужно
Нужно это обычно в двух случаях:
1. При неудачном деплое, когда вскрылась критичная бага. Если бага сложная и пофиксить ее быстро не удается, можно откатиться на рабочий коммит, задеплоить рабочую версию и уже потом чинить багу.
2. При отладке. Когда в код закралась бага и мы постепенно продвигаемся «назад в прошлое» и ищем, в какой момент что-то сломалось
Как переключиться на коммит в терминале
Первое — узнать хэш нужного коммита. Например, имеем такую историю
Хотим переключиться на предпоследний коммит. Коммиты идут в порядке убывания, поэтому нам нужен второй сверху — 26812f9. Переключаемся на него командой
Все, вернулись в прошлое. Проверим историю, теперь коммит, на который мы переключились — последний
Уйдем еще дальше, переключимся на первый коммит. Так как коммиты упорядочиваются по убыванию даты, то первый коммит — это последний в списке — 0b90433 Initial commit
Чтобы вернуться обрано, в исходное состояние, нужно набрать
master — это ветка, в которой мы работаем по умолчанию. О ветках поговорим через пару уроков
Как переключаться между коммитами в PhpStrom
Вкладка Log, правый клик на нужном коммите и Checkout Revision. Все. История коммитов будет видна по-прежнему вся, но напротив текущего коммита будет стоять значок HEAD с символом «!»
Как вернуться обратно? В правом нижем угле PhpStorm есть пункт git: , кликаем на него, выбираем Local Branches — master — checkout. Значок «!» пропадет — мы вернулись в исходное состояние
Что могу посоветовать
как и git diff, историю коммитов git log удобнее смотреть в PhpStorm
в команде git log есть множество вариантов сортировки и фильтрации
сочетание git log с простыми линуксовыми командами дает хороший эффект. Обычный grep — очень хороший помощник
PhpStorm предоставляет удобные возможности по фильтрации коммитов. Можно искать коммиты по commit message, по автору, дате и по папкам, в которых происходили изменения
перемещайтесь по истории осторожно, не забывайте возвращаться в исходное состояние
На этом все. В следующем уроке мы поговорим о взаимодействии с сервером и познакомимся с командами git push и git pull.
Источник
Git для начинающих. Часть 6. Просмотр информации по коммитам
Рассмотрим инструмент системы контроля версий git, который позволяет делать выборку и представлять пользователю коммиты, отправленные в репозиторий, в соответствии с заданными параметрами.
В прошлом уроке мы разобрались с тем, как фиксировать изменения в рабочей директории и отправлять коммиты в репозиторий. Рабочий процесс с использованием git, в упрощенном виде, выглядит следующим образом (пока не рассматриваем работу с удаленным репозиторием):
Внесение изменений в рабочую директорию.
Отправка изменений в stage .
Формирование и отправка коммита на базе того, что лежит в stage , в репозиторий.
В процессе работы, в вашем репозитории накопится больше количество коммитов и довольно часто будет возникать необходимость их просматривать. Git предоставляет удобный способ просмотра информации по коммитам. Для демонстрации возможностей git , создадим репозиторий и добавим в него один файл – README.md , о том, как это сделать, можете прочитать в предыдущем уроке.
Для просмотра информации по сделанным вами (или вашими коллегами) коммитам используется команда git log .
Как видно из полученной информации, в репозиторий был отправлен один коммит с сообщением “[create repository]” , этот коммит сделал пользователь с именем Writer , его email:writer@somecompany.com , уникальный идентификатор коммита a98cce47b59256d00a853c421af4f7b9f0dc0a29 , и дата и время отправки коммита: 5 марта 2018 в 23:10:51 .
Внесем еще несколько изменений в наш репозитории. Добавим текст в файл README.md .
Зафиксируем эти изменения в репозитории.
Создадим файл main.c и добавим его в репозиторий.
Таким образом в нашем репозитории уже должно быть три коммита, проверим это.
Коммиты располагаются от новых к старым. Сделаем ещё несколько изменений.
Снова получим список всех коммитов.
Количество коммитов в репозитории уже такое, что просматривать информацию о них в том виде, в котором выдает git log уже неудобно. Для того, чтобы сократить количество показываемой информации можно воспользоваться ключом –oneline , при этом будет выведена часть идентификатора и сообщение коммита.
В таком виде работать с коммитами уже намного удобнее. Если вы хотите просмотреть n последних коммитов, то укажите количество коммитов после ключа -n . Выведем три последних коммита.
Для вывода списка коммитов, начиная с какой-то временной метки, используйте ключ –since=” ” . Например, получим все коммиты, сделанные после 5-го марта 2018 года 23:21.
Для вывода списка коммитов до какой-то даты используется ключ –until . Получим с писок коммитов, сделанных до 5-го марта 2018 года 23:21.
Еще одним полезным ключом является –author , который позволяет вывести список коммитов, сделанных конкретным автором.
В приведенном выше примере, мы вывели все коммиты сделанные пользователем с именем Writer . Т.к. в нашем репозитории все коммиты сделаны от имени данного автора, то при любых других именах, передаваемых параметру –author , мы будем получать пустой список.
И, напоследок, рассмотрим еще один инструмент. Если вы работали с Linux , то наверное, сталкивались с такой программой как grep – это утилита командной строки, которая, в переданном ей тексте, находит вхождения, соответствующие заданному регулярному выражению. Выведем все коммиты, в которых встречается слово create .
Теперь коммиты со словом add .
Для более продуктивного использования данной команды рекомендуем ознакомиться с возможностями утилиты grep . На этом мы закончим обзор команды git log .
Отличный курс по git делают ребята из GeekBrains , найдите в разделе “Курсы” курс “Git. Быстрый старт” , он бесплатный!