Это не один и тот же коммит дважды. Это два разных коммита.
Идентификатор коммита равен его хэш-идентификатору. Два хеш-идентификатора, которые вы перечислили:
5191cdba6da69bceea29c9c0231f2b17dffda620
.
Этот коммит имеет один родительский коммит, 389975b56cf4e5db190c1ed67fe7dab0363cb62f
.
e41b0c40501ea8906fcbdcc7d37ff6ef0cd5cf02
.
Этот коммит имеет два родительских коммита. Первый из них - 8aa78399c3f9650ae9ac7db0f0fc520e11f3be6a
, а второй - 5191cdba6da69bceea29c9c0231f2b17dffda620
, т.е. второй родитель второго коммита, о котором вы спрашивали, - это первый коммит, о котором вы просили.
То есть, как прокомментировал Чороба , первый из них - это коммит, который внес некоторые изменения, а второй - коммит слияния, который авторы репозитория использовали для объединения первый коммит в их коллекции коммитов.
Каждый коммит в Git имеет один из этих хеш-идентификаторов, и хеш-код каждого коммита уникален. 1 Вот почему эти вещи такие длинные и такие уродливые: Git требуется гарантия что эти хэш-идентификаторы теперь не только уникальны по сравнению с каждым коммитом, когда-либо сделанным за последние десять лет (см. сноску 1), но также и с каждым коммитом, когда-либо сделанным от до в течение следующих десять тысяч лет (опять же, см. Сноску 1). Обратите внимание, что идентификатор хеша вычисляется путем выполнения криптографической контрольной суммы для данных , содержащихся в коммите , так что он не только уникально идентифицирует коммит, но и действует как проверка, чтобы убедиться, что никто не отравлен содержание: изменение даже одного бита данных в пределах при фиксации приводит к совершенно новому и другому хэш-идентификатору.
Поскольку хэш-идентификаторы большие и некрасивые, люди обычно не используют их напрямую. Мы используем такие вещи, как имена ветвей - которые записывают один хеш-идентификатор, но этот хеш-идентификатор развивается так, что он всегда означает последний коммит в ветви - или имена тегов. Имена тегов записывают один хэш-идентификатор и, по крайней мере, намеренно, никогда не меняют, какой хэш-идентификатор они записывают (т. Е. Они меняются, только если человек, управляющий тегом, злонамеренный или капризный).
Учитывая коммит, который содержит хэш-идентификаторы его родительского коммита или коммита, Git может найти родителей. Эти родители также содержат хэш-идентификаторы их родителей, поэтому Git может найти бабушку и дедушку. Эти бабушки и дедушки содержат хеш-идентификаторы, поэтому Git может найти больше предков. Это означает, что при наличии одного хеш-идентификатора коммита, Git может найти всего предка этого коммита , назад к началу времени (ну, из-за цепочки времени для этой фиксации). Следовательно, если вы дадите Git список идентификаторов хеша коммитов каждой ветви и тега в репозитории , Git сможет найти все коммитов в этом репозитории, пройдя по этим родительским цепочкам. И это все содержимое хранилища, за исключением вспомогательных данных, таких как повторные журналы веток (которые являются частными для одного хранилища, не передаются между клонами).
1 Точнее, это требование уникальности выполняется только в репозиториях, которые будут объединены. То есть некоторый конкретный идентификатор хеша может быть повторно использован для двух разных коммитов, но , только если вы никогда не захотите объединить оба этих коммита в один репозиторий. Прогнозирование, какие коммиты когда-либо попадут в какой репозиторий слишком сложно: гораздо проще просто добавить больше битов в хэш-идентификатор.
Хэши SHA-1, которые в настоящее время использует Git, используют 160 бит, и этого постепенно оказывается недостаточно, 2 , поэтому у пользователей Git есть план миграции, который увеличит его до 256 бит. Это немного испортит концепцию «один уникальный хэш-идентификатор на коммит»: вместо этого будет один уникальный хэш-идентификатор, использующий либо старый, либо новый стиль. Если это новый стиль, у коммита будет второй хэш-идентификатор старого стиля, который используется для совместимости, но используется только для идентификации коммита в случае чрезвычайной ситуации, когда отсутствует новый, т. Е. При разговоре с Git, который не понимает идентификаторы нового стиля.
2 Недостаточно не потому, что недостаточно битов для уникальной нумерации каждого атома во вселенной, а скорее потому, что, бросая достаточную вычислительную мощность на проблему, плохие субъекты могут генерировать преднамеренные коллизии хешей.