Значение git log --oneline --graph вывод - PullRequest
0 голосов
/ 20 мая 2018

Я изучаю относительные ссылки коммитов и пытаюсь понять следующий вывод git log --oneline --graph, представленный в уроке.

git graph

В урокеон говорит, что, учитывая, что HEAD указывает на коммит 9ec05ca, HEAD ^^^ (что означает коммит прародителя) является коммитом 0c5975a.Но мне кажется, что 1011 * должен быть прародителем, если каждый SHA является прямым потомком того, кто находится под ним.Любые разъяснения приветствуются.

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

ответ 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, и создать впечатление, что ваша работа исчезла (до тех пор, пока не придет в голову выполнить поиск, а затем извлечьэто похоронено где-то в истории).

0 голосов
/ 20 мая 2018

Фиксация может иметь более одного родителя.^ 1 означает первый родитель.^ 2 означает второго родителя и делает дальше.Просто ^ по умолчанию равен ^ 1, который является первым родителем.

Точно так же ~ дают доступ для перехода по предку.Например, если вы хотите 3 поколения до ~ 3.Если вы хотите 7-й последний коммит в той же ветке, предпочитающий первого родителя при обходе.

У любого слияния будут два родителя, и слияние с ветвью станет первым родителем.Слияние из ветви становится вторым родителем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...