(Кстати, спасибо за сценарий репродуктора - он был чрезвычайно полезен здесь.)
Порядок изменился в прошлом, но в целом он генерируется при запуске git rev-list
(сестринская командаgit log
, который по умолчанию выдает только хэш-идентификаторы).Поскольку хэш-идентификаторы трудны для людей, обычно проще использовать git log
, чтобы увидеть порядок.
В этом случае порядок был следующим:
$ git log --oneline --reverse --no-merges master..topic
5ff52aa C4
aefbb19 C2
0363c27 C5
90aaf5d C3
f953082 (topic) C7
Однако, если мы добавим --topo-order
, который git rebase
делал в различных более старых версиях Git, мы получаем:
$ git log --oneline --reverse --topo-order --no-merges master..topic
aefbb19 C2
90aaf5d C3
5ff52aa C4
0363c27 C5
f953082 (topic) C7
Фактический порядок основан на отметках времени коммита в случае, когда на выбор доступно более одного активного коммита.То есть Git выполняет ревизионную прогулку, начиная с tip commit назад.Всякий раз, когда происходит слияние, Git помещает всех родителей в очередь приоритетов, увеличивая количество посещений коммитов.Порядок сортировки по умолчанию для приоритетной очереди основан на отметке времени коммиттера.Так как git rebase
не устанавливает никаких других приоритетов, это тот, который используется.
(Порядок new-ish, не отсортированный по топологии является результатом внутренней команды new-ish git rebase--helper
, впервые появившаяся в Git версии 2.13. Слияние, «сохраняющее» - действительно воссоздающее, - вариант git rebase -p
по-прежнему использует топологическую сортировку. Причудливая новая метка git rebase -r
не требует топосортировки.)