Git совершить заказ родителей

Есть ли какое-то соглашение о порядке родителей коммита?

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

Я хочу идентифицировать предыдущую фиксацию текущей ветки, я использую pygit, который возвращает список родителей для фиксации, и интуитивно я подумал, что, возможно, порядок родителей имеет значение, но я не нашел явного упоминания об этом.


Я написал эту служебную функцию, используя first parent commit для обхода ветки:

def walk_branch(pygit_repository, branch_oid):
    """
    Walk a single branch
    """
    from pygit2 import GIT_SORT_TOPOLOGICAL
    previous_first_parent_oid = None
    for commit in pygit_repository.walk(branch_oid, GIT_SORT_TOPOLOGICAL):
        if previous_first_parent_oid is None or commit.oid == previous_first_parent_oid:
            previous_first_parent_oid = commit.parents[0].oid if len(commit.parents) else None
            yield commit

person Emil Davtyan    schedule 18.08.2013    source источник
comment
Я не знаю о libgit2 и pygit2, но первым родителем всегда является тот, который находится в ветке, в которой вы находились, когда делали git merge. Это тот, который --first-parent извлекает, и он первый в необработанных выходных данных git cat-file -p somerev. Остальные родители — это ветки, из которых были объединены.   -  person torek    schedule 18.08.2013
comment
Спасибо, я не знал о первом родительском термине.   -  person Emil Davtyan    schedule 18.08.2013


Ответы (4)


libgit2 и его привязки возвращают родителей в том порядке, в котором они хранятся в коммите, что является порядком коммитов, как они были даны, например. командная строка для git merge, и это константа, что первый родитель является текущей фиксацией при создании новой (через слияние или обычный git commit).

Чтобы определить предыдущую фиксацию фиксации (во времени), все, что вам нужно сделать, это посмотреть на первого родителя. Находятся ли они в одной и той же ветке или нет, вы не можете видеть из этого, поскольку родитель коммита может быть в другой ветке (что и вызывает ветки), но вы можете провести прямую линию (например, эти git log --graph --oneline рисует) .

person Carlos Martín Nieto    schedule 18.08.2013
comment
Благодарю за разъяснение. - person Emil Davtyan; 18.08.2013

Да, если вы объедините A с B, первый родитель будет B, а второй — A.

Поэтому вы можете делать такие вещи, как gitk --first-parent, чтобы показать историю только текущей ветки без подробностей объединенных ветвей.

person michas    schedule 18.08.2013

Любой родитель после первого родителя представляет слияние из другой ветви по крайней мере с одним исключением.

Если вы объедините ветку саму с собой, что обычно происходит, когда она обрабатывается в двух местах отдельно, а затем интегрирована, одна из этих «ветвей» в ветке будет выглядеть так, как будто она возникла из ниоткуда.

Это будет отображаться, если вы пройдете по всем родителям всех ветвей листьев, но такие ветви внутри ветвей не появятся, если вы пройдете линейную историю всех ветвей листьев. Это, по крайней мере, все еще правильно в том смысле, что вы будете проходить только линейную историю коммитов, которые были объединены. Что будет скрыто, так это тот факт, что есть ветка внутри ветки, поэтому она не будет отображать всю историю, эксклюзивную для этой ветки.

Я не знаю, имеет ли удаление веток такой же эффект.

person jgmjgm    schedule 27.09.2017

Первый родитель не всегда такой, как вы ожидали, как предыдущая текущая ветвь. См. ссылка

person Bruce Zu    schedule 09.07.2020