Git Номера генерируемых цепей

Что такое git номера генерации фиксации (ссылка для hacker news) и каково их значение?

Ответ 1

Чтобы добавить к siri ответ, "Commit Generation Numbers":

Генерация фиксации - это ее высота в графике истории, так как измеренный от самого дальнего корня. Он определяется как:

  • Если у commit нет родителей, то его генерация равна 0.
  • В противном случае, его генерация на 1 больше, чем максимум поколений его родителей.
  • старая тема, уже упомянутая при создании Git в 2005 году:

Линус Торвальд (вчера, 14 июля):
Хорошо, поэтому я вижу, что старые обсуждения о числах поколений возродились.
И я должен сказать, что, используя шесть лет использования Git, я думаю, что не случайно совпадение понятий чисел поколений за несколько лет за последние годы: я думаю, что их отсутствие - буквально единственная реальная ошибка дизайна, которую мы делаем есть.
[...]
Это на самом деле появилось уже в июле 2005 года, поэтому "позволить использовать номера поколения в коммитах" действительно старо.

  • о вопросе быстро узнать, является ли фиксация предком другой фиксации (без необходимости повторять DAG - график коммиттов):

Я думаю, что вполне разумно сказать, что проблема в основном сводится к одному вопросу Git: "может совершить X быть предком совершить Y" (как способ в основном ограничить определенные алгоритмы от необходимости идти полным путем вниз). Мы использовали даты фиксации для него, и на самом деле он действительно работал очень хорошо. Но это всегда было сломанной эвристикой.

Так что да, я лично вижу счетчики генерации как способ правильного сравнения даты фиксации. И было бы прекрасно сказать: "Если нет номеров поколений, вместо них мы будем использовать даты и знать, что они могут быть неправильными".

То, что "использует datestamps", может быть связано с всей эвристикой, которую мы уже делаем (т.е. проверяем, что марки выглядят разумно, а не доверяют только одному индивидуальному).

Как говорится в новостной ленте 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 prod"
Я предполагаю, что запутанный аспект будет, если "r245 prod" на центральном сервере был "r100 prod" в моем локальном репо, потому что я не клонировал всю историю?

Ответ 2

Проблема (подразумеваемая в потоке на git @vger.kernel.org) заключается в том, что направление DAG, которое мы доверяем, подсчитывается в обратном направлении, от ветки ветки назад через родительское, Числа генерации (даже если они записаны в момент фиксации) подсчитываются через потомков. Плюс мы часто сталкиваемся с воспринимаемой историей в наших разных (распределенных) репозиториях - следовательно, все проблемы.


Просто прочитайте Linus последний, кроме его неправильного понимания переименований (я думаю, что Джордж Сэлвин соглашался с ним - не записывайте переименования в репо, просто сделайте снимки), он указывает, что:

самая простая конструкция git связана с неполным обходом DAG. Часть обхода DAG довольно очевидна и проста, но частичная вещь действительно очень важна ".

Таким образом, по существу, предварительно записанное число" генерации" фиксированного количества сообщит вам, как далеко (максимум) вы все равно должны идти в нижнюю часть (root), поэтому, если вы можете доверять ему, тогда вы можете сделать выбор о прекращении неполный обход DAG. Без этого вам придется пройти весь путь к корню, что неэффективно.

Итак, я думаю, что я передумал, теперь понимаю, что это критерии остановки. Это не означает, что некоторый (локально рассчитанный) кеш может не ускорить некоторые поиски.