Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

Git. Почему родителями считаются более поздние коммиты?

#git #git_flow


Разбирался в основах Git и в главе, посвященной основам слияния  появился вопрос. 

Почему родителями считаются более поздние коммиты, расположенные в "кроне" графа
и стрелки идут к ним, а не от них?

Ведь по логике, они являются "слепками" с предыдущего состояния.

Например, используя эту картинку, объясняется слияние ветки hotfix в ветку master


  ветка, которую мы слили (*прим - hotfix), указывала на коммит, являющийся прямым
родителем коммита, на котором мы сейчас находимся (**прим - master), Git просто сдвинул
её указатель вперёд




И из этого описания получается, что С4 является родителем С2, хотя дело обстоит ровно
наоборот (С4 содержит parentId, который указывает на С2)
    


Ответы

Ответ 1



Подозреваю, что тут имеет место ошибка перевода. "Родительский коммит" это пометка внутри каждого коммита о том, какое состояние было до него, в формате коммит-хэша. Пометка необязательно одна. Может быть и ноль (для начального коммита) и больше одной (для слияния). Как правило, родительский коммит делается до потомка, но реально время на структуру графа коммитов не влияет, только вышеописанные "пометки". Нарушение этого скорее экзотика, но возможно. Касательно стрелочек сложилось два прямо противоположных стиля: Указывать их "вперёд", по ходу разработки, якобы так история выглядит понятнее и отражает последовательность разработки. Указывать их "назад", против хода разработки, т. к. коммиты технически сами указывают на родителей, а не наоборот, т. к. содержат в себе ссылки (коммит-хэши) на родителей. Какого-то предпочитаемого нет. Разве что там, где повествуют об устройстве Git, предпочитают второй стиль, как лучше соответствующий реальному устройству Git, а не удобной абстрактной картине к головах разработчиков.

Ответ 2



Номера указывают на верный хронологический порядок. C0 — это корень дерева, первый коммит. От него идут другие коммиты. Когда создается новый коммит, он получает указатель на текущий актуальный коммит, тот становится родителем нового коммита. Указатель — это строка из 40 символов хеша SHA-1. Разумеется, каждый коммит может быть родителем скольки угодно других коммитов. В мерж-коммитах может быть два или более родителя — несколько строк с SHA-1. Именно такой указатель изображается стрелочкой. По стрелочкам можно пройти до конца — корневого коммита. В редких специально созданных случаях корней может быть более одного — git позволяет сделать слияние двух несвязанных деревьев.

Комментариев нет:

Отправить комментарий