Почему Git использует SHA-1 как номера версий?

Git использует SHA-1 для того, чтобы пользователь мог передать фиксацию.

Subversion (SVN) и Mercurial (hg) используйте инкрементное число.

Почему команда Git сделала это дизайнерское решение по использованию SHA-1 вместо чего-то более описательного?

Ответ 1

Mercurial (hg) также использует хеши SHA1. Он просто пытается получить ревизионные номера из истории фиксации. Однако эти изменения действительны только в одном хранилище. Если вы смотрите другое репо, эти изменения не гарантируются.

Что касается причин использования git и хеширования использования ртути: оба имеют нелинейную историю фиксации. поскольку оба распределены, люди могут работать на одной и той же кодовой основе в своих локальных хранилищах, не синхронизируясь с центральным органом (как это требуется SVN и CVS). Теперь, если люди локализуют свои материалы и затем объединяют их, вам будет сложно найти согласованную схему, чтобы сформировать линейно увеличивающиеся целочисленные ревизии. И даже если бы вы могли, у вас все равно был бы другой результат между различными репозиториями.

В конце концов, все это из-за распределенного характера. Это простой способ придумать довольно уникальные идентификаторы для фиксации. И в качестве побочного продукта вы также можете кодировать всю историю в виде одной фиксации в хеш. Это означает, что даже если у вас такая же разница в фиксации, вы, вероятно, получите разные хэши SHA1.

Ответ 2

Он использовался как метод идентификации фиксации и проверки. Номер SHA1 является контрольной суммой всех изменений, внесенных в commit, плюс имя автора плюс SHA1 родительского коммита. (и IIRC он также включает сообщение фиксации, но не уверен, хотя).

Когда вы вытаскиваете/извлекаете с удаленного устройства, git проверяет контрольную сумму на файлы, полученные вами, чтобы убедиться, что вы не получили поврежденную или измененную версию кода.

Ответ 3

Git и HG используют SHA1 для определения коммитов. SVN управляет последовательной моделью изменений и поэтому может поддерживать инкрементный номер версии, тогда как Git и HG гораздо более сложны и поддерживают ориентированную ациклическую графовую модель развития, которая намного более подвержена частым ветвящимся и сливающимся.

Инкрементное значение HG отличается от инкрементного номера SVN и не подходит для ссылки на конкретную ревизию в разных копиях репозитория, поэтому не может использоваться так же, как номер версии SVN.