Можно ли получить список ревизий, которые являются прямыми потомками A, которые являются прямыми предками B? Я пытаюсь git log A..B получить список ревизий, которые являются предками B, которых нет в истории A, что не совсем то, что мне нужно. Мне нужны только ревизии, которые напрямую связывают A и B.

1
eftshift0 22 Сен 2018 в 22:05

1 ответ

Лучший ответ

Да: добавьте --ancestry-path в спецификацию вашей редакции. (Это работает для любой команды, которая использует фиксацию-обход графика, включая git log и git rev-list.) Но я отмечу, что я не уверен, что вы имеете в виду под прилагательным "прямой" здесь.

Обратите внимание, что A..B означает B ^A, т.е. использовать набор ancestors(B) - ancestors(A) (где вычитание здесь - это вычитание множества). Добавление --ancestry-path означает, что после выполнения вычитания множества (или, точнее, при построении вычитаемого набора), Git также вычитает любую фиксацию, которая не является потомком отмененной ревизии A.

Внутри Git делает это, отмечая отрицательные хеш-идентификаторы фиксации (например, A в A..B или B ^A) флагом BOTTOM. Такие коммиты собираются в «нижний список», и Git следит за тем, чтобы каждая фиксация C , которая может находиться в диапазоне A..B, имела нижнюю фиксацию в качестве одного из своих предков. Это имеет значение, например, если вы используете git rev-list --ancestry-path X ^Y ^Z: коммиты могут быть потомками Y или Z. \


Вот пример фрагмента диаграммы, показывающий, какие коммиты выбраны () или не выбраны (), даже если они находятся "в диапазоне" A..B:

...--A--●---●--B--...
   \  \    /
    ○--●--●

Обратите внимание, что фиксация A не выбрана, а здесь выбрана фиксация B.

1
torek 22 Сен 2018 в 19:54