Git Commit Numbers Generations Numbers
Что такое номера поколения git commit ( хакерская новостная ссылка) и каково их значение?
2 ответа
Просто добавьте к ответу Сири, "номера поколений коммитов":
Генерация коммита - это его высота в графе истории, измеренная от самого дальнего корня. Он определяется как:
- Если коммит не имеет родителей, то его генерация равна 0.
- В противном случае его поколение на 1 больше, чем максимум его родительских поколений.
- старая тема, уже упоминавшаяся при создании Git в 2005 году:
Линус Торвальд (вчера, 14 июля):
Хорошо, я вижу, что старая дискуссия о номерах поколений всплыла на поверхность.
И я должен сказать, что с шестью годами использования мерзавцев, я думаю, это не совпадение, что понятие чисел поколений встречалось несколько раз за эти годы: я думаю, что их отсутствие буквально является единственной реальной ошибкой проектирования, которую мы имеем.
[...]
На самом деле он появился еще в июле 2005 года, поэтому "давайте использовать номера поколений в коммитах" действительно устарели.
- о том, как быстро узнать, является ли коммит предком другого коммита (без необходимости возвращаться к DAG - графу коммитов):
Я думаю, что вполне разумно сказать, что проблема в основном сводится к одному git-вопросу: "может ли коммит X быть предком коммита Y" (как способ, по сути, ограничить определенные алгоритмы от необходимости проходить весь путь вниз). Мы использовали для этого даты фиксации, и реально это действительно сработало очень хорошо. Но это всегда была нарушенная эвристика.
Так что да, я лично вижу счетчики поколений как способ правильного сравнения дат фиксации. И было бы прекрасно просто сказать: "если нет номеров поколений, мы вместо этого будем использовать метки даты и знать, что они могут быть неверными".
Откат "использовать метки даты" может включать в себя всю эвристику, которую мы уже выполняем (то есть проверяем, выглядят ли марки в здравом уме, а не доверяют только одной отдельной).
Как упоминается в новостной ленте Hacker:
Номера поколений являются результатом состояния дерева, в то время как временные метки выводятся из окружающей (и потенциально неправильной!) Среды, из которой была сделана фиксация.
На данный момент каждый коммит хранит ссылку на родительское дерево.
Анализируя это дерево и читая всю историю, вы можете получить иерархию коммитов.
Поскольку вам нужно упорядочивать коммиты во многих ситуациях, чтение всей истории крайне неэффективно, поэтому git использует временные метки для определения порядка коммитов.
Это, конечно, не работает, если системные часы на данном компьютере выключены.
С номером поколения вы можете получить заказ локально из последних коммитов, не полагаясь на временные метки или читая все дерево.Когда у вас есть коммит с поколением
n
Любые последующие коммиты, которые включают это ранение, имеют поколение>n
так что, чтобы определить связь между коммитами, вам нужно только взглянуть назадn
, и вы можете сразу получить порядок любых промежуточных коммитов.
Это не имеет ничего общего с "легко запомнить". Это делает Git более эффективным и надежным
- не избыточно:
Номера поколений полностью избыточны с фактической структурой истории, представленной родительскими указателями.
Линус:
Не правда. Это верно только в том случае, если вы добавите "... если вы проанализируете всю историю" в этом утверждении.
И мы никогда не анализировали всю историю, потому что она слишком дорогая и не масштабируется. Так что сейчас мы зависим от дат коммитов с несколькими взломами.
Так что нет, номера поколений совсем не избыточны. Они фундаментальные. Вот почему мы обсуждали это шесть лет назад.
До сих пор ведутся споры относительно того, где кешировать эту информацию (или нужно ли ее кешировать), но с точки зрения пользователя, она по-прежнему касается некоторой "легко запоминающейся" информации (которая не является целью генерации коммитов). число):
Так что это почти, но не совсем, как номера ревизий, которые были у всех остальных?
Да, почти, но не совсем.
Если вы и я создадим ветку с коммитом с gen#123
то, насколько я понимаю, последующие коммиты в моей ветке будут#124
,#125
и т. д., и ваши коммиты в вашей ветке также будут#124
,#125
, так далее.Сравните это: - с CVS, где я бы
1.124.1.1
,1.124.1.2
и т. д., и вы бы1.124.2.1
,1.124.2.2
или - с Subversion, где я могу получить ревизии125
,128
, а также129
в то время как сервер дал ваши коммиты#124
,127
а также130
и кто-то еще, на совершенно другой части проекта получил#126
,Пока разработка идет линейно, в одной ветви, то да, речь идет о сохранении номеров ревизий в централизованном RCS - однако, как только вы начнете ветвление и слияние, оно представляет совершенно другую концепцию.
Для одного репозитория он имеет очень похожую интерпретацию, скажем, svn revnos.
Вы можете говорить о "ревизии #125 ветки" в конкретном репозитории. Как правило, это именно то, что вам нужно для человеческого общения о развитии.
"Можете ли вы увидеть, что эта ошибка в R125 нестабильной?" "У меня есть все изменения до R245 продукта"
Я предполагаю, что сбивающий с толку аспект был бы, если бы "r245 of prod" на центральном сервере был "r100 of prod" в моем локальном репо, потому что я не клонировал полную историю?
Проблема (как подразумевается в потоке на git@vger.kernel.org) заключается в том, что направление DAG, которому мы доверяем, учитывается в обратном направлении, от вершины филиала до происхождения. Номера поколений (даже если они записаны во время фиксации) подсчитываются через потомков. Кроме того, мы часто связываемся с воспринимаемой историей в наших различных (распределенных) репозиториях - отсюда и все проблемы.
Просто прочитайте последнюю версию Линуса, кроме того, что он неправильно прочитал о переименованиях (я думаю, что Джордж Спелвин с ним согласился - не записывайте переименования в репо, просто делайте снимки), он указывает, что:
самый базовый дизайн git - это неполный обход DAG. Часть прохождения DAG довольно очевидна и проста, но эта часть действительно очень важна ".
Таким образом, по существу, предварительно записанное число "генерации" фиксации скажет вам, как далеко (максимум) вам еще нужно пойти до дна (корня), поэтому, если вы можете доверять этому, то вы можете сделать выбор в пользу остановки неполного DAG ВТП. Без этого вам придется пройти весь путь до корня, что неэффективно.
Поэтому я думаю, что передумал, теперь я понимаю, что это критерий остановки. Это не значит, что некоторый (локально рассчитанный) кеш может не ускорить некоторые поиски.