ответ setia_ остается наиболее подходящим, но ваш вопрос имеет смысл, потому что историю мерзавцев можно рассматривать с двух разных точек зрения: либо вы полностью рассматриваете ее как (математический) график, в котором порядок родителей должен быть незначительным, либо выРассматривайте операцию слияния как интеграцию внешней ветви в общую магистраль (т. е. текущую ветку, очень часто "master").Это также предположение, сделанное git merge
.
. Это важно не только потому, что просмотр экспоненциально растущего дерева быстро становится болью, но также и потому, что наличие ветки «master», содержащей готовый продукт, и интеграция внешнегоподчинения - это модель, за которой следуют многие рабочие процессы.
Поскольку обе эти точки зрения действительны, они заставляют --first-parent
быть часто используемым параметром, хотя не основной командой и не поведением по умолчанию.
Например, просмотр основного репозитория ядра Linux (для которого Git был впервые разработан) с простым git log --graph
может занять до одной минуты, прежде чем что-то отобразить, но git log --graph --first-parent
покажет вам основную ветвь и позволит вам заметить, чтов основном он состоит из слияний, со случайными прямыми коммитами.
Еще одна вещь, о которой нужно помнить, это то, что вы можете попросить отображать ваши коммиты в хронологическом порядке, используя --date-order
или топологическом порядке с --topo-order
.Предположим, у вас есть две разные ветви и, в качестве альтернативы, передайте одну или другую перед тем, как в конечном итоге объединить их.В зависимости от порядка результирующий график будет выглядеть следующим образом:
Chronological order Topological order
* ec9a124 Merge branch 'B' into A * ec9a124 Merge branch 'B' into A
|\ |\
* | e5314f2 Ninth | * e3e2435 Eighth
| * e3e2435 Eighth | * af3bac5 Sixth
* | 308228b Seventh | * 3a2f0b9 Fourth
| * af3bac5 Sixth | * d901c9f Second
* | ab11578 Fifth * | e5314f2 Ninth
| * 3a2f0b9 Fourth * | 308228b Seventh
* | 344bd0f Third * | ab11578 Fifth
| * d901c9f Second * | 344bd0f Third
|/ |/
* 0f029bc First * 0f029bc First
Все коммиты остаются на своей строке, но последний - это поиск в глубину.И поскольку git log
(как и git rev-list
) отображает коллекцию предварительно собранных ревизий, этот порядок будет одинаковым независимо от того, используете ли вы --graph
или отображаете их в виде плоского списка (фактически, если не указано, git log
использовать обратный хронологический порядок по умолчанию и топологический при использовании --graph
).
Из-за этого вы не можете просто полагаться на первую строку, чтобы решить, какого родителя выбрать.
Это также может привести к появлению некоторых старых коммитов перед новыми, что может очень запутать, начиная с Git, и создать впечатление, что ваша работа исчезла (до тех пор, пока не придет в голову выполнить поиск, а затем извлечьэто похоронено где-то в истории).