Стрелки направления в книге ProGit

Почему на всех изображениях, которые показывают очередь коммитов в Pro Git book, стрелки ведут в противоположном направлении?

Ответ 1

Чтобы показать родительское отношение. В Git конкретный фиксатор знает о его родительском (-ах), но не обязательно о его дочерних элементах. (Очевидно, что информация может быть получена на основе родительских ссылок, но я не думаю, что она хранится непосредственно в объекте commit.)

Ответ 2

Стрелки отражают направление, за которым следует DAG, Directed Acyclic Graph, представляющий здесь историю коммитов в Git (от самого последнего до самого старого).

Это представление не является "идеальным", так как Подробности Эрика Санка в его статье:

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

alt text

Итак, когда приходит время слияния с 5b на ветку (a), мы можем использовать информацию в DAG, чтобы знать, что 3b и 2b уже выполнены


В той же статье описывается предел этого представления:

Черрипикинг

Но DAG - это всего лишь одна реализация истории слияния, и это определенно не идеально.

Стрелка в контроле версий DAG переходит от дочернего к родительскому. Он сообщает нам, что ребенок содержит все изменения родительского. И его бабушка и дедушка. И его прадедушки. И так далее.

Но что, если это не так?

Рассмотрим следующее изображение:

alt text

Я хочу создать набор изменений 4.
Я хочу начать с changeet 1, а затем я хочу применить изменения из набора изменений 3, но НЕ того, что в наборе изменений 2.
Эту операцию иногда называют "черрипик". Я не хочу объединять все изменения из одной ветки в другую. Я просто хочу выщипывать один набор изменений (или одну часть набора изменений) и применять его как патч в другом месте.

Как мне представить это в DAG?

Я не могу.

  • Я мог бы нарисовать стрелку от 4 до 3 (показано выше красным цветом). Это правильно скажет, что 4 содержит изменения в 3, но НЕПРАВИЛЬНО утверждать, что 4 содержит изменения в 2.
  • ИЛИ, я не мог нарисовать стрелку. Фактически, моя история слияния просто не фиксирует тот факт, что 4 действительно 3 преобразован в патч и применяется к 1.

В любом случае, что-то плохое произойдет в следующий раз, когда я сливаюсь из одной ветки в другую:

  • Если я рисую эту стрелу, мне не дадут применить changeet 2, потому что история слияния полагает, что я уже сделал это.
  • Если я не рисую стрелку, инструмент ожидает, что я буду иметь дело с changeet 3, потому что нет истории слияния, записывающей тот факт, что я уже сделал это.

Ни одна из этих проблем не настолько катастрофична, чтобы делать вечерние новости, но все же.

Вот почему перестановка никогда не за горами после операции вишневого захвата, чтобы вернуть более классическую группу DAG.