Хэширование коммита
Он считается по хэшу объекта commit, который содержит в себе всю информацию о коммите — дата, автор, комментарий, подпись и т.п. Плюс к этому он содержит хэш объекта tree, а объект tree содержит хэши конкретных файлов, добавленных в репозиторий. Также в коммите содержатся хэши родительских коммитов, так что в сумме получается, что коммит косвенно хэшируется по абсолютно всему содержимому репозитория в текущей ветке, начиная с самого-самого первого коммита
27 июн 2020 в 19:20
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
всю информацию, которую содержит объект, можно посмотреть такой командой:
$ git cat-file тип-объекта хэш-объекта
$ git cat-file commit 3cbc0fb39c84ae0a51a9a88649dccd105bf17d6e tree 71173edd7df0127465dcec352cf76c90cbf1e446 parent fc36b97af05ef74b0889ba49090c2f52f00e0e77 author Harald Anlauf [email protected]> 1593262593 +0200 committer Harald Anlauf [email protected]> 1593262648 +0200 PR fortran/95881 - ICE in resolve_symbol, at fortran/resolve.c:15175 Avoid NULL pointer dereference. gcc/fortran/ PR fortran/95881 * resolve.c (resolve_symbol): Avoid NULL pointer dereference.
- tree хэш — хэш-сумма объекта типа tree
- parent хэш — хэш-сумма объекта типа commit, «родителя» данного коммита
- author . , committer . — в пояснениях не нуждается. обратите внимание: в этих полях присутствует в том числе и время (указанное соответственно автором и коммитером: это могут быть разные лица)
- дальше текст сообщения, прикреплённого к коммиту
это пример самый простейший, только с основной, «базовой» информацией. в более «навороченных» коммитах может присутствовать и другая информация: и описание метки (tag), и подписи, и дополнительные «родительские» коммиты (для коммита слияния) и проч.
хэш (sha1-сумма) высчитывается от такой информации:
тип-объекта длина-объекта\0содержимое-объекта
для приведённого выше примера можно пересчитать хэш таким вот образом:
$ (printf "commit %s\0" $(git cat-file commit 3cbc0fb39 | wc -c); git cat-file commit 3cbc0fb39) | sha1sum 3cbc0fb39c84ae0a51a9a88649dccd105bf17d6e -
хэш получился идентичный.
Хеш коммита

Коммит (commit) — зафиксированное изменение в коде.
Хеш коммита (хэш коммита, commit hash) — это специальная метка, позволяющая отличать одни коммиты от других.
Хеш коммита состоит из 40 символов, в составе могут быть как буквы, так и цифры.
Пример хеша коммита: d1cw4e2bd74e03ajj732assb476392ff77f24e47
Чтобы узнать хеш последнего коммита, нужно ввести команду:
$ git rev-parse HEAD
Чтобы узнать хеш определенного коммита, например, первого, нужно ввести команду:
$ git log -n 1 —pretty=format:»%H»
Чтобы узнать хеш последнего коммита в нужной ветке:
git show-ref —heads —hash master
Что такое хэш коммита
В скриптах, использующих хеш и дату для отображения номера версии в разрабатываемой программе, можно использовать следующие команды.
$ git rev-parse HEAD
$ git log -n 1 —pretty=format:»%H»
Или можно получить хеш последнего коммита с указанием имени нужной ветки:
$ git show-ref —heads —hash master
Получение времени коммита:
$ git show -s —format=%ci HEAD
2020-01-29 17:25:57 +0300
Все эти команды работают с локальными данными Git, не обращаясь к серверу репозитариев.
- Бесплатные сервиса размещения репозитариев Git
- Git workflow — Теория
- Git workflow — Краткое введение по основным инструкциям
- Git Wizardry
- Про Git на пальцах (для переходящих с SVN)
- Git на двоих
- Ежедневный Git
- Удачная модель ветвления для Git
- Синхронизация через GIT
- Git stash — работа с «карманом» в Git
- Как посмотреть настройки репозитария Git и как их изменить
- GIT: Инструкция-шпаргалка для начинающих
- Как перенести локальный GIT-репозитарий на сервер вместе со всей историей
- git reset — возврат к определенному коммиту, откат изменений, «жесткий» или «мягкий»
- git revert — отмена изменений, произведенных в прошлом отдельным коммитом
- Git — работа с ветками
- Git: Путь Github. Цикл разработки — Простое объяснение
- Машина времени в GIT
- Git Rebase: руководство по использованию
- Git: просмотр лога (истории) в консоли в виде дерева
- Git: понимание команды git merge
- Git: Опции слияния для команд merge и pull — определение стратегии слияния
- Git: как переключиться на нужный коммит
- Git: как смержить изменения из experimental в master
- Git: как посмотреть изменения, внесенные определенным коммитом
- Git: как посмотреть историю изменения одного файла
- Git: как вернуть один файл в состояние, которое было в определенном коммите
- git log — особенности данной команды при навигации по истории через git checkout
- Git: Как исправить HEAD detached from
- Git: что делать в состоянии detached head
- Работа в команде с использованием Git на примере проекта в среде Blender 3D
- Git: Как внести изменения в последний коммит
- Как в Git создать новую ветку в условиях, когда что-то уже было изменено после последнего коммита
- Как в Git залить новую локальную ветку в удаленный репозитарий
- Git: Как подключить новую ветку с удаленного сервера
- Git: Как узнать текущую ветку
- Git: В чем разница между Fetch и Pull?
- GIT: Как исправить ошибочный комментарий к коммиту или файлы в коммите
- Как настроить git на использование proxy-сервера
- Использование Git через HTTP-proxy
- Настройка работы Git через Proxy-сервер
- Git через proxy
- Использование git за прокси с аутентификацией
- Как в Git смержить изменения до конкретного коммита?
- Самый удобный визуальный клиент Git под основные платформы — SmartGit
- Основы системы управления версиями Git для новичков на примере SmartGit
- Как сделать подключение к репозитарию Git через Socks Proxy в условиях отсутствия DNS
- Как сделать подключение к репозитарию Git через проксирующее SSH соединение
- Как работать с незавершенными изменениями в коде? Как их коммитить в Git?
- Как в Git посмотреть незакоммиченные изменения в текстах исходников?
- Как поместить на GitHub уже существующий репозитарий
- Что происходит при откате изменений через git reset —soft
- Не бойся хардресета! Он твой друг и помощник. (Как пользоваться git reset)
- Как пометить определенный коммит тегом версии
- Как в Git удалить файлы из индекса, не удаляя их в рабочей директории
- Как настроить GIT, чтобы при конфликте слияния он прописывал в файл не только различия, но и «базу» этих различий
- Git: Разрешение конфликтов объединений
- Git: Извлечение старой версии файла
- Git stash: временный отказ от проделанной работы
- Git: проверка состояния репозитария, поддержание репозитария в рабочем состоянии
- Как в Git отменить локальные изменения и получить новое состояние из удаленного репозитария
- Как искать изменения в нужных файлах с помощью интерфейса gitk?
- Как выбрать одну из версий бинарного файла при возникновнии конфликта слияния?
- Как в Git посмотреть старый коммит, а потом вернуться обатно к самому последнему коммиту
- Получение хеша последнего коммита и его даты в Git (для версионирования)
- Памятка по неочевидным деталям использования Git
- Как синхронизировать форк на Github с основным репозитарием через веб-интерфейс
- Как пользоваться GitHUb: форки, ветки, запросы на добавление кода
- Как отменить (сбросить) еще не закоммиченные изменения в Git
- Первоначальная настройка имени пользователя и Email в Git-проекте
- Можно ли принимать изменения через git pull если не закоммичены изменения рабочей директории
- Как посмотреть какие команды генерирует git gui
- Как удалить файл в Git-репозитарии с изменением истории
Git для начинающих. Урок 5.
История коммитов в подробностях
Краткое содержание урока, основные инструкции для командной строки, полезные ссылки и советы.
Для информации
Урок частично повторяет содержание предыдущего. Но в отличие от прошлого историю коммитов мы рассмотрим намного подробнее.
История коммитов
Сохранение истории изменений или история коммитов — одна из самых важных частей git. В истории сохраняются все коммиты, по которым можно посмотреть автора коммита, commit message, дату коммита и его хэш. А также можно увидеть измененные файлы и изменения в каждом файле. То есть git хранит буквально все, от самого начала проекта.
Команда git log
За просмотр истории коммитов отвечает команда git log. В сочетании с различными параметрами эта команда выводит историю по-разному. Есть много различных вариантов и комбинаций параметров, посмотрим некоторые из них
git log, просмотр истории по умолчанию
$ git log
Показывает все коммиты от новых к старым. Для каждого коммита выводится
- хэш
- автор
- дата
- сообщение (commit message)
git log -p, расширенный вывод истории
$ git log -p
Выводит то же, что и git log, но еще и с изменениями в файлах
git log —oneline, короткая запись
$ git log --oneline
Вывод коммитов в одну строку. Показывает только хэш коммита и commit message
git log —stat —graph, история в виде дерева
$ git log --stat --graph
Выводит коммиты в виде дерева, в командной строке псевдографикой. Плюс выводит список измененных файлов. К дереву коммитов мы вернемся, когда будем работать с ветками.
Сортировка и фильтрация истории
Есть множество команд, которые позволяют сортировать и фильтровать историю коммитов в командной строке. В том числе в сочетании с линуксовыми командами. Рассмотрим некоторые из них
Поиск по коммитам
Команда grep — мощный инструмент, который помогает работать в том числе и с git. Например, искать по коммитам
git log --oneline | grep revert # поиск упоминания revert git log --oneline | grep -i revert # независимо от регистра
Коммиты, затронувшие один файл
git log index.html
Поиск по автору
git log --author webdevkin
В опции —author можно указать имя или email, необязательно целиком, можно только часть.
Поиск по диапазону дат
Опции —after и —before задают начальную и конечную даты коммитов
git log --after='2020-03-09 15:30' --before='2020-03-09 16:00'
Комбинация команд и опций
Команды и опции git можно комбинировать и дополнять их линуксовыми командами
git log --author=webdevkin --oneline | grep footer # все коммиты от автора, в которых упоминается footer git log --oneline | wc -l # количество коммитов
Какие еще есть варианты
Мы рассмотрели базовые примеры, но в документации по git log есть много различных опций. Все их рассматривать нет смысла, при необходимости изучайте документацию.
git log --help
Просмотр отдельного коммита, git show
Чтобы просмотреть отдельный коммит, нужно узнать его хэш. Хэш коммита выводится в любой команде git log, с параметрами или без. Например,
$ git log --oneline 7b7d7fa Fixed footer 26812f9 Revert "Fixed footer" 0f90ae7 Revert "Fixed styles" . a1f3c45 Added footer a65aa43 Added new block students to main page 0b90433 Initial commit
Смотрим второй коммит
$ git show 43f6afc
Выводится подробная информация о коммите:
- хэш
- автор
- дата
- commit message
- список измененных файлов
- изменения в каждом файле
Короткий хэш коммита
Хэш коммита 40-символьный, но можно использовать короткую запись — первые 7 символов хэша. Команда git log —oneline выводит именно короткий хэш. Для других операций с коммитами достаточно использовать первые 4 символа. Например, 3 команды ниже покажут содержимое одного и того же коммита
$ git show 051f75475cb1dca3cd08c1c7367a3308671ccf7b $ git show 051f754 $ git show 051f
История коммитов в PhpStorm
В окне Local Changes, на вкладке Log показывается вся история коммитов, в левой половине вкладки. В списке коммитов показываются их commit message, автор и дата. Клик на нужный коммит откроет в правой части вкладки список измененных файлов. Клик на нужном файле и Ctrl/Cmd+D покажет все изменения в этом файле точно так же, как и git diff.
В тексте объяснить работу с историей в PhpStorm сложно, смотрите видеоурок.
Переключение на старый коммит, зачем это нужно
Нужно это обычно в двух случаях:
1. При неудачном деплое, когда вскрылась критичная бага. Если бага сложная и пофиксить ее быстро не удается, можно откатиться на рабочий коммит, задеплоить рабочую версию и уже потом чинить багу.
2. При отладке. Когда в код закралась бага и мы постепенно продвигаемся «назад в прошлое» и ищем, в какой момент что-то сломалось
Как переключиться на коммит в терминале
Первое — узнать хэш нужного коммита. Например, имеем такую историю
$ git log --oneline 7b7d7fa Fixed footer 26812f9 Revert "Fixed footer" 0f90ae7 Revert "Fixed styles" . a1f3c45 Added footer a65aa43 Added new block students to main page 0b90433 Initial commit
Хотим переключиться на предпоследний коммит. Коммиты идут в порядке убывания, поэтому нам нужен второй сверху — 26812f9. Переключаемся на него командой
$ git checkout 26812f9
Все, вернулись в прошлое. Проверим историю, теперь коммит, на который мы переключились — последний
$ git log --oneline 26812f9 Revert "Fixed footer" 0f90ae7 Revert "Fixed styles" . a1f3c45 Added footer a65aa43 Added new block students to main page 0b90433 Initial commit
Уйдем еще дальше, переключимся на первый коммит. Так как коммиты упорядочиваются по убыванию даты, то первый коммит — это последний в списке — 0b90433 Initial commit
$ git checkout 0b90433
$ git log --oneline 0b90433 Initial commit
Чтобы вернуться обрано, в исходное состояние, нужно набрать
$ git checkout master
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.
Спасибо за внимание и до встречи!
Все уроки курса
- Вводный урок
- 1. Установка и базовая настройка git
- 2. Создание и клонирование репозитория git
- 3. Делаем первые изменения, git status и git diff
- 4. Коммиты и история коммитов, git commit, git log и git show
- 5. Подробнее об истории коммитов. Путешествие по истории
- 6. Работа с сервером, git push и git pull
- 7. Ветки — главная фишка git, git branch и git checkout
- 8. Работа с ветками на сервере, git fetch
- 9. Слияния или мерджи веток, git merge
- 10. Конфликты и их разрешение
- Платная часть курса. Презентация
- * 11. Работа с gitignore и git exclude
- * 12. Буфер обмена git, git stash
- * 13. Копирование коммитов, git cherry-pick
- * 14. Отмена и редактирование последнего коммита
- * 15. Отмена произвольного коммита, git revert
- 16. Склеивание коммитов, git rebase —interactive и git reflog
- * 17. Зачем склеивать коммиты. Плюсы и минусы сквоша
- * 18. Работа с git rebase. Отличия от merge
- * 19. Что такое git push —force и как с ним работать
- * 20. Ищем баги с помощью git, git bisect
- * 21. Как и зачем работать с тегами git
- * 22. Процессы: github flow и git flow
- * 23. Псевдонимы в git
- 24. Мердж-реквесты
- * 25. Форки